math - lazy - glut tutorial
FreeGLut: rotación suave de la cámara con el mouse (2)
Cuando giro mi cámara fps con el mouse, la animación no es uniforme. Cuando uso un teclado, todo funciona bien. Para el teclado utilizo una matriz de tipo bool para las teclas del búfer. ¿Qué puedo hacer para suavizar la animación cuando uso el mouse?
void MousePassiveMotion(int x, int y)
{
int centerX = glutGet(GLUT_WINDOW_WIDTH) / 2;
int centerY = glutGet(GLUT_WINDOW_HEIGHT) / 2;
int deltaX = x - centerX;
int deltaY = y - centerY;
if(deltaX != 0 || deltaY != 0)
{
heading = deltaX * 0.2f;
pitch = deltaY * 0.2f;
glutWarpPointer(centerX, centerY);
}
}
Debería usar algo así en lugar de los ángulos de la cámara con la última posición del mouse en lugar del punto central de la pantalla.
void mouseMove( int x, int y )
{
theta += (lastx-x) / 100.0;
phi += (lasty-y) / 50.0;
lastx = x;
lasty = y;
if ( phi >= M_PI )
phi = M_PI - 0.001;
else if ( phi <= 0 )
phi = 0.001;
}
Aquí 100.0 y 50.0 son factores que influyen en la velocidad del movimiento (sensibilidad) y la instrucción if / else limita el movimiento a ciertos ángulos.
A veces, cuando la frecuencia de sondeo del mouse y la frecuencia de actualización de la pantalla no son buenas, la actualización de la pantalla en función de la posición del mouse puede ocasionar un efecto desigual.
Tienes sincronización vertical, ¿correcto? Y si lo gira, el movimiento del ratón es más suave a expensas de lagrimeo.
Una opción es usar una función de suavizado, que "rezague" los valores que utiliza para la posición del mouse un poco detrás de la posición real del mouse
La esencia de esto es así:
float use_x,use_y; // position to use for displaying
float springiness = 50; // tweak to taste.
void smooth_mouse(float time_d,float realx,float realy) {
double d = 1-exp(log(0.5)*springiness*time_d);
use_x += (realx-use_x)*d;
use_y += (realy-use_y)*d;
}
Esta es una función de disminución exponencial . Lo llama cada cuadro para establecer qué usar para la posición del mouse. El truco está en obtener el valor correcto para la springiness
. Para ser pedante, la springiness
es la cantidad de veces que la distancia entre la posición real del mouse y la posición usada se reducirá a la mitad. Para suavizar el movimiento del mouse, un buen valor para la springiness
es probablemente de 50-100.
time_d
es el intervalo desde la última encuesta del mouse. Pase el delta en tiempo real (en fracciones de segundos) si puede, pero puede salirse con la suya simplemente pasando 1.0/fps
.
Si tiene un navegador compatible con WebGL, puede ver una versión en vivo aquí : busque una clase llamada GLDraggable
en viewer.js
.