0

我试图让一个对象旋转以查看另一个对象。不过,我似乎找不到可行的解决方案。有谁知道如何做到这一点?我试过了:

   public static Matrix4 LookAt(Vector3 eye, Vector3 target, Vector3 up)
        {
            Vector3 z = (eye - target).Normalize();
            Vector3 x = Vector3.Cross(up, z).Normalize();
            Vector3 y = Vector3.Cross(z, x).Normalize();

            Matrix4 matrix = new Matrix4(new Vector4(x.X, y.X, z.X, 0.0f),
                                        new Vector4(x.Y, y.Y, z.Y, 0.0f),
                                        new Vector4(x.Z, y.Z, z.Z, 0.0f),
                                        Vector4.UnitW);

            return Matrix4.CreateTranslation(-eye) * matrix;
        }

但它没有用。
4

2 回答 2

0

该代码似乎可以在 RH 坐标系中生成 LookAt 矩阵。

鉴于您说它适用于相机但不适用于物体,这表明您沿线某处使用了错误的坐标空间。LookAt 矩阵将世界空间中的顶点转换为相机的坐标系,您要做的是使用此矩阵将网格的局部对象顶点(可能指向局部 -Z 轴)转换为世界空间。所以如果你以这种方式使用它,你需要反转 LookAt 矩阵吗?

于 2020-08-12T21:58:45.803 回答
0

我在Blogspot 页面上的一篇文章中找到了解决方案。

public void LookAt(Vector3 Position, Vector3 target, Vector3 Up)
    {
        Vector3 delta = target - Position;
        Vector3 direction = Vector3.Normalize(delta);
        Vector3 up = Up.Normalize();
        Vector3 right = Vector3.Cross(up, direction).Normalize();
        up = Vector3.Cross(direction, right).Normalize();

        RotationMatrix = new Matrix4(
            new Vector4(right.X, right.Y, right.Z, 0.0f),
            new Vector4(up.X, up.Y, up.Z, 0.0f),
            new Vector4(direction.X, direction.Y, direction.Z, 0.0f),
            new Vector4(Position.X, Position.Y, Position.Z, 1.0f));
    }
于 2020-08-21T12:10:15.720 回答