没有gluLookAt旋转相机而不是场景

时间:2012-12-05 03:12:46

标签: opengl rotation glulookat

我创建了一个网格来代表地面行走。

我已将我的箭头键链接起来以旋转/移动视图:

switch(currentKey)
        {
        case sf::Key::Up:
            z_trans+=1;
            break;

        case sf::Key::Down:
            z_trans-=1;
            break;

        case sf::Key::Left:
            y_angle-=0.5;
            break;

        case sf::Key::Right:
            y_angle+=0.5;
            break;
        }

z_trans是z中的平移,y_angle是glRotatef()中y轴的旋转。

我可以让我的'角色'向前走,左右转,然后继续朝他面对的方向走。唯一的问题是,当我离开原点(0,0,0)时,旋转发生在原点附近,而不是相机。因此,如果我离原点100个单位,我的角色基本上遵循100个半径圆的路径。

没有使用gluLookAt,有没有人有任何想法如何实现这个?完全难倒,坐在这里好了2个小时试图找出来。

完整代码:

float elapsedTime=Clock.GetElapsedTime();
    if(elapsedTime>REFRESH_RATE){
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);


        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity(); 
        glTranslatef(x_trans, y_trans, z_trans); // y_trans == -25.f to keep us above the plane
        glRotatef(x_angle,1,0,0);
        glRotatef(y_angle,0,1,0);
        glRotatef(z_angle,0,0,1);

        currentKey=sf::Key::Num9;

        if (Event.Type == sf::Event::KeyPressed) currentKey = Event.Key.Code;
        switch(currentKey)
        {
        case sf::Key::Up:
            z_trans+=1;
            break;

        case sf::Key::Down:
            z_trans-=1;
            break;

        case sf::Key::Left:
            y_angle-=0.5;
            break;

        case sf::Key::Right:
            y_angle+=0.5;
            break;
        }
        drawGrid();

        Clock.Reset();
    }

1 个答案:

答案 0 :(得分:0)

旋转拳头,然后翻译第二个?

编辑: 我刚检查了一些现有的代码。

glLoadIdentity();
// Rotate around origin first
glRotatef(RotY,-1.0f ,0.0f, 0.0f);
glRotatef(RotX, 0.0f, 1.0f, 0.0f);
// Then move the camera
glTranslatef(-Player.x, -Player.y, -Player.z);