1

私は自分自身にopenGLを教え始めたばかりで、今はopenALをミックスに追加しています。

3D空間にいくつかの惑星が散らばっていて、画面に触れると、ランダムな惑星に音を割り当て、ゆっくりとスムーズに「カメラ」を飛ばして見て、聞いています。アニメーション/トゥイーン部分は完全に機能していますが、openALの部分は静かではありません。フレームごとに小さなtranslate()とgluLookAt()を実行してカメラを動かし、スムーズに保ちます(カメラの位置とlookAt座標をトゥイーンします)。ヘッドホンから出ているステレオ画像に問題があるようです。カメラが回転したり回転したりした後、左/右/上/下が混同されることがあるようです。私は問題がここにあるとかなり確信しています:

    ALfloat listenerPos[]={camera->currentX,camera->currentY,camera->currentZ};

    ALfloat listenerOri[]={camera->currentLookX,
                           camera->currentLookY,
                           camera->currentLookZ,
                           0.0,//Camera Up X  <--- here
                           0.1,//Camera Up Y  <--- here
                           0.0}//Camera Up Z  <--- and here

   alListenerfv(AL_POSITION,listenerPos);
   alListenerfv(AL_ORIENTATION,listenerOri);

オーディオポジショニングの問題を解決するために、各gluLookAt()の後にカメラのUPベクトルを再計算する必要があるかどうか疑問に思っています。これは不足している要素のようですが、関係する計算は非常に高度なようです。どこから始めればいいのかさえ。

1)各gluLookAt()の後にアップベクトルを再計算する必要があるのは正しいですか?

2)誰かがアップベクトルを計算する方法を教えてもらえますか?


それで、これはgluLookAt()の後にカメラのアップベクトルを取得する正しい方法でしょうか?

gluLookAt(cam->currentX,
          cam->currentY, 
          cam->currentZ, 
          cam->currentLookX, 
          cam->currentLookY, 
          cam->currentLookZ, 
          cam->upX, 
          cam->upY, 
          cam->upZ);

//Get the up vector
glGetFloatv( GL_MODELVIEW_MATRIX, cam->modelViewMatrix);

cam->upX = cam->modelViewMatrix[4];
cam->upY = cam->modelViewMatrix[5];
cam->upZ = cam->modelViewMatrix[6];
4

1 に答える 1

1

Y-upの世界では、グローバルな「up」ベクトルはローカルな「Y」ベクトルです。言い換えれば、変換に「0、1、0」を入力すると、「上」を指すようになります。

OpenGLマトリックスでは、これは2番目の列が「上」ベクトルであることを意味します。次のように抽出できます。

float *myMatrix = ...;
myUpVector = Vector3(myMatrix[4], myMatrix[5], myMatrix[6]);
于 2010-06-12T16:24:37.037 に答える