繁体   English   中英

OpenGL4 - 如何旋转 object 以查看另一个 object

[英]OpenGL4 - How to rotate object to look at another object

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

   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;
        }

但它没有用。

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

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

我在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));
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM