Graphics 在给定目标点和相机前方的情况下,是否可以从角度和旋转轴计算camera.lookAt函数?

Graphics 在给定目标点和相机前方的情况下,是否可以从角度和旋转轴计算camera.lookAt函数?,graphics,three.js,linear-algebra,Graphics,Three.js,Linear Algebra,我试图理解three.js的camera.lookAt函数,并实现我自己的函数 我使用的是眼睛=相机位置,目标=目标注视点,向上总是(0,1,0)。一位朋友提出,旋转相机以观察空间中的一个点的明显方法是通过计算目标眼睛获得所需的前向,并计算相机的前向矢量(0,0,-1)和目标前向之间的角度(使用所述的atan2方法),这就是旋转角度。我可以通过计算正向向量和期望的正向向量的叉积来找到旋转轴。我想用一个函数来得到四元数 尝试在此处绘制: 这在理论上可行吗?当使用eye、up和target的标准方

我试图理解three.js的camera.lookAt函数,并实现我自己的函数

我使用的是眼睛=相机位置,目标=目标注视点,向上总是(0,1,0)。一位朋友提出,旋转相机以观察空间中的一个点的明显方法是通过计算目标眼睛获得所需的前向,并计算相机的前向矢量(0,0,-1)和目标前向之间的角度(使用所述的atan2方法),这就是旋转角度。我可以通过计算正向向量和期望的正向向量的叉积来找到旋转轴。我想用一个函数来得到四元数

尝试在此处绘制:


这在理论上可行吗?当使用eye、up和target的标准方法对其进行测试时,z=(eye-target),x=Cross(up,z),y=Cross(x,z)--(还有,为什么它是eye-target而不是target-eye?),我看到了很小的差异(<0.1)。我个人认为
three.js
's
Matri4.lookAt()
方法有些混乱。它也在错误的类中,应该放在
Matrix3
中。总之,在<代码> MthgGeLoBi中,可以找到更清晰的实现,这是一个用于计算机图形的线性代数和几何处理的C++库。

lookAt()
方法应首先为对象的局部空间构建正交线性基A(
localRight
localUp
localForward
)。然后它为所需的目标方向构建正交线性基B(
worldRight
worldUp
targetDirection
)。
lookAt()
的主要任务是从A基映射到B基。这是通过将
m1
(B基)与
m2
(A基)的倒数相乘来完成的。由于该矩阵是正交矩阵,因此通过简单的转置计算逆矩阵

m1.makeBasis( worldRight, worldUp, targetDirection );
m2.makeBasis( localRight, localUp, localForward );

this.multiplyMatrices( m1, m2.transpose() );
引用3x3矩阵类的实例


<>我建议你仔细研究有充分记载的C++代码,以便理解方法的每一步。谢谢你,这是一个很好的解释和例子。我实际上感觉我理解了查找函数,以及它是如何计算摄像机的正交基的。我最想知道的是,为什么同样的事情不能通过获取默认相机前向矢量和所需前向矢量(目标-眼睛)之间的角度和旋转轴来实现。