Java / C ++ - 从Camera偏航(航向)和俯仰(无滚动)获取3d线

时间:2012-04-12 20:14:53

标签: java c++ math 3d

我知道Quaternion这样做的方法。但最终这些方法要求我们将所讨论的所有对象转换为Camera的旋转“空间”。

然而,看看数学,我肯定必须有一种简单的方法来获得基于YAW(航向)和摄像机PITCH的直线的XY,YZ和XZ方程。

例如,给定视图截面的法线,例如(sqrt(2),sqrt(2),0),您可以轻松地为XY平面构造线(x + y = 0)。但是一旦Z(在这种情况下,Z用于深度,而不是GL的Y坐标加扰)发生变化,计算就变得更加复杂。

另外,给定旋转的顺序:偏航,俯仰,滚动; roll根本不会影响视图截头的法线。

所以我的问题非常简单。我如何从3坐标视图法线(即标准化,即矢量长度为1)或偏航(弧度),俯仰(弧度)与一组三个线方程对,映射方向通过太空'眼睛'?

注:

Quaternions我在这方面取得了成功,但数学对于模拟中的每个实体来说都太复杂了以进行视觉检查,同时必须检查所有可见对象,即使进行各种检查以减少可查看的数量对象。

2 个答案:

答案 0 :(得分:2)

使用popular methods中的任何一个从偏航和俯仰构造矩阵来表示相机旋转。矩阵元素现在包含各种有用的信息。例如(当使用通常的表示时)第三列的前三个元素将指向视图矢量(根据您正在使用的惯例进入或离开相机)。第二列的前三个元素将指向相对于相机的“向上”。等等。

然而,很难自信地回答你的问题,因为你说的很多事情对我来说都没有意义。例如,我不知道“通过空间映射'眼睛'方向的一组三线方程”意味着什么。如上所述,眼睛方向简单地由矢量给出。

答案 1 :(得分:1)

 nx = (float)(-Math.cos(yawpos)*Math.cos(pitchpos));
 ny = (float)(Math.sin(yawpos)*Math.cos(pitchpos));
 nz = (float)(-Math.sin(pitchpos)));

这可以获得相机的法线。这假设偏航和俯仰是弧度。

如果您拥有相机的位置(px,py,pz),您可以获得参数方程式:

x = px + nx*t
y = py + ny*t
z = pz + nz*t

您还可以构建此行的2d投影:

0 = ny(x-px) + nx(y-py)
0 = nz(y-px) + ny(z-pz)
0 = nx(z-pz) + nz(x-px)

我认为这是正确的。如果有人注意到错误的正/负号,请告诉我。