2011-03-27 21 views
6

Estoy tratando de escribir una pequeña aplicación javascript 'de perspectiva' que me permita volar a través de un conjunto de puntos x, y, z que habitan en un espacio 3D.ecuación de trigonometría 3D

Tengo el concepto de una cámara que cambia su rotación y posición xyz, mientras que cada punto mantiene un punto xyz constante.

Luego tengo un conjunto de ecuaciones que explican cómo se deben ajustar las coordenadas x, y, z de la cámara para volar directamente hacia delante. Los ajustes x, y, z obviamente dependen de la rotación de la cámara.

Casi funciona, pero en ciertas "actitudes" el ajuste de la posición de la cámara falla y el camino de vuelo no va hacia adelante sino que se desvía en ángulo, o incluso se invierte. Las ecuaciones para la elaboración de la proyección son los siguientes:

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); 

Obviamente mis ecuaciones no son del todo bien. ¿Alguien puede decirme dónde me estoy equivocando? Muy apreciado y gracias.

+0

¿Puedes agregar tu algoritmo? –

+2

La forma estándar de calcular coordenadas 3D es usar matemáticas vector/matriz. Hay varias bibliotecas de este tipo para javascript. Ver: http://blog.tojicode.com/2010/06/stupidly-fast-webgl-matricies.html –

Respuesta

6

Tiene algunos errores en sus ecuaciones. (Ellos son válidas en el caso 2D, pero no en 3d)

cuando se calcula

sx = Math.sin(cameraView.rotX); 

tiene sentido en 2D desde:

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

donde (x, y) es la posición de la cámara. pero en 3D es más complicado: enter image description here

En 3d:

enter image description here

enter image description here

enter image description here

Por lo tanto para obtener la coordenada cartesiana:

enter image description here

enter image description here

enter image description here

También puede utilizar matriz 3d para llevar a cabo la rotación.

+0

Así que, siento ser tenue, pero ¿cómo puedo traducir tus ecuaciones anteriores en js reales? Además, la segunda ecuación en 3D parece ser exactamente la misma que la primera? Muchas gracias – Journeyman

+0

Puede usar solo las últimas tres ecuaciones. el parámetro r es SQRT (cameraView.z * cameraView.z + cameraView.y * cameraView.y + cameraView.x * cameraView.x) –

+1

Una pequeña pregunta: ¿por qué defines theta dos veces? – pimvdb