首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >自定义LookAt及其背后的数学基础

自定义LookAt及其背后的数学基础
EN

Stack Overflow用户
提问于 2022-10-28 09:18:59
回答 1查看 51关注 0票数 0

我一直试图理解transform.LookAt()函数背后的数学(三角学和线性代数)。我遵循了一个教程,并试图修改它以满足我的需要,但到目前为止我还没有成功。

我试图实现一个相机(在3d空间),它是跟随一个播放器的自定义偏移,但同时,用户可以缩放相机的所有,同时仍然有那个Vector3偏移量。我还锁定了其他的轴,只想把旋转应用到X轴。我的脚本的问题是,角度似乎夹在45°90°学位之间。我想我错过了什么

代码语言:javascript
复制
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“向量(在直角三角形中相对于)。
  • hpyotenuse/opposite之间的比值Arcus切线计算X旋转

正如你所看到的,矢量计算就像截图一样。

  • 蓝色 -forward载体
  • 洋红右向量
  • newUp载体

前向、右和newUp向量

不过,只有当我降低变焦率时,相机才能正确地聚焦到字符上,也就是说,a将相机移近它:

一段距离后只看目标(正确)

我遗漏了什么?非常感谢你的帮助!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-10-28 11:16:26

提供一个实际的答案。看起来,你得到了正确的想法,即在观察方向和任意向上向量之间取交叉乘积,然后再取一个交叉乘积,以确保所有向量是正交的。我不确定我是否确切地理解了偏移量的作用,但我认为它是按预期工作的。我会做几件事:

  1. 确保一切都是正常的,我不认为这是严格必要的,但它有助于保持小的价值。
  2. 添加一个检查来处理前向和target.up是否接近平行,或者选择其他的向上向量,或者给出一个错误,这样您就可以检测到问题。
  3. 直接构造旋转矩阵。

我非常喜欢将旋转处理为向量、四元数或矩阵。我发现欧拉角混淆和难以使用,因为有多个变体应用不同的旋转顺序,它们是难以可视化的。

旋转矩阵(即3x3)实际上只是三个正交向量,这也是显示矩阵的超级有用的方法。我认为每个向量应该对应于矩阵中的一行,但我不熟悉统一,而且惯例可能是不同的。

4x4矩阵只是一个旋转矩阵+一个平移的列和一个额外的行。所以,只要用SetRow (或SetColumn)来表示每个前向/向右/向上向量,用0表示向量4的w值。然后,你可以将矩阵转换为四元数,我不能统一地为这样一个内置函数提供资金,这看起来有点奇怪,但是这个链接应该显示原理,还有很多其他的文章展示了它背后的数学。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74233166

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档