Maez
Maez

Reputation: 1

using gluLookAt and mouse to channge viewing angle in opengl/glut

Hello so i am attempting to use a mouse function to move the perspective of gluLookAt to no luck so far i have attempted to adjust upX and upY based off of the mouse position however I want the program to be able to do an entire 360 rotation around the object based on the mouse movement and would like it to stop when the mouse movement in the window stops. Any help would be appreciated I am still learning

#include <iostream>
#include <math.h>
#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glut.h>

float posX=4, posY=6, posZ=5, targetX=0, targetY=0, targetZ=0, upX=0, upY=1, upZ=0;

void display() {
    glClear(GL_COLOR_BUFFER_BIT);

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(60.0, 4.0/3.0, 1, 40);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    gluLookAt(posX, posY, posZ, targetX, targetY, targetZ, upX, upY, upZ);  

    glColor3f(1.0, 1.0, 1.0);
    glutWireTeapot(1.5);

    glBegin(GL_LINES);
      glColor3f(1, 0, 0); glVertex3f(0, 0, 0); glVertex3f(10, 0, 0);
      glColor3f(0, 1, 0); glVertex3f(0, 0, 0); glVertex3f(0, 10, 0);
      glColor3f(0, 0, 1); glVertex3f(0, 0, 0); glVertex3f(0, 0, 10);
    glEnd();

    glFlush();
}

void usage(){
    std::cout<< "\n\n\
          q,Q: Quit\n\n" ;
          std::cout.flush();
}

void onMouseMove(int x, int y)
{
    posX = x*cos(posY) + PosY*sin(PosX)*sin(yRot) - dz*cos(xRot)*sin(yRot) 
    glutPostRedisplay();
}

void KeyboardFunc (unsigned char key, int eyeX, int eyeY)
{
    switch (key)
    {
       case 'q':
       case 'Q':
           exit(0);
           break;
    }
    glutPostRedisplay();
}

void init() 
{
    glClearColor(0.0, 0.0, 0.0, 1.0);
    glColor3f(1.0, 1.0, 1.0);
    usage();
}

int main(int argc, char** argv) 
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
    glutInitWindowPosition(300,250);
    glutInitWindowSize(800, 600);
    glutCreateWindow("Final");
    init();
    glutDisplayFunc(display);
    glutPassiveMotionFunc(&onMouseMove);
    glutKeyboardFunc(&KeyboardFunc); 
    glutMainLoop();
}

Upvotes: 0

Views: 661

Answers (1)

httpdigest
httpdigest

Reputation: 5797

If you want to implement an arcball camera, and you want to do it with the fixed-function pipeline matrix stack, it'd actually be simpler to not use gluLookAt() but glRotate/glTranslate, like so:

glTranslatef(0f, 0f, -radius);
glRotatef(angX, 1f, 0f, 0f);
glRotatef(angY, 0f, 1f, 0f);
glTranslatef(-targetX, -targetY, -targetZ);

where radius is the distance of the "camera" to the viewed point, angX is the angle around the X axis, angY the angle around the Y axis and (targetX, targetY, targetZ) is the position of the viewed point (your targetX/Y/Z).

You don't have to compute sin/cos yourself (it is computed by glRotatef) and all you have to do is set/increase angX and angY in your motion function.

Upvotes: 2

Related Questions