2011-01-26 7 views
3

저는 4 학년의 컴퓨터 공학 학생이며 Android 개발자에 대한 경험이 있습니다.OpenGL에서 터치 스크린을 사용하여 3D 객체를 회전 제어

나는 그것을 돌릴 수 있어야하는 3D 구성 요소가있는 응용 프로그램을 만들고 있습니다. 나는 안드로이드 리소스 사이트에서 예제를보고 있었다.

http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/graphics/TouchRotateActivity.html

이 예에서는 Z 축 주위의 회전에 대해 얘기하지 않는다. 나는 이미 회전을 위해 Quaternion을 사용하려고 시도했지만 z 축 주위로 회전하는 방법을 이해하지 못합니다.

일단 회전하면 축이 더 이상 동일하지 않으므로 (x, y) 축에서 회전하는 정도를 어떻게 알 수 있습니까?

누군가가 개체 주위를 돌릴 수있는 방법을 배우는 데 도움이되는지 궁금합니다. 위의 예와 마찬가지로 z 축을 중심으로합니다. 나는 이미 약 24 시간을 검색하고 이것을 알아 내려고 노력했다.

큰 문제는 y 축을 중심으로 90도 회전하면 다음 회전 (터치 스크린에서 세로 방향으로 이동)이 z 축 주위에 있어야한다는 것을 어떻게 감지 할 수 있는지입니다.

미리 감사드립니다.

+0

Unity3D를 사용하여 5 분 만에 작업을 수행하십시오. (일단 익숙해지면) 1, 모델에 드롭 2, "궤도"스크립트에 드롭. – Fattie

답변

-1

은 당신이 당신의 구체적인 질문을이 책 link

을 읽는 것이 좋습니다 일부 3.3.1

0

당신은 또한 객체를 회전하는 대신 중앙 주위에 카메라를 회전 할 수 있습니다 참조하십시오.

0

귀하의 질문에 옳지 않습니다. "일단 회전하면 축이 더 이상 같지 않습니다 (x, y). 그래서 어느 축에서 얼마나 회전해야하는지 알 수 있습니까?", "어떻게하면 로컬이 아닌 글로벌 축을 중심으로 회전 할 수 있습니까? 축? ". 전역 x 주위의 회전을 항상 전역 x 주위의 회전으로 만들고 객체의 로컬 x 축 주위를 회전시키지 않습니다. 현재 상태에 따라 다르게 회전하지 않으면 개념적으로 회전하는 것을 바꿀 수 있습니다.

우선 rotX, rotY 및 rotZ를 저장하고 glRotatef를 호출하여 순환 게재를 적용 하시겠습니까? 그것은 당신이하고 싶은 일에 충분하지 않습니다. 당신이하는 일은 오일러 각에 의한 방향을 설명하는 것입니다. gimbal lock은 항상 하나의 축에 대한 값 중 일부가 다른 두 축을 같은 축으로 회전시키는 곳입니다. 그래서 당신은 어느 정도 자유를 잃게됩니다. 적절한 설명을 위해 기사를 확인하십시오.

OpenGL 코더로 매우 만족할 것이므로 객체 지향을 M이라는 행렬로 직접 저장한다고 가정합니다. 회전을 적용하기 위해 적용한 행렬로 회전을 저장합니다. 앵글이나 축에 대한 명확한 개념은 없습니다.

x를 중심으로 회전한다고 가정합니다. x 축을 중심으로 적절한 회전 행렬을 생성하고이를 R이라고 부릅니다. 이러한 행렬은 OpenGL이 glRotatef (각도, 1, 0, 0)를 수행하기 위해 내부적으로 작성하는 것입니다.

실제로 두 가지 옵션이 있습니다. M을 MR로 바꾸거나 M을 RM으로 바꿉니다. 행렬 곱셈은 교환 가능하지 않으므로 같지 않습니다. OpenGL 행렬 스택을 사용하여 6을 왼쪽으로 변환 한 다음 40도 회전하면 40도 회전 한 다음 6을 왼쪽으로 변환하는 것과는 다른 결과가 발생합니다.

이 경우 R이 대상이므로 MR은 사후 곱셈이고 RM은 미리 곱하기입니다. 행렬의 곱셈은 벡터에 적용될 때 두 번째 행렬을 적용한 다음 첫 번째 행렬을 적용하는 것과 동일한 효과를 갖는 행렬을 만듭니다. 그래서 만약 당신이 포스트 멀티 플라이하면 새로운 회전과 그 뒤의 모든 회전으로 객체를 회전시킨 것처럼 결과를 얻을 수 있습니다. 그것은 분명히 잘못된 길입니다. 다른 수정 사항을 모두 적용한 후 새 수정을 적용하려고합니다. 그럼 미리 배웁니다. 그리고 그 결과를 새로운 M으로 저장하십시오.

그게 전부입니다. 그리고 현재 개체 회전을 적용하는 glRotatef 대신에 glMultMatrixf (M)를 사용

// ... I assume the modelview stack is active, M is an array of 16 floats ... 

// ensure whatever's on the stack currently is kept safe 
glPushMatrix(); 

    // but we don't actually care what it was, so load the identity 
    glLoadIdentity(); 

    // build our rotation matrix first 
    glRotatef(changeAroundX, 1, 0, 0); 
    glRotatef(changeAroundY, 0, 1, 0); 

    // multiply by M. OpenGL postmultiplies by the newer matrix, so this 
    // is premultiplying M by whatever we just loaded 
    glMultMatrixf(M); 

    // read the new M back 
    glGetFloatv(GL_MODELVIEW_MATRIX, M); 

// and pretend we never touched the stack 
glPopMatrix(); 

: 당신은 같이 명시 적으로 GL 행렬 스택을 사용하여 개념의 빠른 증거를 노크 할 수 있습니다. 이것은 단지 개념의 증거 일 뿐이므로 M에서 많은 불쾌한 수치 오류를 신속하게 얻을 수 있습니다. 계속 진행하면서 M을 고칠 수 있지만 이미 쿼터니언 코드가 있고 그 코드에 만족하면 그 경로를 따라 가면 더 똑똑해 질 수 있습니다. 논리 행렬 연산을 쿼터니온 연산으로 대체하십시오.

+0

Android에는 현재 glGetFloatv이 없습니다. 대체 어디에서 사용 하시겠습니까? –

+0

그럴 경우 매트릭스 (또는 쿼터니언 또는 기타) 수학을 직접 작성해야합니다. 다행히도 상대적으로 쉽습니다. glRotate의 맨 페이지에서는 각 행을 채워서 관련 행렬과 행렬 곱셈을 구현하기가 쉽습니다. – Tommy

+0

감사. 맨 페이지를 따라 가려고했지만 임의로 큐브의 회전을 변경할 수 있지만 큐브의 원래 축을 따라서 만 변경할 수있는 상황이 발생했습니다. 따라서, 큐브를 위 - 아래 축 (180도)을 중심으로 회전시킨 다음 위로 회전하려고하면 아래로 회전합니다. 내가 놓친 것 같은 중요한 부분은 회전 된 행렬에 대해 현재 축을 사용하여 회전을 적용하는 방법입니다. 불행히도 근본적인 수학적 배경 오류입니다. –

1

xAngle 및 yAngle을 현재 행렬에 추가합니다.

Matrix.rotateM(matrix, 0, xAngleADD, matrix[1], matrix[5], matrix[9]); 
Matrix.rotateM(matrix, 0, yAngleADD, matrix[0], matrix[4], matrix[8]); 
gl.glMultMatrixf(matrix, 0); 
관련 문제