Javascript 三维法线/从Euler角度看向量
我正在开发一个类似JavaScript/Canvas 3D FPS的引擎,迫切需要一个法线向量(或者,如果愿意,可以查看向量)来进行近平面和远平面剪裁。我有x轴和y轴的旋转角度,并且能够很容易地做到这一点,只有一个在同一时间,但我只是不知道如何获得这两个 我们的想法是使用这个向量来计算相机前面的一个点,近剪裁平面和远剪裁平面也必须由常数定义,所以向量必须被规范化,我希望只有角度才有可能在不规范化的情况下将这个向量长度设为1,但这不是问题所在 我没有任何滚动(绕z轴旋转),所以这就容易多了 我的数学是这样的:Javascript 三维法线/从Euler角度看向量,javascript,3d,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+正常.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中。经过一番密集的大脑处理后,我发现了
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。你知道我在哪里可以找到你在这个答案上写的公式的广义版本吗?我和你们一样,把物体的欧拉角转换成法向坐标。非常感谢。