camara - Procesamiento y OpenGL-¿Cambia la posición de la cámara?
glulookat (2)
Estoy haciendo un pequeño proyecto en el que trazo conjuntos de datos en un mundo. Tengo el trazado hecho. Ahora quiero implementar el movimiento 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.
Este es el código de la cámara para la posición predeterminada: cámara (ancho / 2.0, alto / 2.0, (alto / 2.0) / tostado (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).
Creo que, por mucho, lo más fácil sería usar la biblioteca peasycam
http://mrfeinberg.com/peasycam/
esta biblioteca le dará 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.
Si tiene vector de dirección , puede establecer la posición de su cámara de la siguiente manera (código abstracto):
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 atacar a la izquierda y a la derecha, usa algo así:
pos += speed * normalize( cross_product( direction, upvector ) ); // strafing right
pos += speed * normalize( cross_product( upvector, direction ) ); // strafing left
Aquí hay algunas notas sobre operaciones vectoriales (de una de mis aplicaciones "HelloWorld" =)):
- normalizar (vec); devuelve vec, cuya longitud es igual a 1; este "corta" 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 este artículo 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
}
Espero que esto ayude =)