原理
就是两次Cross算出x轴、y轴,然后利用模型空间坐标轴得到变换矩阵,确切点说是旋转矩阵,LookAt只是把物体旋转了下,并不会涉及缩放和平移。
第1次Cross是根据y-z轴所在的平面求出x轴
第2次Cross是根据x-z轴所在平面求出y轴
验证
public class MyLookAtTest : MonoBehaviour { void Start() { this.transform.LookAt(new Vector3(2, 2, 2)); } static void MyLookAt(Vector3 from, Vector3 to, Vector3 upHint) { var zaxis = to - from; zaxis.Normalize(); Gizmos.color = Color.blue; Gizmos.DrawLine(Vector3.zero, zaxis * 3); var xaxis = Vector3.Cross(upHint, zaxis); //upHint只是一个参考向量, 用于确定y-z轴所在平面的。x轴垂直于y-z轴所在平面 xaxis.Normalize(); Gizmos.color = Color.red; Gizmos.DrawLine(Vector3.zero, xaxis * 3); var yaxis = Vector3.Cross(zaxis, xaxis); //y轴垂直于x-z轴所在平面 yaxis.Normalize(); Gizmos.color = Color.green; Gizmos.DrawLine(Vector3.zero, yaxis * 3); } void OnDrawGizmosSelected() { MyLookAt(Vector3.zero, new Vector3(2, 2, 2), Vector3.up); } }
没运行的时候,并没有LookAt圆球
运行后,LookAt圆球,我们的调试画的线也与模型空间的坐标轴是重合的
相关函数
Quaternion.LookRotation
Transform.LookAt
Matrix4x4.LookAt
标签:LookAt,Vector3,Cross,zero,zaxis,原理,Gizmos From: https://www.cnblogs.com/sailJs/p/16382473.html