我一直试图理解transform.LookAt()函数背后的数学(三角学和线性代数)。我遵循了一个教程,并试图修改它以满足我的需要,但到目前为止我还没有成功。
我试图实现一个相机(在3d空间),它是跟随一个播放器的自定义偏移,但同时,用户可以缩放相机的所有,同时仍然有那个Vector3偏移量。我还锁定了其他的轴,只想把旋转应用到X轴。我的脚本的问题是,角度似乎夹在45°和90°学位之间。我想我错过了什么
private void LookAt(Transform t)
{
Vector3 forward = _camPos - (t.position + new Vector3(0, t.GetComponent<CapsuleCollider>().height / 2, 0));
Debug.DrawRay(forward, -forward, Color.blue);
Vector3 right = Vector3.Cross(target.up, forward);
Debug.DrawRay(forward, right, Color.magenta);
Vector3 newUp = Vector3.Cross(Vector3.forward, right);
Debug.DrawRay(forward, newUp, Color.yellow);
float angle = Mathf.Atan2(forward.magnitude, newUp.magnitude) * Mathf.Rad2Deg;
mainCam.transform.rotation = Quaternion.Euler(angle, 0, 0);
}正如你所看到的,矢量计算就像截图一样。
前向、右和newUp向量

不过,只有当我降低变焦率时,相机才能正确地聚焦到字符上,也就是说,a将相机移近它:
一段距离后只看目标(正确)

我遗漏了什么?非常感谢你的帮助!
发布于 2022-10-28 11:16:26
提供一个实际的答案。看起来,你得到了正确的想法,即在观察方向和任意向上向量之间取交叉乘积,然后再取一个交叉乘积,以确保所有向量是正交的。我不确定我是否确切地理解了偏移量的作用,但我认为它是按预期工作的。我会做几件事:
我非常喜欢将旋转处理为向量、四元数或矩阵。我发现欧拉角混淆和难以使用,因为有多个变体应用不同的旋转顺序,它们是难以可视化的。
旋转矩阵(即3x3)实际上只是三个正交向量,这也是显示矩阵的超级有用的方法。我认为每个向量应该对应于矩阵中的一行,但我不熟悉统一,而且惯例可能是不同的。
4x4矩阵只是一个旋转矩阵+一个平移的列和一个额外的行。所以,只要用SetRow (或SetColumn)来表示每个前向/向右/向上向量,用0表示向量4的w值。然后,你可以将矩阵转换为四元数,我不能统一地为这样一个内置函数提供资金,这看起来有点奇怪,但是这个链接应该显示原理,还有很多其他的文章展示了它背后的数学。
https://stackoverflow.com/questions/74233166
复制相似问题