【问题标题】:Rotation using quaternion class in Qt在 Qt 中使用四元数类进行旋转
【发布时间】:2022-10-17 19:01:28
【问题描述】:

所以我一直在尝试仅使用 Qt 四元数类提供的函数来旋转我的对象:

在绘制对象之前,我输入了以下代码行:

quaternion.setScalar(w);
   quaternion.setX(x);
   quaternion.setY(y);
   quaternion.setZ(z);
   QMatrix3x3 rot;
   quaternion=quaternion.normalized();
   
   rot=quaternion.toRotationMatrix();

然后我就卡住了。我在文档中搜索,发现了这个功能:QMatrix3x3 QQuaternion::toRotationMatrix() const

它创建一个对应于四元数的旋转矩阵。获得该矩阵后,我该怎么做才能执行旋转。起初我用四元数旋转了我的对象,但没有使用 Qt 函数。我使用 glMultMatrixf 将旋转矩阵与当前矩阵(模型视图矩阵)相乘。 请,如果有人可以提供帮助,我将不胜感激。

【问题讨论】:

  • 您使用的是 QtWidgets 还是 QtQuick (QML)?
  • 可以 f.ex.由Qt3D module 使用
  • @m7913d 我正在使用 Qt 小部件
  • 问题是我现在不能使用 glMultMatrixf 因为旋转矩阵是 3*3 并且 glMultMatrix 将旋转矩阵与当前的旋转矩阵相乘,模型视图矩阵是 4*4
  • 您可以使用Qt3DCore::QTransform 将3*3 的旋转矩阵转换为4*4 的转换矩阵,也可以自己动手。如果你知道/理解这些矩阵背后的数学,这应该很简单。但是,请注意,我不熟悉glMultMatrix(或一般的 gl)。

标签: c++ qt matrix rotation quaternions


【解决方案1】:

不要使用已弃用的 glMultMatrix 函数。使用着色器 OpenGL 和QMatrix4x4::rotate

class Object3D
{
public:
    QVector3D position = QVector3D(0.f, 0.f, 0.f);
    QQuaternion rotation = QQuaternion(1.f, 0.f, 0.f, 0.f);
    QVector3D scale = QVector3D(1.f, 1.f, 1.f);
    /* ... */
void Object3D::draw(const QMatrix4x4 &projViewMatrix)
{
    bind();

    m_modelMatrix.setToIdentity();
    m_modelMatrix.translate(position);
    m_modelMatrix.rotate(rotation);
    m_modelMatrix.scale(scale);
    m_mvpMatrix = projViewMatrix * m_modelMatrix;
    m_pProgram->bind();
    m_pProgram->setUniformValue(m_uMvpMatrixLocation, m_mvpMatrix);
    /* ... */
}

void Object3D::bind()
{
    m_pProgram->bind();

    m_vertBuffers.vertPosBuffer.bind();
    m_pProgram->setAttributeBuffer(m_aPositionLocation, GL_FLOAT, 0, 3);
    m_pProgram->enableAttributeArray(m_aPositionLocation);
    /* ... */
}

【讨论】:

    猜你喜欢
    • 2014-04-30
    • 2019-04-06
    • 2019-01-09
    • 1970-01-01
    • 2023-04-03
    • 2016-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多