3d тригонометрическое уравнение - PullRequest
6 голосов
/ 27 марта 2011

Я пытаюсь написать небольшое «перспективное» javascript-приложение, которое позволяет мне летать через набор точек x, y, z, которые населяют трехмерное пространство.

У меня есть концепция камеры, которая меняет свое вращение и положение xyz, в то время как каждая точка поддерживает постоянную точку xyz.

Затем у меня есть система уравнений, которая определяет, как координаты камеры x, y, z должны быть скорректированы для прямого полета вперед. Регулировки x, y, z, очевидно, зависят от вращения камеры.

Это почти работает, но при определенных «настройках» регулировка положения камеры идет не так, и траектория полета не идет прямо вперед, а уходит под углом или даже переворачивается. Уравнения для разработки проекции следующие:

var directionFactor = 1;
if (direction == 'backward') directionFactor = -1;

    sx = Math.sin(cameraView.rotX);
    cx = Math.cos(cameraView.rotX);
    sy = Math.sin(cameraView.rotY);
    cy = Math.cos(cameraView.rotY);
    sz = Math.sin(cameraView.rotZ);
    cz = Math.cos(cameraView.rotZ);


    // Z-Axis
    ztrig = Math.sqrt((cx * cx) + (cy * cy)) * (cx * cy);
    cameraView.z = cameraView.z + directionFactor * 
                                           (Math.abs(airspeed / 15) * ztrig);

    // Y-Axis
    ytrig = Math.sqrt((sx * sx) + (cz * cz)) * (sx * cz);
    cameraView.y = cameraView.y + directionFactor *
                                            (Math.abs(airspeed / 15) *ytrig);

    // X-Axis
    xtrig = Math.sqrt((cz * cz) + (sy * sy)) * (cz * sy);
    cameraView.x = cameraView.x - directionFactor * 
                                             (Math.abs(airspeed / 15) * xtrig);

Очевидно, мои уравнения не совсем верны. Может кто-нибудь сказать мне, где я иду не так? Высоко ценится и спасибо.

1 Ответ

6 голосов
/ 27 марта 2011

У вас есть некоторые ошибки в ваших уравнениях.(Они действительны в 2-м случае, но не в 3-м)

, когда вы вычисляете

sx = Math.sin(cameraView.rotX);

Это имеет смысл в 2d, так как:

sx = Math.sin(cameraView.rotX) = x/SQRT(y*y + x*x) 

где (х, у) - положение камеры.Но в 3d все сложнее: enter image description here

В 3d:

enter image description here

enter image description here

enter image description here

Таким образом, чтобы получить декартову координату:

enter image description here

enter image description here

enter image description here

Вы также можете использовать 3d-матрицу для выполнениявращение.

...