我正在开发一个JavaScript/Canvas 3D FPS引擎,急需一个法向量(或者说是“视线方向”)来进行近和远平面裁剪。我已经有了x和y轴旋转角度,并且能够只使用其中之一来进行裁剪,但我无法弄清如何同时得到它们两个的值。
我需要用这个向量来计算相机前方的一个点,而且近和远平面必须可以由常数定义,因此这个向量必须被归一化。我希望只用角度就能使这个向量长度为1,但这不是问题所在。
由于我的旋转没有绕z轴的旋转,因此会更加容易。
我的公式如下:
我需要用这个向量来计算相机前方的一个点,而且近和远平面必须可以由常数定义,因此这个向量必须被归一化。我希望只用角度就能使这个向量长度为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),因此再也无法理解它的意义,这就是为什么我想要将其去掉。
我想要那个绿色箭头,但是要呈现为3D效果。