Rotacja kwaternionów nie działa w sposób wyłączony
W OpenGL ES 1 dla Androida mam kostkę Rubic, która składa się z 27 mniejszych kostek. Chcę, aby obroty powodujące, że konkretny mały sześcian staje się dokładnie przed punktem widzenia. więc potrzebuję dwóch wektorów. jeden jest wektorem pochodzącym od początku obiektu do określonego sześcianu. a inny to wektor pochodzący z punktu widzenia do punktu widzenia. następnie produkt krzyżowy daje mi oś obrotu, a produkt kropkowy daje mi kąt.
Przekształcam (0,0,1) - który jest wektorem pochodzącym od początku do punktu widzenia we współrzędnych współrzędnych obiektu. oto kod:
matrixGrabber.getCurrentModelView(gl);
temporaryMatrix.set(matrixGrabber.mModelView);
inputVector[0] = 0f;
inputVector[1] = 0f;
inputVector[2] = 1f;
inputVector[3] = 1f;
Matrix.multiplyMV(resultVector, 0, temporaryMatrix.InvertMatrix(), 0, inputVector,0);
resultVector[0]/=resultVector[3];
resultVector[1]/=resultVector[3];
resultVector[2]/=resultVector[3];
inputVector = ..... // appropriate vector due to user-selection
axis = Vector.normalized(Vector.crossProduct(Vector.normalized(inputVector), Vector.normalized(resultVector)));
degree = (float)Math.toDegrees(Math.acos(Vector.dot(Vector.normalized(inputVector), Vector.normalized(resultVector))));
Do rotacji używam dwóch czwartorzędów. za każdym razem, gdy użytkownik wybierze akcję, jeden z tych obrotów powinien się wydarzyć. oto kod:
Quaternion currentRotation = new Quaternion();
Quaternion temporaryRotation = new Quaternion();
.
.
.
currentRotation = (currentRotation).mulLeft(temporaryRotation.set(axis, degree));
currentRotation.toMatrix(matrix);
gl.glMatrixMode(GL10.GL_MODELVIEW);
gl.glMultMatrixf(matrix, 0);
teraz problem polega na tym, że działa dobrze po pierwszym obrocie. jakikolwiek byłby pierwszy obrót. działa dobrze, ale przy kolejnych obrotach wydaje się, że uzyskuje niewłaściwą oś i stopień.
Na przykład, jeśli układ współrzędnych byłby
X-right (1,0,0)Y-up (0,1,0)Z-in (0,0,1)następnie następuje pierwszy obrót wokół X 90 stopni w lewo (CCW)
X'-right (1,0,0)Y'-in (0,0,1)Z'-down (0, -1,0)i drugi obrót wokół Z 90 stopni CCW wytwarza
X'-in (0,1,0)Y'-lewo (-1,0,0)Z'-down (0, -1,0)ale oczekuję
X-up (0,1,0)Y-in (0,0,1)Z-right (1,0,0)Myślę, że problem polega na tym, że wektor wynikowy (drugi wektor, którego użyłem, pochodzący z punktu początkowego w kierunku punktu widzenia) nie konwertuje poprawnie. każdy wie, jak mogę przekonwertować współrzędną świata na współrzędną obiektu? każdy wie, jak możemy określić współrzędne obiektu, gdy obiekt się obrócił?