在glulookat()之后计算相机向上?

时间:2010-06-12 15:15:48

标签: iphone opengl-es camera openal

我刚刚开始教自己openGL,现在加入openAL。

我在3D空间中散布着一些行星,当我触摸屏幕时,我正在为随机行星分配声音,然后慢慢地,平稳地将“相机”飞过来看它并听取它。动画/补间部分工作得很好,但是openAL部分并不安静。我通过为每一帧做一个微小的translate()和gluLookAt()来移动相机以保持平滑(补间摄像机位置和外观协调)。问题似乎是我从耳机中取出的立体声图像......有时在相机滚动或旋转后,左/右/上/下有时会混淆。我很确定麻烦就在这里:

    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];

1 个答案:

答案 0 :(得分:1)

在Y-up世界中,全局“向上”向量是本地“Y”向量。或者换句话说,如果你在变换中加入“0,1,0”,它就会指向“向上”。

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

float *myMatrix = ...;
myUpVector = Vector3(myMatrix[4], myMatrix[5], myMatrix[6]);