Domanda

Ho implementato un'obiectrotazione con Qquaternion e QpushButton. Finché viene attivato più il plus_x_button, viene attivato lo slot rote_plus_x (). Rispettivamente per meno_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(){...}

Ora vorrei realizzare la funzionalità con un Qslider invece del QpushButton. Con un intervallo tra -180 ° e 180 °, ma poi ho il problema che ottengo strani risultati perché il valore del Qslider viene modificato e il Qquaternion esprime un angolo non cambia. Hai un'idea di come raggiungerlo? L'ho provato con If-Statements. Qualcosa di simile a:

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

Purtroppo non funziona. Hai un'idea, come raggiungerlo?

Grazie

È stato utile?

Soluzione

Penso che per ottenere quello che stai cercando, dovresti assegnare piuttosto che moltiplicare.

Cioè, se il cursore è impostato per avere valori da -179 a +180 gradi, allora puoi solo dire:

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

Nota che sto usando = invece di *=. Ciò rende il dispositivo di scorrimento intuitivamente.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top