0

我正在构建一个简单的 3d 框架,并且在将投影矩阵应用于向量时遇到了问题。

这是我正在使用计算我的透视项目的代码:

var t = near * Math.tan(fov * Math.PI / 180);
var n = far - near;

//  width   height      near                         far
this.setValues( near / (t * aspect),    0,             0,                  0,
                        0,           near / t,         0,                  0,
                        0,              0,      -(far + near) / n, -(2 * far * near) / n,
                        0,              0,            -1,                  1 );

然后将我的投影应用于我的向量,如下所示:

var w = 1 / ( x * e[3] ) + ( y * e[7] ) + ( z * e[11] ) + e[15];

this.x  = (x * e[0] + y * e[4] + z * e[8] + e[12]) * w;
this.y  = (x * e[1] + y * e[5] + z * e[9] + e[13]) * w;
this.z  = (x * e[2] + y * e[6] + z * e[10] + e[14]) * w;

问题是向量总是会变成 [ X: NaN Y: NaN Z: -Infinity ]。

我不明白为什么它不返回数值?这就是计算出的投影矩阵如下所示。

 -----------------
 | 0.5570236439499305, 0, 0, 0 |  
 | 0, 1.0000000000000002, 0, 0 | 
 | 0, 0, -1.0618556701030928, -61.855670103092784 |
 | 0, 0, -1, 1 | 
 ----------------- 
4

2 回答 2

0

你得到NaNs 和Infinitys - 检查你所有的变量,并确保你没有得到任何非数字。除以 0 (带负数)将返回-Infinity,因此您的某些值会导致该结果。

于 2013-08-13T16:53:29.263 回答
0

我设法通过将矢量投影代码更改为以下内容来解决此问题:

var w = ( x * e[3] ) + ( y * e[7] ) + ( z * e[11] ) + e[15];

this.x  = (x * e[0] + y * e[4] + z * e[8] + e[12]) / w;
this.y  = (x * e[1] + y * e[5] + z * e[9] + e[13]) / w;
this.z  = (x * e[2] + y * e[6] + z * e[10] + e[14]) / w;

从 w 计算中删除 / 1 似乎解决了这个问题。

于 2013-08-14T15:24:24.137 回答