quaternions가있는 3D 모델에서 arcball 회전을위한 간단한 구현 인 을 찾고 있는데 특히 iOS에서 GLKit을 사용합니다. 지금까지, 나는 다음과 같은 소스를 조사 하였다 : 나는 또한 here 및 here에서 소스 코드와 수학을 이해하려고 노력했습니다Quaternions로 Arcball 회전 (iOS GLKit 사용)
. 내 물건을 회전시킬 수는 있지만 특정 각도에서 계속 뛰어 다니기 때문에 짐벌 잠금 장치가 작동하는 것이 두렵다. 제스처 인식기를 사용하여 회전을 제어합니다 (팬 동작은 롤과 요에 영향을주고 회전 동작은 피치에 영향을줍니다). 쿼터니언 처리 및 modelview 행렬 변환을위한 코드를 첨부하고 있습니다.
변수 :
GLKQuaternion rotationE;
사원 수 처리 :
- (void)rotateWithXY:(float)x and:(float)y
{
const float rate = M_PI/360.0f;
GLKVector3 up = GLKVector3Make(0.0f, 1.0f, 0.0f);
GLKVector3 right = GLKVector3Make(1.0f, 0.0f, 0.0f);
up = GLKQuaternionRotateVector3(GLKQuaternionInvert(self.rotationE), up);
self.rotationE = GLKQuaternionMultiply(self.rotationE, GLKQuaternionMakeWithAngleAndVector3Axis(x*rate, up));
right = GLKQuaternionRotateVector3(GLKQuaternionInvert(self.rotationE), right);
self.rotationE = GLKQuaternionMultiply(self.rotationE, GLKQuaternionMakeWithAngleAndVector3Axis(y*rate, right));
}
- (void)rotateWithZ:(float)z
{
GLKVector3 front = GLKVector3Make(0.0f, 0.0f, -1.0f);
front = GLKQuaternionRotateVector3(GLKQuaternionInvert(self.rotationE), front);
self.rotationE = GLKQuaternionMultiply(self.rotationE, GLKQuaternionMakeWithAngleAndVector3Axis(z, front));
}
모델 뷰 매트릭스 변환 (내부 그리기 루프) :
// Get Quaternion Rotation
GLKVector3 rAxis = GLKQuaternionAxis(self.transformations.rotationE);
float rAngle = GLKQuaternionAngle(self.transformations.rotationE);
// Set Modelview Matrix
GLKMatrix4 modelviewMatrix = GLKMatrix4Identity;
modelviewMatrix = GLKMatrix4MakeTranslation(0.0f, 0.0f, -0.55f);
modelviewMatrix = GLKMatrix4Rotate(modelviewMatrix, rAngle, rAxis.x, rAxis.y, rAxis.z);
modelviewMatrix = GLKMatrix4Scale(modelviewMatrix, 0.5f, 0.5f, 0.5f);
glUniformMatrix4fv(self.sunShader.uModelviewMatrix, 1, 0, modelviewMatrix.m);
어떤 도움을 주셔서 감사합니다,하지만 최대한 간단하게 유지하고 GLKit을 고수하고 싶습니다.
브릴리언트 대답에 넣어 희망, 완벽하게 일했다. 이것은 쿼터니언으로의 첫 벤처이기 때문에 명확한 설명을 매우 높이 평가합니다. - 감사합니다! 제스처가 "팬"(iOS 대회)으로 지정되었지만 (1)에서 제기 한 요점을 명확히하기 위해 제 질문을 편집했습니다. 실제로는 제 모델의 회전을 제어합니다. –