使用OpenGL在Circle中移动对象?

问题描述 投票:2回答:1

我有一个对象,我想在Open GL / Visual Studio中绕圈移动。但到目前为止,物体只是在自身周围旋转。

我如何让它以循环方式移动?

目前,它只是立即翻译对象,但不是在我的旋转动画过程中。

这是我在显示功能中的代码 - 因为我被告知如果你想让对象不绕自身旋转,你需要翻译。但到目前为止,我的对象完全忽略了这里的翻译,仍然围绕着自己。

glRotatef(0.0f, 0, 1, 0);
glTranslatef(2.0, 0.0, 0.0);
glRotatef(angle, 0.0, -1.0, 0.0);   

drawExcavator(); // draws the object

这是我的动画功能,以便稍后定义我在glRotatef调用中使用的角度:

void animate() {

    // calculating the time needed for the animation 
    static long time = clock();
    long oldTime = time;
    float diffTime;
    time = clock();
    diffTime = ((float)(time - oldTime)) / ((float)CLOCKS_PER_SEC); // taken from the exercise sheets

    // checking if the animation has not been stopped:
    if (!pause) {
        angle += diffTime*rotateSpeed;
        elapsedTime += diffTime;
        frameCount++;

        // adding up the frames so that they are shown in the window:
        if (elapsedTime > 1.0)
        {
            // counting the fps so that they are outprinted in the window line:
            fps = (float)frameCount / elapsedTime;
            fps = fps / 100; // for correct frame numbers 
            elapsedTime = 0.0;
            frameCount = 0.0;
        }
    }
}
c++ opengl coordinate-transformation opengl-compat
1个回答
4
投票

您必须交换翻译和旋转操作:

glRotatef(angle, 0.0, -1.0, 0.0);   
glTranslatef(2.0, 0.0, 0.0);

说明:

翻译:请参阅glTranslate的文档:

glTranslatex y z翻译。当前矩阵(参见glMatrixMode)乘以此平移矩阵,产品替换当前矩阵。

轮换:请参阅glRotate的文档:

glRotate围绕矢量x y z产生角度旋转。当前矩阵(参见glMatrixMode)乘以旋转矩阵,产品替换当前矩阵。

翻译矩阵如下所示:

Matrix4x4 translate;

translate[0] : ( 1,  0,  0,  0 )
translate[1] : ( 0,  1,  0,  0 )
translate[2] : ( 0,  0,  1,  0 )
translate[3] : ( tx, ty, tz, 1 )

Y轴周围的旋转矩阵如下所示:

Matrix4x4  rotate;
float      angle;

rotate[0] : ( cos(angle),  0, sin(angle), 0 )
rotate[1] : ( 0,           1, 0,          0 )
rotate[2] : ( -sin(angle), 0, cos(angle), 0 )
rotate[3] : ( 0,           0, 0,          1 )   

translate * rotate的结果是这样的:

model[0] : ( cos(angle),  0,  sin(angle), 0 )
model[1] : ( 0,           1,  0,          0 )
model[2] : ( -sin(angle), 0,  cos(angle), 0 )
model[3] : ( tx,          ty, tz,         1 )

enter image description here

rotate * translate的结果是:

model[0] : ( cos(angle),                     0,   sin(angle),                     0 )
model[1] : ( 0,                              1,   0,                              0 )
model[2] : ( -sin(angle),                    0,   cos(angle),                     0 )
model[3] : ( cos(angle)*tx - sin(angle)*tx,  ty,  sin(angle)*tz + cos(angle)*tz,  1 )

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.