Java/C++;-从相机偏航(航向)和俯仰(无横摇)获取3d线

Java/C++;-从相机偏航(航向)和俯仰(无横摇)获取3d线,java,c++,math,3d,Java,C++,Math,3d,我知道四元数的方法可以做到这一点。但最终,这些方法要求我们将所有相关对象转换为相机的旋转“空间” 然而,从数学上看,我确信一定有一种简单的方法可以得到一条直线的XY、YZ和XZ方程,它只基于相机的偏航(航向)和俯仰 例如,给定视锥的法线,例如(sqrt(2),sqrt(2),0),可以轻松地为XY平面构造线(x+y=0)。但一旦Z(在本例中,Z用于深度,而不是GL的Y坐标置乱)发生变化,计算就会变得更加复杂 此外,给定应用旋转的顺序:偏航、俯仰、滚转;“滚动”根本不会影响视图平锥的法线 所以我的

我知道四元数的方法可以做到这一点。但最终,这些方法要求我们将所有相关对象转换为相机的旋转“空间”

然而,从数学上看,我确信一定有一种简单的方法可以得到一条直线的XY、YZ和XZ方程,它只基于相机的偏航(航向)和俯仰

例如,给定视锥的法线,例如(sqrt(2),sqrt(2),0),可以轻松地为XY平面构造线(x+y=0)。但一旦Z(在本例中,Z用于深度,而不是GL的Y坐标置乱)发生变化,计算就会变得更加复杂

此外,给定应用旋转的顺序:偏航、俯仰、滚转;“滚动”根本不会影响视图平锥的法线

所以我的问题很简单。如何从三坐标视图法线(即归一化,即向量长度为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
也可以构造该线的二维投影:

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

我认为这是正确的。如果有人记下不正确的加号/减号,请告诉我。

空间是三维的。要正确映射眼睛在空间中的方向,需要三个二维直线方程:x,y;x、 z;y、 z。将偏航和俯仰转换为直线不需要矩阵乘法。在计算机图形学中,直线通常由(1)直线上的一个点和一个方向或(2)直线上的两个点表示。我在图形学领域工作了20年,从未使用过三个二维方程式。用俯仰和偏航来描述方向就是将其描述为一对旋转的组合。矩阵便于组合旋转。但是你不需要实际使用任何矩阵。只需使用我给出的链接中的单个元素的公式。我已经成功地找到了像这样的相机方向向量100次了。这很公平,但是提供一个链接,你可以自己回答这个问题,这和回答它是不一样的。我并没有简单地提供一个链接。我描述了如何从矩阵中读取所需的信息以及一系列其他信息,并为您提供了到矩阵的链接。我把你的问题提出来了吗?如果没有,告诉我哪一点你不明白,我会提供更多的咨询服务而不期望得到回报。你也不必回答。你选择了尝试回答。所以我认为你已经尽力了。谢谢你的努力。