¿Cómo podría simplemente llamando Pitch () y guiñada () causan la cámara para finalmente Roll ()?

StackOverflow https://stackoverflow.com/questions/784445

  •  16-09-2019
  •  | 
  •  

Pregunta

Estoy codificación de un juego básico de OpenGL y tengo un código que maneja el ratón en términos de movimiento de la cámara.

Estoy usando el siguiente método:

int windowWidth = 640;
int windowHeight = 480;

int oldMouseX = -1;
int oldMouseY = -1;

void mousePassiveHandler(int x, int y)
{
    int snapThreshold = 50;

    if (oldMouseX != -1 && oldMouseY != -1)
    {
        cam.yaw((x - oldMouseX)/10.0);
        cam.pitch((y - oldMouseY)/10.0);


        oldMouseX = x;
        oldMouseY = y;

        if ((fabs(x - (windowWidth / 2)) > snapThreshold) || (fabs(y - (windowHeight / 2)) > snapThreshold))
        {
            oldMouseX = windowWidth / 2;
            oldMouseY = windowHeight / 2;
            glutWarpPointer(windowWidth / 2, windowHeight / 2);
        }
    }
    else
    {
        oldMouseX = windowWidth / 2;
        oldMouseY = windowHeight / 2;
        glutWarpPointer(windowWidth / 2, windowHeight / 2);
    }


    glutPostRedisplay();

}

Sin embargo, después de mirar alrededor en los círculos que encontrará la cámara empieza a "rodar" (girar). Ya que sólo estoy llamando echa y desvío, no veo cómo esto es posible.

Aquí está el código que estoy usando para mi clase de cámara: http://pastebin.com/m20d2b01e

Por lo que yo sé, mi cámara "rodar" no debería suceder. Simplemente debe inclinarse hacia arriba y hacia abajo o de guiñada a la izquierda y la derecha. NO rodar.

¿Cuál podría ser la causa de esto?

¿Fue útil?

Solución

Felicitaciones - usted ha descubierto la teoría de grupos de Lie!

Sí, es posible. El resultado de una serie de transformaciones depende del orden en el que están ejecutados. Haciendo un lanzamiento seguido de un viraje no es lo mismo que un hacer un viraje, seguido por un lanzamiento. De hecho, en el límite de infinitesimalmente pequeñas pian y lanzamientos, la diferencia asciende a un rollo puro; El general caso es un poco más complicado.

(Los físicos llaman a esto las "relaciones de conmutación de el grupo de rotación".)

Si está familiarizado con las matrices de rotación, se puede trabajar fuera muy fácilmente.

Otros consejos

Es probable que necesite usar cuaterniones para la composición de rotaciones, si no lo están haciendo ya . Esto evita el problema de bloqueo de ejes que se puede obtener cuando se orienta una cámara por la rotación alrededor de los 3 ejes .

Aquí es cómo convertir entre ellos.

Bueno, si usted comienza con ganas horizontal para el horizonte, campo de 90 grados, y luego dejaron de guiñada 90 grados, a continuación, echar abajo 90 grados, que estaría buscando en la misma dirección que empezar, pero el horizonte haría ser vertical (como si lo rodó 90 grados a la izquierda).

Editar : Creo que el problema es que guiñada / inclinación / balanceo sería apropiado si la cámara está siendo tratado como un avión. Lo que usted probablemente querrá hacer es tratarla como si fuera un punto en una esfera, hacer el seguimiento de en qué parte de la esfera que está apuntando la cámara. En lugar de guiñada / terreno de juego, utilizar coordenadas esféricas hacer el seguimiento de theta (latitud) y phi (longitud). Ellos pueden parecer similares, pero considerar el caso extremo en que la cámara está apuntando directamente hacia arriba. Con guiñada / terreno de juego, todavía se puede ajustar libremente la guiñada y cabeceo de esa dirección recta hacia arriba. Con theta / phi, sólo se podía ajustar a la baja theta, y no importa cuánto phi ajustado, disminuyendo theta todavía le daría una cámara que es paralelo al horizonte. Se trata de cómo el trabajo de cámara FPS (que no puede mirar tan abajo que usted está buscando detrás de usted).

Editar 2 : Mirando el código de la cámara se conectó a, que desea estar utilizando el rotLati(float angle) y rotLongi(float angle) funciones

Matemáticamente la razón de esto es que las rotaciones en el espacio 3D no conmutan. Lo que esto significa es que el tono () seguido de guiñada () no es el mismo que el de guiñada () seguido por el lanzamiento (), sino una consecuencia de este hecho es que los tres tipos de rotaciones están íntimamente relacionados y que no puede realizar ninguna dos de ellos sin conseguir algunos de la tercera. En otras palabras, cualquier secuencia de pitch) es (y de guiñada () s producirá un efecto notable rollo () con el tiempo, a menos que la segunda mitad de la secuencia es el inverso exacto de la primera mitad. (Hay un montón de bastante intrincada matemáticas involucradas en esto, pero los detalles no son particularmente relevantes)

Pitch / guiñada / roll son todas relativas a la orientación de su vehículo. Cuando se trata de vender arriba / abajo, cambia su eje de guiñada. Del mismo modo, cuando la guiñada, cambia de eje de cabeceo. Así que es posible cambiar la orientación de una manera similar a una maniobra de giro sólo mediante una combinación y las maniobras de tono y guiñada.

Creo que esta circunstancia se llama Gimbal Lock - hay un ejemplo de que con las ilustraciones de la página de Wikipedia.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top