来自欧拉角的3D法线/观察矢量

时间:2011-09-16 22:24:23

标签: javascript 3d

我正在开发一个类似JavaScript / Canvas 3D FPS的引擎,并且迫切需要一个法线向量(或者如果你愿意的话,看看向量)用于近距离和远距离剪裁。我有x轴和y轴的旋转角度,并且当时只有其中一个可以轻松完成,但我无法弄清楚如何获得它们......

这个想法是使用这个向量来计算摄像机前面的一个点,近和远剪裁平面也必须由常数定义,所以向量必须被标准化,我希望它只有角度它会可以将此向量长度设置为1而不进行标准化,但这不是问题。

我没有任何滚动(围绕z轴旋转)所以它更容易。

我的数学看起来像这样:

zNear = 200; // near plane at an arbitrary 200 "points" away from camera position

// normal calculated with only y rotation angle (vertical axis)
normal = {
    x: Math.sin(rotation.y),
    y: 0,
    z: Math.cos(rotation.y)};

然后通过点积测试从平面到它的矢量,在3D空间中剪切一个点。

nearPlane = {
    x: position.x+normal.x*zNear,
    y: position.y+normal.y*zNear,
    z: position.z+normal.z*zNear};

// test a point at x, y, z against the near clipping plane
if(
    (nearPlane.x-x)*normal.x+
    (nearPlane.y-y)*normal.y+
    (nearPlane.z-z)*normal.z < 0
)
{
    return;
}

// then project the 3D point to screen

当一个点位于玩家后面时,它的投影坐标会反转(x = -x,y = -y),所以没有任何意义,这就是我试图删除它们的原因。

enter image description here

我想要那个绿色箭头,但是在3D中。

1 个答案:

答案 0 :(得分:2)

经过一些强化脑部处理后,我发现了

  1. 我原来的外观矢量是(0,0,1)
  2. z旋转角度(滚动)始终为0
  3. 没有理由在Wikipedia上找到旋转矩阵无法正常工作
  4. 通过在(0,0,1)向量上应用完整的旋转矩阵并考虑到rz = 0,我得到的解是:

    normal = {
        x: Math.cos(camera.rotation.x)*Math.sin(camera.rotation.y),
        y: -Math.sin(camera.rotation.x),
        z: Math.cos(camera.rotation.y)*Math.cos(camera.rotation.x)};
    

    现在一切都很完美。错误只使用了x和y旋转矩阵,而没有考虑rz = 0的所有角度都改变了矩阵。