2010-11-20 20 views
5

Estoy haciendo un pequeño proyecto en el que grabo conjuntos de datos en un mundo. Tengo el trazado hecho. Ahora quiero implementar el movimiento de la cámara.Procesamiento y OpenGL - ¿Cambia la posición de la cámara?

Tengo un código donde si un usuario presiona c y arrastra el mouse, la posición de la cámara cambia. La cuestión es que no estoy seguro de cómo calcular el movimiento de la cámara desde el movimiento del mouse.

Código de cámara para la posición predeterminada: cámara (ancho/2.0, alto/2.0, (alto/2.0)/tan (PI * 60.0/360.0), ancho/2.0, alto/2.0, 0, 0 , 1, 0);

¿Cómo puedo cambiar la posición de la cámara en relación con el arrastre del mouse? (He intentado usar mouseX y mouseY para compensar la posición del ojo de la cámara, pero no funciona bien.)

+0

Cuando dices que es "el código de la cámara", ¿te refieres a que esa es la matriz del modelo? ¿O estás usando una clase/función de "cámara" que hace algunos cálculos detrás de escena? La forma más sencilla de mover una escena es ignorar completamente la cámara y mover la escena en sí. Simplemente agregue un "desplazamiento de cámara" a todos los puntos X, Y, Z que está renderizando, que es lo contrario de donde quiere que se mueva la "cámara". – cecilkorik

+0

Quiero decir que quiero cambiar las variables en el método de procesamiento de la cámara() de acuerdo con el arrastre del mouse. –

Respuesta

2

Si usted tiene dirección del vector, se puede establecer la posición de la cámara de la siguiente manera (resumen código):

pos += speed * normalize(direction); 

Eso es para seguir adelante. Si quieres moverte hacia atrás, simplemente multiplica tu velocidad de vertido normalizada por -1. Para ametrallamiento izquierda y derecha, usar algo esto:

pos += speed * normalize(cross_product(direction, upvector)); // strafing right 
pos += speed * normalize(cross_product(upvector, direction)); // strafing left 

He aquí algunas notas sobre las operaciones con vectores (de una de mis aplicaciones "HelloWorld" =)):

  • normalizar (VEC); devuelve vec, cuya longitud es igual a 1; este "corta" el vec a la longitud necesaria
  • cross_product (vec_a, vec_b); devuelve vec_c, que se dirige perpendicularmente a vec_a y vec_b (consulte this article para obtener más información).

Mi versión de cross_product() se ve así:

Vector Vector::CrossProduct(const Vector &v) 
{ 
    double k1 = (y * v.z) - (z * v.y); 
    double k2 = (z * v.x) - (x * v.z); 
    double k3 = (x * v.y) - (y * v.x); 

    return Vector(NumBounds(k1), NumBounds(k2), NumBounds(k3)); 
    // NumBounds(v) returns 0 when v is less than 10^-8 
} 

Esperamos que esto ayude =)

1

Creo que, con mucho, la más sencilla de hacerlo sería utilizar el peasycam biblioteca

http://mrfeinberg.com/peasycam/

esta biblioteca le da acceso a su cámara con un mouse que puede restringir de varias maneras, así como varios captadores que facilitan el acceso a la información sobre la cámara y su estado actual.

Cuestiones relacionadas