gpt4 book ai didi

math - 两个四元数的区别

转载 作者:行者123 更新时间:2023-12-03 23:14:12 25 4
gpt4 key购买 nike

解决了

我正在我的引擎中制作一个 3D 门户系统(如 Portal 游戏)。每个门户都有自己的方向保存在一个四元数中。要在其中一个门户中渲染虚拟场景,我需要计算两个四元数之间的差异,并将结果用于旋转虚拟场景。

在左墙上创建第一个门户,在右墙上创建第二个时,从一个到另一个的旋转将仅在一个轴上发生,但例如当第一个门户将在地板上创建时,第二个在右墙上,从一个到另一个的旋转可能在两个轴上,这就是问题所在,因为旋转出错了。

我认为问题的存在是因为方向例如 X轴和 Z轴一起存储在一个四元数中,我需要单独手动乘 X * Z (或 Z * X ),但是如何只使用一个四元数(差异四元数)?还是有其他方法来纠正旋转场景?

编辑:

这张图片上有两个门户 P1 和 P2,箭头显示它们是如何旋转的。当我查看 P1 时,我会看到 P2 中的内容。为了找到我需要旋转主场景的旋转,就像这张图片中的虚拟场景一样,我正在执行以下操作:

  • 从四元数 P2 到四元数 P1
  • 沿 Y 轴旋转 180 度的结果(门户的 UP)
  • 使用结果旋转虚拟场景

  • 仅当差异仅发生在一个轴上时,上述方法才有效。当一个门户将在地板上或天花板上时,这将不起作用,因为差异四元数构建在多个轴上。正如建议的那样,我尝试将 P1 的四元数乘以 P2 的四元数,反之亦然,但这不起作用。

    enter image description here

    编辑 2:

    为了找到从 P2 到 P1 的区别,我正在执行以下操作:
    Quat q1 = P1->getOrientation();
    Quat q2 = P2->getOrientation();

    Quat diff = Quat::diff(q2, q1); // q2 * diff = q1 //

    这是 Quat::diff 函数:
    GE::Quat GE::Quat::diff(const Quat &a, const Quat &b)
    {
    Quat inv = a;
    inv.inverse();
    return inv * b;
    }

    逆:
    void GE::Quat::inverse()
    {
    Quat q = (*this);
    q.conjugate();
    (*this) = q / Quat::dot((*this), (*this));
    }

    共轭:
    void GE::Quat::conjugate()
    {
    Quat q;
    q.x = -this->x;
    q.y = -this->y;
    q.z = -this->z;
    q.w = this->w;

    (*this) = q;
    }

    点积:
    float GE::Quat::dot(const Quat &q1, const Quat &q2)
    {
    return q1.x*q2.x + q1.y*q2.y + q1.z*q2.z + q1.w*q2.w;
    }

    运算符(operator)*:
    const GE::Quat GE::Quat::operator* ( const Quat &q) const
    {
    Quat qu;
    qu.x = this->w*q.x + this->x*q.w + this->y*q.z - this->z*q.y;
    qu.y = this->w*q.y + this->y*q.w + this->z*q.x - this->x*q.z;
    qu.z = this->w*q.z + this->z*q.w + this->x*q.y - this->y*q.x;
    qu.w = this->w*q.w - this->x*q.x - this->y*q.y - this->z*q.z;
    return qu;
    }

    运算符(operator)/:
    const GE::Quat GE::Quat::operator/ (float s) const
    {
    Quat q = (*this);
    return Quat(q.x / s, q.y / s, q.z / s, q.w / s);
    }

    所有这些东西都有效,因为我已经用 GLM 对其进行了测试图书馆

    最佳答案

    如果你想找到一个四元数diff这样diff * q1 == q2 ,那么你需要使用乘法逆:

    diff * q1 = q2  --->  diff = q2 * inverse(q1)

    where: inverse(q1) = conjugate(q1) / abs(q1)

    and: conjugate( quaternion(re, i, j, k) ) = quaternion(re, -i, -j, -k)

    如果你的四元数是旋转四元数,它们都应该是单位四元数。这使得求逆变得容易:因为 abs(q1) = 1 , 你的 inverse(q1) = conjugate(q1)只需否定 i 即可找到, j , 和 k组件。

    但是,对于您描述的那种基于场景的几何配置,您可能实际上并不想执行上述操作,因为您还需要正确计算平移。

    正确完成所有事情的最直接方法是将四元数转换为 4x4 旋转矩阵,并以适当的顺序将它们与 4x4 平移矩阵相乘,如大多数介绍性计算机图形学文本中所述。

    当然可以手动组合欧几里得变换,保持四元数形式的旋转,同时将四元数增量应用于单独的平移向量。然而,这种方法在技术上往往晦涩难懂,并且容易出现编码错误:4x4 矩阵形式之所以是传统形式是有充分理由的,其中一个重要的原因是它似乎更容易以这种方式正确处理。

    关于math - 两个四元数的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22157435/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com