2013-11-13 3 views
0

В настоящее время я пытаюсь реализовать функцию камеры 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 возвращает значения в эйлеровом диапазоне. Но я не уверен, какие-либо решения?

+0

Звучит как (возможно, апокрифическая) история о истребителях, оборудованных GPS, чей автопилот перевернул их при пересечении экватора. –

ответ

0

Хорошо, понял это, работая над чем-то еще!

 matrice.setIdentity(); 

     Main.getMap().getLocalizedUpVector(shootPos, up); 
     matrice.m02 = up.x; matrice.m12 = up.y; matrice.m22 = up.z; 

     matrice.rotate(pitch, RenderElement.AXIS_PITCH); 
     matrice.rotate(yaw, up); 

     eye.set(matrice.m02, matrice.m12, matrice.m22); 


     if(eye.length() > 0){ 
      eye.normalise(); 
     } 

Сначала установите Matrice на вверх вектор, то при вращении, что вектор по глобальной оси тангажа, чтобы получить высоту. Поверните вокруг вверх, чтобы получить рыскание.

Затем вы получаете относительный глаз от матрицы.

Смежные вопросы