【问题标题】:How do I convert a Direction Vector to a Quaternion如何将方向向量转换为四元数
【发布时间】:2022-10-16 00:53:52
【问题描述】:

假设我有一个指向某个方向的向量 v。 我的问题很简单:我如何从这个方向向量构造一个四元数,这样一个对象就会看到向量的方向? 我想我需要对象的前向向量指向与方向向量相同的方向。我将如何使用四元数来做到这一点?还是我应该做一些完全不同的事情? 提前致谢。

【问题讨论】:

  • 你能澄清一下吗?矢量 v 在“世界”坐标中吗?你在“身体”坐标中是否有一个代表“向前”方向的向量?你想要一个代表这两者对齐的方向的世界->身体四元数吗?关于这个指向方向的旋转有什么限制吗?
  • 我已经想通了。我明天会发布答案
  • @Ams1901 你明白了吗?发布答案对寻找答案的其他人非常有帮助。

标签: vector quaternions


【解决方案1】:

我找到了答案:

Quaternion Quaternion::LookAt(Vector3f direction, Vector3f forward, Vector3f up) {

        Quaternion rot1 = RotationBetweenVectors(forward, direction);
        Vector3f right = Vector3f::CrossProduct(direction, up);
        up = Vector3f::CrossProduct(right, direction);
        Vector3f realUp(0, 1, 0);
        Vector3f newUp = rot1 * realUp;
        Quaternion rot2 = RotationBetweenVectors(newUp, up);
        Quaternion res = rot2 * rot1;

        return Quaternion(res.x, res.y, res.z, res.w);

    }

    Quaternion Quaternion::RotationBetweenVectors(Vector3f forward, Vector3f direction) {
        forward = Vector3f::Normalize(forward);
        direction = Vector3f::Normalize(direction);

        float cosTheta = Vector3f::DotProduct(forward, direction);
        Vector3f axis;

        if (cosTheta < -1 + 0.001f) {
            // special case when vectors in opposite directions:
            // there is no "ideal" rotation axis
            // So guess one; any will do as long as it's perpendicular to start
            axis = Vector3f::CrossProduct(Vector3f(0.0f, 0.0f, 1.0f), forward);

            if (axis.Length() * axis.Length() < 0.01)
                axis = Vector3f::CrossProduct(Vector3f(1.0f, 0.0f, 0.0f), forward);

            axis = Vector3f::Normalize(axis);
            return Quaternion(axis.x, axis.y, axis.z, DegreesToRadians(0));
        }

        axis = Vector3f::CrossProduct(forward, direction);
        float s = sqrt((1 + cosTheta) * 2);
        float invs = 1 / s;

        return Quaternion(
            axis.x * invs,
            axis.y * invs,
            axis.z * invs,
            s * 0.5f
        );
    }

【讨论】:

    猜你喜欢
    • 2013-03-30
    • 2023-04-06
    • 1970-01-01
    • 2012-01-26
    • 1970-01-01
    • 2011-10-08
    • 1970-01-01
    • 2011-01-06
    • 2012-06-11
    相关资源
    最近更新 更多