我试图实现一个简单的应用程序,用户可以通过更改gluLookAt函数的参数来查看自己。我通过以下方式围绕y轴实现了旋转:
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轴旋转时,我没有得到所需的行为。我想旋转相机" up" " down"但在那个特定的方向,我在那一刻。围绕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;
在围绕x旋转之前,我是否需要围绕y轴进行一些反向旋转?如果是这样,旋转所需角度的值是多少?
答案 0 :(得分:1)
第二次旋转的数学运算会稍微复杂一些,因为您想要相对于当前位置应用它。但是我认为如果你跟踪当前的角度,并且在旋转相机时加/减它们,你可以使整个事情变得更简单。基本上,您主要在球面坐标空间中操作,并且仅在应用旋转时计算笛卡尔坐标。
要做到这一点,你需要两个角度。我将使用以下命名法:
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);