从欧拉角计算3D法线/观察向量

3
我正在开发一个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效果。


如果你给我三个点A、B、C,构成两个向量(AB和BC),我可以使用叉积得到一个法向量...这样有帮助吗? - dustmachine
@dustmachine:不,我需要从欧拉角X和Y旋转角度得到的观察向量,没有其他数据。 - Solenoid
1个回答

3

经过一番深思熟虑,我发现:

  1. 我的原始观察向量是 (0, 0, 1)
  2. z-旋转角(滚动)总是为 0
  3. 维基百科上找到的旋转矩阵没有不起作用的理由

通过将完整的旋转矩阵应用于 (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,这改变了矩阵的一点。


你好,我正在尝试做完全相同的事情,只是我的滚动角度从未为0。您知道在哪里可以找到您在此答案中编写的公式的通用版本吗?像您一样,我想将对象的欧拉角转换为正常坐标。谢谢。 - Marco Beccarini

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接