normalized illumination c++ c opengl camera

c++ - normalized - opengl illumination



¿Cómo puedo hacer que mi cámara se mueva en la dirección que estoy enfrentando? (1)

Puede obtener los vectores de izquierda, arriba y adelante de la cámara de la primera, segunda y tercera columna de la matriz de vista de modelo, después de que se haya configurado, por supuesto.

float mview[16]; float front[4], up[4], left[4]; glGetFloatv(GL_MODELVIEW_MATRIX, mview); left[0] = mview[0]; left[1] = mview[1]; left[2] = mview[2]; left[3] = 1.0; up[0] = mview[4]; up[1] = mview[5]; up[2] = mview[6]; up[3] = 1.0; front[0] = mview[8]; front[1] = mview[9]; front[2] = mview[10]; front[3] = 1.0;

A partir de entonces, solo necesita agregar el vector apropiado a la posición para el movimiento.

if(myInput.Keys[VK_A]) //Left { curPos->x += left[0] * myInput.Sensitivity; curPos->z += left[z] * myInput.Sensitivity; } else if(myInput.Keys[VK_D]) //Right { curPos->x -= left[0] * myInput.Sensitivity; curPos->z -= left[2] * myInput.Sensitivity; } // etc.

Vea esta página para más detalles. En el mismo sitio, esta otra página describe cómo usar ángulos de rotación para obtener la matriz de vista de modelo, de ahí los vectores de columna como se muestra arriba. La misma técnica (pero con un sistema de coordenadas ligeramente diferente) también se usa, por ejemplo, en la serie de motores de juegos del terremoto .

Intento hacer una cámara de itinerancia libre en OpenGL. Actualmente, la cámara se mueve hacia adelante, hacia atrás, hacia la izquierda y hacia la derecha. Mi próximo objetivo es permitir que se mueva en la dirección que miras.

Aquí está mi código:

float yawRad = Rotation -> y * (3.1415f/180); float pitchRad = Rotation -> x * (3.1415f/180); if(myInput.Keys[VK_W]) //Forward { curPos->x += sin(yawRad) * myInput.Sensitivity; curPos->z -= cos(yawRad) * myInput.Sensitivity; } else if(myInput.Keys[VK_S]) //Backward { curPos->x -= sin(yawRad) * myInput.Sensitivity; curPos->z += cos(yawRad) * myInput.Sensitivity; } if(myInput.Keys[VK_A]) //Left { curPos->x -= cos(yawRad) * myInput.Sensitivity; curPos->z -= sin(yawRad) * myInput.Sensitivity; } else if(myInput.Keys[VK_D]) //Right { curPos->x += cos(yawRad) * myInput.Sensitivity; curPos->z += sin(yawRad) * myInput.Sensitivity; } if(myInput.Keys[VK_E]) //Up { curPos->y += myInput.Sensitivity; } else if(myInput.Keys[VK_Q]) //Down { curPos->y -= myInput.Sensitivity; }

myInput.Sensitivity es un flotante controlado por la rueda del mouse, con valores que aumentan / disminuyen 0.0005.

Rotation es una clase vectorial que almacena valores x, y, z (float).

Mi pregunta es, ¿cómo puedo modificar mi código para lograr itinerancia libre?