2014-12-24 181 views
0

我想实现一个简单的应用程序,用户可以通过更改gluLookAt函数的参数来查看自己。我实现了绕Y轴旋转的方式如下:OpenGL应用程序旋转摄像头

float cx1; 
float cz1; 

float d1 = cx - eyex; 
float d2 = cz - eyez; 

cx1 = d2*sin(alfa*PI/180) + d1*cos(alfa*PI/180); 
cz1 = d2*cos(alfa*PI/180) - d1*sin(alfa*PI/180); 
yRotationAngle = yRotationAngle +alfa; 

cx = cx1 + eyex; 
cz = cz1 + eyez; 

这工作得很好,但是当我试图绕x轴旋转,我没有得到期望的行为。我想将相机“向上”和“向下”旋转,但是按照我当时所处的特定方向旋转。围绕X轴旋转的代码按以下方式实现: float d1 = cy-eyey; float d2 = cz - eyez;

//rotate around x 
cy1 = cos(angleToRotate) * d1 - sin(angleToRotate) * d2; 
cz1 = sin(angleToRotate) * d1 + cos(angleToRotate) * d2; 

cy = cy1 + eyey; 
cz = cz1 + eyez; 

我需要一定绕Y轴的一些逆向转动之前我x周围旋转?如果是这样,旋转所需角度​​的值是多少?

回答

0

第二次旋转的数学会稍微复杂一些,因为您想要将其应用于当前位置。但是我认为,如果您跟踪当前角度,并在旋转相机时添加/减少角度,可以使整个事情变得更加简单。实际上,您主要在球坐标空间中操作,并且只有在应用旋转时才计算笛卡尔坐标。

要做到这一点,你需要两个角度。我将使用以下术语:

  • yawAng:围绕y轴的当前旋转角度,相对于z轴测量。
  • pitchAng:相对于xz平面的角度。积极向上(在积极的方向y,积极的向下)。

由此,基本相机旋转简单地成为这些角度的增量/减量。对于angInc增量:

  • 左:yawAng += angInc
  • 右:yawAng -= angInc
  • 最多:pitchAng += angInc
  • 下:pitchAng -= angInc

然后,当它的时间来应用gluLookAt()改造,使用标准公式将球面坐标转换为笛卡尔坐标。与摄像机和中心之间的距离为d

cx = eyex + d * sin(yawAng) * cos(pitchAng); 
cy = eyey + d * sin(pitchAng) 
cz = eyez + d * cos(yawAng) * cos(pitchAng);