В настоящее время я пытаюсь реализовать функцию камеры FPS, которая будет относительно установленного вектора. В этом случае положение игроков будет нормальным от центра планет. Это позволит вам ходить по планете. без искажения камеры кривизной планеты.Реализация камеры относительно поверхности планет/направления тяжести
В настоящее время я использую это для установки направления камеры.
Main.getMap().getLocalizedUpVector(shootPos, up);
Main.getMap().getLocalizedAngle(shootPos, angle);
matrice.rotate(angle.y, RenderElement.AXIS_YAW);
matrice.rotate(angle.x, RenderElement.AXIS_PITCH);
matrice.rotate(yaw,up);
right.set(matrice.m00, matrice.m10, matrice.m20);
if(right.length()>0){
right.normalise();
}
matrice.rotate(pitch, right);
eye.set(matrice.m02, matrice.m12, matrice.m22);
Он вызывает эти функции.
public void getLocalizedUpVector(Vector3f pos, Vector3f res){
res.set(pos.x - center.x, pos.y - center.y, pos.z - center.z);
if(res.length() > 0){
res.normalise();
}
}
public void getLocalizedAngle(Vector3f pos, Vector3f angle){
float deltaX = pos.x - center.x;
float deltaY = pos.y - center.y;
float deltaZ = pos.z - center.z;
float distance = (float)Math.sqrt(deltaX*deltaX + deltaY*deltaY + deltaZ*deltaZ);
float yaw = -(float)Math.atan2(deltaX, deltaZ);
float pitch = (float)Math.asin(deltaY/distance);
angle.set(pitch, yaw, 0);
}
Эта реализация прекрасно работает на одну половину планеты, но она испортилась с другой стороны. Я подозреваю, что это связано с тем, что моя функция getLocalizedAngle возвращает значения в эйлеровом диапазоне. Но я не уверен, какие-либо решения?
Звучит как (возможно, апокрифическая) история о истребителях, оборудованных GPS, чей автопилот перевернул их при пересечении экватора. –