我正在尝试制作一个简单的 QML 组件,通过给定的四元数旋转项目。

我从 ArUco 获得 OGRE 四元数类型的四元数,并将其应用于 QMatrix4x4。然后我从矩阵中获取 QTransform 并尝试将其应用于画家。不幸的是,效果完全不同:

void Marker::paint(QPainter *painter)
{
  QMatrix4x4 mat;
  QQuaternion q = QQuaternion(0.883290,-0.128302,0.436779,-0.112081);
  mat.rotate(q);

  QRect rect = QRect(width()/4,height()/4,width()/2,height()/2);

  painter->setTransform(mat.toTransform());
  painter->fillRect(rect, Qt::red);
}

结果是:

它应该是这样的:

UPDATE#1 :我认为问题在于我使用方向四元数旋转矩阵,而我可能应该以其他方式应用该方向?我不完全理解四元数,有人可以解释这是一个错误吗?

UPDATE#2 :我阅读了更多关于它的信息,结果表明方向是相对于引用位置的旋转。我确实认为我有这样的职位,我不知道如何应用它。

最佳答案

上面的代码是正确的,我的例子是它实际上是一个立方体而不是一个简单的矩形,结果是立方体的前壁。所以基本上我所要做的就是:

QQuaternion q = QQuaternion(0.883290,-0.128302,0.436779,-0.112081);
QQuaternion y90 = QQuaternion(sqrt(0.5),sqrt(0.5),0,0); // 90 degree around x quaternion

QQuaternion wyn = q*y90;
wyn = wyn.normalized(); // not needed in this case but if you want to rotate for say 180 degrees it's needed

10-08 17:28