Javascript 三维法线/从Euler角度看向量

Javascript 三维法线/从Euler角度看向量,javascript,3d,Javascript,3d,我正在开发一个类似JavaScript/Canvas 3D FPS的引擎,迫切需要一个法线向量(或者,如果愿意,可以查看向量)来进行近平面和远平面剪裁。我有x轴和y轴的旋转角度,并且能够很容易地做到这一点,只有一个在同一时间,但我只是不知道如何获得这两个 我们的想法是使用这个向量来计算相机前面的一个点,近剪裁平面和远剪裁平面也必须由常数定义,所以向量必须被规范化,我希望只有角度才有可能在不规范化的情况下将这个向量长度设为1,但这不是问题所在 我没有任何滚动(绕z轴旋转),所以这就容易多了 我的数

我正在开发一个类似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+正常.x*zNear,
y:position.y+normal.y*zNear,
z:position.z+normal.z*zNear};
//在x、y、z处相对于近剪裁平面测试一个点
如果(
(近平面x-x)*法线x+
(近平面y-y)*法线y+
(近平面z-z)*法线z<0
)
{
返回;
}
//然后将3D点投影到屏幕上
当一个点在玩家后面时,它的投影坐标是反向的(x=-x,y=-y),所以没有任何意义了,这就是为什么我要删除它们


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

经过一番密集的大脑处理后,我发现了

  • 我最初对向量的看法是(0,0,1)
  • z旋转角度(滚动)始终为0
  • 在上找到的旋转矩阵没有不起作用的原因
  • 通过在(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,这稍微改变了矩阵。

    如果你给我3个点a、B、C组成两个向量(AB和BC),我可以使用叉积得到法线。。。这会有帮助吗?@dustmachine:不,我需要从Euler x和y旋转角度看向量,我没有任何其他数据。嗨,我正试图做同样的事情,只是我的滚动永远不会是0。你知道我在哪里可以找到你在这个答案上写的公式的广义版本吗?我和你们一样,把物体的欧拉角转换成法向坐标。非常感谢。