使用OpenGL在圆圈中移动对象?

Posted

技术标签:

【中文标题】使用OpenGL在圆圈中移动对象?【英文标题】:Move Object in Circle using OpenGL? 【发布时间】:2018-01-20 19:08:52 【问题描述】:

我有一个对象,我想在 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;
        
    

【问题讨论】:

【参考方案1】:

你必须交换平移和旋转操作:

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

说明:

翻译:见glTranslate的文档:

glTranslate 通过x 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 )

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 )

【讨论】:

我做到了,而且解释完全有道理。但它仍然只围绕它自己旋转.. :( @Calimera 您的对象的比例是多少? 2.0 相对于您的对象的翻译是什么?出于调试原因,使用 20.0、200.0 .... 而不是 2.0。 啊啊,好吧,我太傻了!!我改变了大小,现在可以看到它在一个圆圈中行驶。它仍然围绕原点旋转,但在更大的圆圈中,它看起来好多了 - 它仍然围绕中间旋转,这很正常,不是吗? :) @Calimera 是的,但是您可以在glRotatef(); glTranslatef(); 之前通过另一个glTranslatef 操作移动旋转轴。这将是两种可能性的结合,我在回答中对此进行了解释。 好吧好吧我明白了!!太感谢了!!你是一个真正的救星!!

以上是关于使用OpenGL在圆圈中移动对象?的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL用鼠标移动画圆

C ++ OpenGL从点到点反弹对象

javascript / threejs - 围绕中心 y 轴(在 3D 空间中)在圆圈中移动对象的方程

opengl中渲染对象的移动

如何根据对象的本地位置/旋转在 OpenGL 中移动/旋转对象

如何使用 clearRect 不在画布上绘制移动对象