3

レガシー OpenGL を使用してメッシュを描画しています。現在、マウスでオブジェクトを回転させるためのアークボール クラスを実装しようとしています。ただし、マウスを動かすと、オブジェクトが回転しないか、角度が大きすぎて回転しません。

これは、マウスがクリックされたときに呼び出されるメソッドです。

void ArcBall::startRotation(int xPos, int yPos) {
    int x = xPos - context->getWidth() / 2;
    int y = context->getHeight() / 2 - yPos;
    startVector = ArcBall::mapCoordinates(x, y).normalized();
    endVector = startVector;
    rotating = true;
}

このメソッドは、マウス座標を画面の中心に配置し、それらを境界球にマッピングして、開始ベクトルを生成することを単純に意図しています。

これは、マウスが移動したときに呼び出されるメソッドです。

void ArcBall::updateRotation(int xPos, int yPos) {
    int x = xPos - context->getWidth() / 2;
    int y = context->getHeight() / 2 - yPos;
    endVector = mapCoordinates(x, y).normalized();
    rotationAxis = QVector3D::crossProduct(endVector, startVector).normalized();
    angle  = (float)qRadiansToDegrees(acos(QVector3D::dotProduct(startVector, endVector)));
    rotation.rotate(angle, rotationAxis.x(), rotationAxis.y(), rotationAxis.z());
    startVector = endVector;
}

このメソッドは、マウス座標が画面の中央に配置されるようにマップし、新しいベクトルを計算して、これら 2 つのベクトルに基づいて回転軸と角度を計算することを意図しています。

私はそれから使用します

glMultMatrixf(ArcBall::rotation.data());

回転を適用する

4

1 に答える 1