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 世界中,全局“向上”向量是局部“Y”向量。或者,换一种说法,如果你在变换中输入“0, 1, 0”,它会指向“上”。

在 OpenGL 矩阵中,这意味着第二列是您的“向上”向量。您可以按如下方式提取它:

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