android 용 OpenGL ES 1에서 27 개의 작은 큐브로 구성된 Rubic 큐브가 있습니다. 나는 특정 작은 큐브가 시점 앞에서 정확하게되도록하는 회전을 원합니다. 그래서 두 개의 벡터가 필요합니다. 하나는 객체의 원점에서 특정 큐브로 오는 벡터입니다. 다른 하나는 원점에서 시점으로 오는 벡터입니다. 그들 사이의 교차 곱은 나에게 회전의 축을 주며 내적은 나에게 각도를 준다.쿼터니온 회전이 예외로 작동하지 않음
원점에서 오는 벡터 인 월드 좌표에서 (0,0,1)을 오브젝트 좌표로 변환합니다. 코드는 다음과 같습니다.
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))));
두 회전 쿼터니언을 사용합니다. 사용자가 액션을 선택할 때마다 그 회전 중 하나가 발생해야합니다. 코드는 다음과 같습니다.
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);
이제 문제는 첫 번째 회전에서만 올바르게 작동한다는 것입니다. 첫 번째 회전이 무엇이든간에. 그것은 잘 작동하지만 다음 회전에서는 잘못된 축과 각도를 얻는 것 같습니다.
예컨대 좌표계
- X 우측 (1,0,0)
- Y 촬영 될 경우 (0,1,0)
- Z 인 (0, X 90도 반 시계 방향 (CCW 약 0,1)
먼저 회전)
- X를 생성 '- 오른쪽 (1,0,0)
- '추정치 인 (0,0,1)
- Z '다운 (0, -1, 0)
및 Z의 주위에 제 2 회전 도 90는 CCW
- 는 x'- 인 (0,1,0)
- '추정치 왼쪽 (-1,0,0)
- Z'다운 (0, -1, 0을 생성)
하지만 기대
- X 업 (0,1,0)
- Y-에서 (0,0,1)
- Z-오른쪽 (1,0,0)
문제는 resultVector (원점에서 시점으로 나오는 두 번째 벡터)가 제대로 변환되지 않는다고 생각합니다. 세계 좌표를 어떻게 개체 좌표로 변환 할 수 있습니까? 누구든지 객체가 회전했을 때 객체 좌표를 어떻게 결정할 수 있는지 알고 있습니다.
나는 귀하의 문제를 완전히 이해한다고 말할 수없고 출력물을 게시하지 않았습니다. 이 시나리오를 알려주십시오. (생산을 시도하십시오) : 좌표계가 X-right (1,0,0) , Y-up (0,1,0), Z-in (0,0,1) 먼저 시계 반대 방향으로 90 ° 시계 반대 방향 (CCW)으로 회전 적용 결과는 X'- 오른쪽 (1,0, 0 ', 0', 0 ', 0', 0 ', 0', 0 ', 0', 0 ', 0', 0 ' , 0), Y'-left (-1,0,0), Z'-down (0, -1,0). 그리고 X-up (0,1,0), Y-in (0,0,1), Z-right (1,0,0)가 예상됩니다. 어떻게됩니까? –
@MaticOblak 네, 네, 맞습니다. 무슨 일이 일어 났는지 정확하게 설명합니다. 나는 어떻게해야합니까? 왜 이런 일이 일어 났습니까? –
@MaticOblak 질문을 편집하고 예제를 추가했습니다. –