所以我差点使用矢量和gluLookAt这样的自由飞行相机实现了 所有4个方向的运动和围绕Y轴的旋转都很好。
对于围绕Y轴的旋转,我计算眼睛和中心矢量之间的矢量,然后用旋转矩阵旋转它,如下所示:
Vector temp = vecmath.vector(center.x() - eye.x(),
center.y() - eye.y(), center.z() - eye.z());
float vecX = (temp.x()*(float) Math.cos(-turnSpeed)) + (temp.z()* (float)Math.sin(-turnSpeed));
float vecY = temp.y();
float vecZ = (temp.x()*(float) -Math.sin(-turnSpeed))+ (temp.z()*(float)Math.cos(-turnSpeed));
center = vecmath.vector(vecX, vecY, vecZ);
最后我将中心设置为新计算的向量
现在,当我尝试围绕X轴旋转做同样的事情时,它会旋转矢量,但是以一种非常奇怪的方式,有点像它会以波浪线移动。
我使用与前一次旋转相同的逻辑,只需使用x旋转矩阵:
Vector temp = vecmath.vector(center.x() - eye.x(),
center.y() - eye.y(), center.z() - eye.z());
float vecX = temp.x();
float vecY = (temp.y()*(float) Math.cos(turnSpeed)) + (temp.z()* (float)-Math.sin(turnSpeed));
float vecZ = (temp.y()*(float) Math.sin(turnSpeed)) + (temp.z()*(float)Math.cos(turnSpeed));
center = vecmath.vector(vecX, vecY, vecZ);
但为什么这不起作用?也许我做错了什么?
答案 0 :(得分:1)
您遇到的问题与我第一次尝试实施相机移动时遇到的问题完全相同。出现问题的原因是,如果您先转动,以便直视X轴,然后尝试通过围绕X轴旋转“倾斜”相机,您将实际旋转到您正在寻找的方向。
我发现处理相机移动的最佳方法是将角度累积在单独的变量中,并且每次从原点完全旋转。如果这样做,您可以先围绕X轴旋转“倾斜”,然后绕Y轴旋转。按此顺序执行此操作可确保倾斜始终围绕相对于相机的正确轴。像这样:
public void pan(float turnSpeed)
{
totalPan += turnSpeed;
updateOrientation();
}
public void tilt(float turnSpeed)
{
totalTilt += turnSpeed;
updateOrientation();
}
private void updateOrientation()
{
float afterTiltX = 0.0f; // Not used. Only to make things clearer
float afterTiltY = (float) Math.sin(totalTilt));
float afterTiltZ = (float) Math.cos(totalTilt));
float vecX = (float)Math.sin(totalPan) * afterTiltZ;
float vecY = afterTiltY;
float vecZ = (float)Math.cos(totalPan) * afterTiltZ;
center = eye + vecmath.vector(vecX, vecY, vecZ);
}
我不知道语法是否完全正确。一段时间没有在java中编程。