Es ist wahrscheinlich am intuitivsten, das Objekt um die Achse senkrecht zur aktuellen Ziehrichtung zu drehen, entweder inkrementell mit jeder Mausbewegung oder relativ zur Anfangsposition des Ziehvorgangs. Die zwei Optionen geben leicht unterschiedliche Benutzerinteraktionen, die jeweils ihre Vor- und Nachteile haben.
Es gibt eine relatively straightforward Möglichkeit, einen Winkel und einen 3D-Vektor zu konvertieren, der die Achse darstellt, die in eine Rotationsmatrix gedreht wird.
Sie sind in das Recht vor, eine rohe Rotationsmatrix durch Inkrementrotationen Aktualisierung nicht in der Matrix führen wird länger eine reine Rotationsmatrix ist. Dies liegt daran, dass eine 3 × 3-Rotationsmatrix dreimal so viele Daten aufweist, wie benötigt wird, um eine Rotation darzustellen.
Eine kompaktere Art, Rotationen darzustellen, ist Euler Angles mit einem minimalen 3-Wert-Vektor. Sie könnten die aktuelle Rotation als Euler-Winkelvektor verwenden, sie in eine Matrix umwandeln, die Rotation (inkrementell oder anders) anwenden und die Matrix zurück in einen Euler-Winkelvektor konvertieren. Dieser letzte Schritt würde natürlich jede nicht-rotatorische Komponente zu Ihrer Matrix eliminieren, so dass Sie wieder eine reine Rotationsmatrix für den nächsten Zustand erhalten.
Euler Winkel sind konzeptionell nett, aber es ist eine Menge Arbeit, um die Hin-und Her-Konvertierungen zu tun.
Eine praktischere Wahl ist Quaternions (also), die Vektoren mit vier Elementen sind. Die vier Elemente geben eine Drehung und eine einheitliche Skalierung an, und wenn Sie den Vektor in Einheitslänge eingeben und normalisieren, erhalten Sie einen Skalierungsfaktor von 1,0. Es stellt sich heraus, dass ein Winkel-Achsen-Wert kann auch durch
q.x = sin(0.5*angle) * axis.x;
q.y = sin(0.5*angle) * axis.y;
q.z = sin(0.5*angle) * axis.z;
q.w = cos(0.5*angle);
Sie dann das quaternion Produkt nehmen können sehr leicht auf einen Quaternionwert umgewandelt wird von der aktuellen Dreh quaternion (die nur einfache Multiplikation und Addition verwendet) und inkrementellen Rotationsquaternion, um eine neue Quaternion zu erhalten, die beide Rotationen darstellt. An diesem Punkt können Sie die Länge normalisieren, um eine reine Rotation zu gewährleisten, ansonsten aber iterativ Rotationen kombinieren.
Die Umwandlung der Quaternion in eine Rotationsmatrix ist sehr einfach (verwendet nur Multiplikation und Addition), wenn Sie das Modell in seinem gedrehten Zustand mit herkömmlichen Grafik-APIs anzeigen möchten.
I die Wirkung von Gleitkomma Ungenauigkeit überschätzt. Einfach die Rotationen zu akkumulieren funktioniert gut. Ich werde in Quaternionen schauen, aber da ich nur um 2 Achsen rotiere, sieht alles gut aus. –