如何将 QVector3D 与 QMatrix3x3 相乘?

Posted

技术标签:

【中文标题】如何将 QVector3D 与 QMatrix3x3 相乘?【英文标题】:How do I multiply a QVector3D with a QMatrix3x3? 【发布时间】:2020-11-07 18:28:44 【问题描述】:

这个问题听起来很简单,但是这行代码没有运行,因为没有为 QVector3D 和 QMatrix 定义运算符 *。我看过文档,它似乎不存在。有没有办法做到这一点?如果没有,有什么具体原因吗?

QVector3D r_new = QQuaternion::fromAxisAndAngle(QVector3D::crossProduct(r, n), 45).toRotationMatrix() * r;

【问题讨论】:

【参考方案1】:

阅读一些文档后,似乎 operator* 是在 QVector4D 和 QMatrix4x4 之间定义的。所以我改用 QVector4D 得到了类似的东西:

Qt3DCore::QTransform transform;
transform.setRotation(QQuaternion::fromAxisAndAngle(QVector3D::crossProduct(r, n), -30));
QVector4D r_to_4D = QVector4D(r, 1.0);
r_to_4D = transform.matrix() * r_to_4D;
QVector3D r_new = r_to_4D.toVector3D().normalized();

显然有更简洁的方式来编写它,但我现在会坚持下去。

【讨论】:

【参考方案2】:

由于您只想对 3D 矢量应用旋转,看起来您可以直接使用 QQuaternion::rotatedVector 方法 - https://doc.qt.io/qt-5/qquaternion.html#rotatedVector

QQuaternion R = QQuaternion::fromAxisAndAngle(QVector3D::crossProduct(r, n), 45);
QVector3D r_new = R.rotatedVector(r);

【讨论】:

以上是关于如何将 QVector3D 与 QMatrix3x3 相乘?的主要内容,如果未能解决你的问题,请参考以下文章

绘制 QVector3D 数据的工具?

将 QMatrix4x4 与 OpenGL 函数一起使用

QGLBuffer VBO 实现

使用 QT-=gui 时替代 QImage

Qt GLSL 纹理只出现一种颜色

围绕特定轴动画qt3d旋转