Tôi đang tìm cách triển khai đơn giản cho xoay vòng cung trên mô hình 3D với quaternions, sử dụng GLKit trên iOS. Cho đến nay, tôi đã xem xét các nguồn sau:Xoay vòng Arcball với Quaternions (sử dụng iOS GLKit)
Tôi cũng đã cố gắng để hiểu mã nguồn và toán học từ here và here. Tôi có thể xoay đối tượng của tôi nhưng nó vẫn nhảy xung quanh ở các góc độ nhất định, vì vậy tôi sợ khóa gimbal đang chơi. Tôi đang sử dụng công cụ nhận dạng cử chỉ để kiểm soát vòng quay (cử chỉ pan ảnh hưởng đến cuộn và ngáp, cử chỉ xoay ảnh hưởng đến độ cao). Tôi đang gắn mã của tôi để xử lý quaternion cũng như chuyển đổi ma trận modelview.
biến:
GLKQuaternion rotationE;
tec non Xử lý:
- (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));
}
modelview Matrix Transformation (Bên Vẽ Loop):
// 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);
Bất kỳ trợ giúp nào được đánh giá rất cao, nhưng tôi muốn giữ nó càng đơn giản càng tốt và dính vào GLKit.
câu trả lời Brilliant, nó làm việc một cách hoàn hảo. Đây là lần đầu tiên tôi tham gia vào quaternions, vì vậy lời giải thích rõ ràng được đánh giá rất cao - cảm ơn! Tôi đã chỉnh sửa câu hỏi của tôi để làm rõ điểm của bạn nêu ra trong (1), mặc dù cử chỉ được đặt tên là "pan" (quy ước iOS) nó thực sự kiểm soát vòng quay của mô hình của tôi. –