У меня есть несколько 3D-моделей, которые я отображаю в OpenGL в 3D-пространстве, и у меня возникают некоторые головные боли при перемещении 'персонажа' (то есть камеры ) с вращения и перевод в этом мире.
Я получаю входные данные (то есть координаты, куда перемещать / поворачивать оси) из какого-либо внешнего события (изображение пользовательского ввода или некоторые данные с устройства GPS + компас), и тип события вращение ИЛИ перевод .
Я написал этот метод для управления этими событиями:
- (void)moveThePlayerPositionTranslatingLat:(double)translatedLat Long:(double)translatedLong andRotating:(double)degrees{
[super startDrawingFrame];
if (degrees != 0)
{
glRotatef(degrees, 0, 0, 1);
}
if (translatedLat != 0)
{
glTranslatef(translatedLat, -translatedLong, 0);
}
[self redrawView];
}
Тогда в redrawView
Я на самом деле рисую сцену и мои модели. Это что-то вроде:
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
NSInteger nModels = [models count];
for (NSInteger i = 0; i < nModels; i++)
{
MD2Object * mdobj = [models objectAtIndex:i];
glPushMatrix();
double * deltas = calloc(sizeof(double),2);
deltas[0] = currentCoords[0] - mdobj.modelPosition[0];
deltas[1] = currentCoords[1] - mdobj.modelPosition[1];
glTranslatef(deltas[0], -deltas[1], 0);
free(deltas);
[mdobj setupForRenderGL];
[mdobj renderGL];
[mdobj cleanupAfterRenderGL];
glPopMatrix();
}
[super drawView];
Проблема в том, что при трансляции события поворота вызываются одно за другим: например, когда я вращаюсь постепенно для некоторых итераций (все еще вокруг начала координат), я перевожу и, наконец, снова вращаюсь, но кажется, что последнее вращение происходит не вокруг текущей (переведенной) позиции, а вокруг старой (старой). Я хорошо знаю, что это происходит, когда порядок преобразований переворачивается, но я полагал, что после рисования новый центр мира был дан переведенной системой.
Что мне не хватает? Как я могу это исправить? (любая ссылка на OpenGL тоже будет оценена)