Android 용 OpenGL ES 2.0을 사용하고 있습니다. 터치 스크린을 사용하여 모델을 변환하고 회전하고 있습니다. 내 번역은 (x, y) 평면에만 있고 내 회전은 z 축에 대해서만 이루어집니다. 테이블의지도를 직접 내려다보고지도의 다양한 좌표로 이동하고 보고있는 지점 을 중심으로지도를 회전 할 수 있다고 상상해보십시오 .
문제는 내가 회전 한 후 후속 변환이 화면의 포인터 동작과 더 오래 일치하고 축이 다르다는 것입니다.
내가 시도한 모든 것은 두 가지 행동 중 하나를 제공합니다. One은 다음과 같습니다.
Matrix.setIdentityM(mModelMatrix, 0);
Matrix.translateM(mModelMatrix, 0, Xposition, Yposition, 0.0f);
Matrix.rotateM(mModelMatrix, 0, rotationAngle, 0.0f, 0.0f, 1.0f);
이를 통해 회전에 관계없이 예상대로 번역 할 수 있습니다 (화면 위 / 아래로 모델을 위아래로 이동, 왼쪽 / 오른쪽으로 모델을 왼쪽과 오른쪽으로 이동). 문제는 회전이 물체의 중심을 기준으로하고, 내가보고있는 지점을 중심으로 회전해야한다는 것입니다. 물체의 중심과는 다릅니다.
내가 얻을 수있는 다른 동작은 다음과 같습니다.
Matrix.setIdentityM(mModelMatrix, 0);
Matrix.rotateM(mModelMatrix, 0, rotationAngle, 0.0f, 0.0f, 1.0f);
Matrix.translateM(mModelMatrix, 0, Xposition, Yposition, 0.0f);
이것은 항상 내가보고있는 지점에 대해 내가 원하는 회전을 제공합니다. 문제는 회전 후 번역이 잘못되었다는 것입니다. 화면의 왼쪽 / 오른쪽은 회전 된 축을 따라 다른 각도로 개체를 변환합니다.
두 가지 행동을 동시에 얻을 수있는 방법이 필요합니다. 내가보고하고있는 점에 대해 회전해야 하고 , 화면에 손가락의 이동 방향으로 번역합니다.
이것이 가능할까요? 나는 기본적으로 양자 역학을 뉴턴 물리학과 조화 시키려고 노력하고 있으며 실패 할 운명에 처해 있습니까?
나는 모든 가능성을 신선한 관점으로 고려하고 싶기 때문에 내가 시도한 모든 트릭을 나열하고 싶지 않습니다.
편집 : 나는 여전히 이것에 완전히 붙어 있습니다.
세계 좌표에서 (0, 0, 0)에서 시작하는 개체가 있습니다. 내 뷰는 객체에서 z 축을 내려다보고 있으며 x / y 평면으로 변환을 제한하고 싶습니다. 또한 z 축에 대해서만 개체를 회전하고 싶습니다. 회전의 중심은 항상 화면의 중심이어야합니다.
터치 스크린으로 번역을 제어하고 있으므로 회전 방법에 관계없이 손가락이 움직이는 것과 같은 방식으로 개체가 필요합니다.
회전하자마자 모든 변환이 회전 된 좌표계에서 일어나기 시작합니다. 즉, 개체가 화면의 포인터와 함께 움직이지 않습니다. Hugh Fisher가 추천 한대로 두 번째 번역을 시도했지만 두 번째 번역을 계산하는 방법을 알 수 없습니다. 다른 방법이 있습니까?
이것은 오래된 게시물이지만 후손을 위해 가장 잘 작동하는 솔루션을 게시하고 있습니다.
해결책은 변형이 발생할 때마다 누적되는 별도의 모델 행렬을 유지하고 onDrawFrame () 메서드에서 각 변형에이 행렬을 곱하는 것입니다.
//Initialize the model matrix for the current transformation
Matrix.setIdentityM(mModelMatrixCurrent, 0);
//Apply the current transformations
Matrix.translateM(mModelMatrixCurrent, 0, cameraX, cameraY, cameraZ);
Matrix.rotateM(mModelMatrixCurrent, 0, mAngle, 0.0f, 0.0f, 1.0f);
//Multiply the accumulated transformations by the current transformations
Matrix.multiplyMM(mTempMatrix, 0, mModelMatrixCurrent, 0, mModelMatrixAccumulated, 0);
System.arraycopy(mTempMatrix, 0, mModelMatrixAccumulated, 0, 16);
그런 다음 누적 된 행렬을 사용하여 개체를 배치합니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다