Pregunta

He implementado una objectrotación con Qquaternion y QpushButton. Mientras se presione el más_x_button, se activa la ranura Rotate_Plus_X (). Respectivamente para 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(){...}

Ahora me gustaría darme cuenta de la funcionalidad con un QSLider en lugar del QpushButton. Con un rango entre -180 ° y 180 °, pero luego tengo el problema de que obtengo resultados extraños porque el valor del QSLider cambia y el Qquaternion expeta un ángulo no cambio. ¿Tienes una idea de cómo lograr eso? Lo he probado con las declaraciones if. Algo como:

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);}

Lamentablemente no está funcionando. ¿Tienes una idea, cómo lograr eso?

Gracias

¿Fue útil?

Solución

Creo que para obtener lo que estás buscando, debes asignar en lugar de multiplicar.

Es decir, si su deslizador tiene valores de -179 a +180 grados, entonces puede decir:

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

Tenga en cuenta que estoy usando = en vez de *=. Eso hace que el control deslizante se comporte intuitivamente.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top