Я следую руководству по кватернионам: http://www.raywenderlich.com/12667/how-to-rotate-a-3d-object-using-touches-with-opengl и пытаюсь повернуть глобус в какое-то положение XYZ. У меня есть исходный кватернион, и я генерирую случайное местоположение XYZ на поверхности земного шара. Я передаю это местоположение XYZ в следующую функцию. Идея заключалась в том, чтобы сгенерировать вектор lookAt с помощью GLKMatrix4MakeLookAt и определить конечный кватернион для шага slerp из матрицы lookAt.
- (void)rotateToLocationX:(float)x andY:(float)y andZ:(float)z {
// Turn on the interpolation for smooth rotation
_slerping = YES; // Begin auto rotating to this location
_slerpCur = 0;
_slerpMax = 1.0;
_slerpStart = _quat;
// The eye location is defined by the look at location multiplied by this modifier
float modifier = 1.0;
// Create a look at vector for which we will create a GLK4Matrix from
float xEye = x;
float yEye = y;
float zEye = z;
//NSLog(@"%f %f %f %f %f %f",xEye, yEye, zEye, x, y, z);
_currentSatelliteLocation = GLKMatrix4MakeLookAt(xEye, yEye, zEye, 0, 0, 0, 0, 1, 0);
_currentSatelliteLocation = GLKMatrix4Multiply(_currentSatelliteLocation,self.effect.transform.modelviewMatrix);
// Turn our 4x4 matrix into a quat and use it to mark the end point of our interpolation
//_currentSatelliteLocation = GLKMatrix4Translate(_currentSatelliteLocation, 0.0f, 0.0f, GLOBAL_EARTH_Z_LOCATION);
_slerpEnd = GLKQuaternionMakeWithMatrix4(_currentSatelliteLocation);
// Print info on the quat
GLKVector3 vec = GLKQuaternionAxis(_slerpEnd);
float angle = GLKQuaternionAngle(_slerpEnd);
//NSLog(@"%f %f %f %f",vec.x,vec.y,vec.z,angle);
NSLog(@"Quat end:");
[self printMatrix:_currentSatelliteLocation];
//[self printMatrix:self.effect.transform.modelviewMatrix];
}
Интерполяция работает, я получаю плавное вращение, однако конечное местоположение никогда не совпадает с вводом XYZ — я знаю это, потому что мой глобус представляет собой сферу, и я вычисляю XYZ из широты и долготы. Я хочу смотреть прямо вниз по вектору «lookAt» к центру Земли из этого положения широты/долготы на поверхности земного шара после вращения. Я думаю, что это может иметь какое-то отношение к вектору вверх, но я пробовал все, что имело смысл.
Что я делаю неправильно. Как я могу определить последний кватернион, который, когда я заканчиваю вращение, смотрит вниз на вектор XYZ на поверхности земного шара? Спасибо!