귀하의 질문에 옳지 않습니다. "일단 회전하면 축이 더 이상 같지 않습니다 (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을 고칠 수 있지만 이미 쿼터니언 코드가 있고 그 코드에 만족하면 그 경로를 따라 가면 더 똑똑해 질 수 있습니다. 논리 행렬 연산을 쿼터니온 연산으로 대체하십시오.
Unity3D를 사용하여 5 분 만에 작업을 수행하십시오. (일단 익숙해지면) 1, 모델에 드롭 2, "궤도"스크립트에 드롭. – Fattie