LookAt原理

原理

就是两次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

 

posted @ 2023-02-23 00:54  yanghui01  阅读(169)  评论(0编辑  收藏  举报