Alguém pode explicar como eu posso usar Quanternions usar o mouse para olhar ao redor como um FPS?

votos
3

Ontem eu perguntei: Como poderia simplesmente chamando Pitch and Yaw que a câmera rolar?

Basicamente, eu descobri por causa de Gimbal Lock que se você lançar + guinada você vai inevitavelmente produzir um efeito de rolamento. Para mais informações você pode ler essa pergunta.

Eu estou tentando impedir que isso aconteça. Quando você olha em torno de um atirador FPS normal, você não tem a câmera rolando por todo o lugar!

Aqui é a minha atual func rato passiva:

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();

}

Que faz com que a câmera a passo / guinada com base no movimento do mouse (mantendo o cursor no centro). Eu também postou minha classe original câmera aqui .

Alguém nesse segmento sugeriu que eu use Quaternions para evitar este efeito aconteça, mas depois de ler a página da Wikipedia sobre eles eu simplesmente não Grokar eles.

Como eu poderia criar um Quaternions em meu aplicativo OpenGL / Glut para que eu possa adequadamente fazer o meu Camera olhar em volta, sem rolo indesejada?

Publicado 25/04/2009 em 05:25
fonte usuário
Em outras línguas...                            


4 respostas

votos
2

A Câmara Quaternion-Based simples, projetado para ser usado com gluLookAt.

http://www.gamedev.net/reference/articles/article1997.asp

Respondeu 25/04/2009 em 05:35
fonte usuário

votos
1

Mantenha as suas alterações delta baixo para evitar que (isto é <45 graus)

Apenas calcular uma pequena matriz "delta" com as rotações para cada quadro, este dobra para dentro da matriz câmara cada quadro. (Por vezes I significa: came = came * delta)

Se você está correndo por um longo tempo, você pode obter alguns erros numéricos, então você precisa re-orthogonalize-lo. (Procurá-lo se isso parece acontecer)

Essa é a maneira mais fácil de evitar bloqueio cardan quando apenas brincando com as coisas. Depois de conseguir mais proficiente, você vai entender o resto.

Quanto quaternions, basta encontrar um bom lib para eles que pode convertê-los em matrizes de rotação, em seguida, usar a mesma técnica (compute delta quat, multiplicar em quat principal).

Respondeu 20/05/2009 em 21:41
fonte usuário

votos
0

Você realmente não precisa de quaternions para esse caso simples, o que você precisa é a entrada de seu título e passo em um cálculo matriz 3-dimensional:

  1. Use o seu valor título com uma rotação no eixo Y para calcular MY

  2. Use o seu valor campo com uma rotação no eixo X para calcular MX

  3. Para cada ponto P, calcular R = MX * MY * P

O cálculo pode ser feito de 2 maneiras:

  1. T = MY * P, então R = MX * T

  2. T = MX * MY, em seguida, R = T * P

A primeira maneira é mais lento, mas mais fácil de código em primeiro lugar, o segundo é mais rápido, mas você vai precisar para codificar uma função multiplicação de matrizes-matriz.

ps. Veja http://en.wikipedia.org/wiki/Rotation_matrix#Dimension_three para as matrizes

Respondeu 25/04/2009 em 07:03
fonte usuário

votos
0

I representaria tudo em coordenadas polares . A página wikipedia deve começar.

Respondeu 25/04/2009 em 05:45
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more