使用 Qquaternion 和 QSlider 进行旋转

发布于 2024-12-26 16:25:42 字数 1123 浏览 1 评论 0原文

我已经用 QQuaternion 和 QPushButton 实现了对象旋转。 只要按下 plus_x_button,槽rotate_plus_x()就会被激活。 分别为minus_x。

void OpenGLScene::rotate_plus_x()
{
  OpenGLScene::anglex = 2;
  test->rotation *= QQuaternion::fromAxisAndAngle(QVector3D(1,0,0),OpenGLScene::anglex);
  update();
}

void OpenGLScene::rotate_minus_x()
{
  OpenGLScene::anglex = -2;
  test->rotation *= QQuaternion::fromAxisAndAngle(QVector3D(1,0,0),OpenGLScene::anglex);
  update();
}
void OpenGLScene::rotate_plus_y(){...}
void OpenGLScene::rotate_minus_y(){...}

void OpenGLScene::rotate_plus_z(){...}
void OpenGLScene::rotate_minus_z(){...}

现在我想用 Qslider 而不是 QPushButton 来实现该功能。 范围在-180°和180°之间 但后来我遇到了一个问题,我得到了奇怪的结果,因为 Qslider 的值发生了变化,而 Qquaternion 表达了一个不可改变的角度。 您知道如何实现这一目标吗?我已经用 if 语句尝试过了。 比如:

if(slidervalue<0){
OpenGLScene::anglex = -2;
test->rotation *= QQuaternion::fromAxisAndAngle(QVector3D(1,0,0),OpenGLScene::anglex);}
else{
OpenGLScene::anglex = 2;
test->rotation *= QQuaternion::fromAxisAndAngle(QVector3D(1,0,0),OpenGLScene::anglex);}

不幸的是它不起作用。您有想法吗?如何实现这一目标?

谢谢

I have implemented an Objectrotation with QQuaternion and QPushButton.
As long as the plus_x_button is pushed the slot rotate_plus_x() is activated.
Respectively for minus_x.

void OpenGLScene::rotate_plus_x()
{
  OpenGLScene::anglex = 2;
  test->rotation *= QQuaternion::fromAxisAndAngle(QVector3D(1,0,0),OpenGLScene::anglex);
  update();
}

void OpenGLScene::rotate_minus_x()
{
  OpenGLScene::anglex = -2;
  test->rotation *= QQuaternion::fromAxisAndAngle(QVector3D(1,0,0),OpenGLScene::anglex);
  update();
}
void OpenGLScene::rotate_plus_y(){...}
void OpenGLScene::rotate_minus_y(){...}

void OpenGLScene::rotate_plus_z(){...}
void OpenGLScene::rotate_minus_z(){...}

Now I would like to realize the functionality with a Qslider instead of the QPushButton.
With a range between -180° and 180°
But then I have the problem that I get weird outcomes because the value of the Qslider is changed and the QQuaternion expexts a nonchangeble angle.
Have you an idea how to achieve that? I have tried it with if-statements.
Something like:

if(slidervalue<0){
OpenGLScene::anglex = -2;
test->rotation *= QQuaternion::fromAxisAndAngle(QVector3D(1,0,0),OpenGLScene::anglex);}
else{
OpenGLScene::anglex = 2;
test->rotation *= QQuaternion::fromAxisAndAngle(QVector3D(1,0,0),OpenGLScene::anglex);}

Unfortunately its not working. Do you have an idea, how to achieve that?

Thank you

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

烟火散人牵绊 2025-01-02 16:25:42

我认为为了得到你想要的东西,你应该分配而不是乘法。

也就是说,如果您的滑块设置为 -179 到 +180 度的值,那么您可以直接说:

OpenGLScene::anglex = slidervalue;
test->rotation = QQuaternion::fromAxisAndAngle(QVector3D(1,0,0),OpenGLScene::anglex);

请注意,我使用的是 = 而不是 *= 。这使得滑块的行为直观。

I think that to get what you're looking for, you should assign rather than multiply.

That is, if you slider is set to have values from -179 to +180 degrees, then you can just say:

OpenGLScene::anglex = slidervalue;
test->rotation = QQuaternion::fromAxisAndAngle(QVector3D(1,0,0),OpenGLScene::anglex);

Note that I'm using = instead of *=. That makes that the slider behave intuitively.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文