reales - orientación del cursor openGL c++
libro de android studio en español pdf (1)
Quiero que mi sprite 2D gire mientras siempre miro mi cursor.
Estoy usando glad, SDL2 y glm para las matemáticas.
la forma "original" que probé fue calcular el ángulo entre mi Frente y mi vector LookAt deseado del objeto y poner ese ángulo en grados en una matriz glm::rotate
. Eso no funcionó por alguna extraña razón. La otra forma era hacerlo dentro de un quat y aplicar el quat a la matriz de mi modelo, lo que tampoco ayudó.
Mi objeto se representa con su centro en el origen (0,0,0), por lo que no es necesario realizar ninguna traducción para la rotación.
Dibujé 2 triángulos para hacer un rectángulo sobre el cual cargué mi textura.
Mi matriz modelo se ve así en teoría:
model = rotate * scale;
Luego lo vec3
al sombreador (donde Position es mi Vertex vec3
)
position = projection * view * model * vec4(Position, 1.0f);
La primera cosa extraña es que, si codifico 90.0f como un ángulo en glm::rotate
, mi objeto realmente gira alrededor de 120 ° en el sentido de las agujas del reloj. Si enchufo 80 °, en realidad gira unos ~ 250 ° en el sentido de las agujas del reloj. Si enchufo 45 °, es una rotación perfecta de 45 ° en el sentido de las agujas del reloj. Todas las rotaciones están alrededor del eje z, por ej .:
model = glm::rotate(model, 90.0f, glm::vec3(0.0f,0.0f,1.0f);
Si utilizo un cuaternión para simular una orientación, me da ángulos entre 0,2 y 0,9 radianes y mi objeto parece girar solo entre 0,0 ° y 45 ° en el sentido de las agujas del reloj, sin importar dónde coloque el cursor.
Si calculo el ángulo por cierto. mis dos vectores (ObjectLookAt & MousePosition) y los almacena también obtengo ángulos bastante correctos, pero la función glm :: rotate no funciona como esperaba.
Finalmente si simplemente codifico el ángulo como:
float angle = static_cast<float>(SDL_GetTicks()/1000);
Que comienza por uno realmente rota aún más raro. Esperaría que comenzara a calificar en 1 ° (como comienza con 1 segundo) y luego gire un círculo completo alrededor del eje z hasta que haya 360 segundos más. Sin embargo, gira 360 ° en aproximadamente 6 segundos. ¿Alguna vez "1" que se agrega en el ángulo y se enchufa en glm::rotate
como un grado representa 60 °?
¿Es esto ahora un defecto en mi lógica? ¿No giro un sprite alrededor del eje z si se dibuja en un plano xy? También probé el eje xey para estar a salvo aquí, pero eso no funcionó. Estoy realmente atrapado aquí, creo (creo) cómo debería funcionar en teoría, especialmente porque todo sucede en "2D", pero no puedo hacer que funcione ...
La primera cosa extraña es que, si codifico 90.0f como un ángulo en glm :: rotate, mi objeto realmente gira alrededor de 120 ° en el sentido de las agujas del reloj. Si enchufo 80 °, en realidad gira unos ~ 250 ° en el sentido de las agujas del reloj. Si enchufo 45 °, es una rotación perfecta de 45 ° en el sentido de las agujas del reloj.
Esto es así porque la función glm::rotate
espera el ángulo en radianes (desde la versión de GLM 0.9.6).
Adapta tu código así:
model = glm::rotate(model, glm::radians(angel_degrees), glm::vec3(0.0f,0.0f,1.0f);
ver también: