OpenGLで3D空間にレンダリングする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への参照も高く評価されます)