我刚刚开始教自己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];
答案 0 :(得分:1)
在Y-up世界中,全局“向上”向量是本地“Y”向量。或者换句话说,如果你在变换中加入“0,1,0”,它就会指向“向上”。
在OpenGL矩阵中,这意味着第二列是您的“向上”向量。您可以按如下方式提取它:
float *myMatrix = ...;
myUpVector = Vector3(myMatrix[4], myMatrix[5], myMatrix[6]);