将动画应用于openGL中的对象
Posted
技术标签:
【中文标题】将动画应用于openGL中的对象【英文标题】:Applying animations to objects in openGL 【发布时间】:2012-12-14 15:00:39 【问题描述】:我在编写一个使用 openGL 为形状设置动画的程序时偶然发现了一个问题。
目前在程序中,我正在创建一些形状,使用以下 sn-p
for(int i=50;i<=150;i=i+50)
for(int j=50;j<=750;j=j+200)
//Draw rectangle shape at position(j,i); //shape has additional capability for animations
这给了我这个输出:
现在,我必须调整这些矩形的大小并将它们全部移动到另一个位置。我有第一个矩形rectangle at position[0][0]
的最终目标Point
应该移动它。但是,当我用类似的东西为这些矩形的大小设置动画时
rectangle.resize(newWidth, newHeight, animationTime);
由于明显的原因,矩形没有粘在一起,我得到类似的东西:
我正在寻找像 Grouping
这样可以将这些形状绑定在一起的东西,这样即使应用了不同的动画,如调整大小(和运动等),顶点或边界也应该接触在一起。
请注意,Grouping
是这里的主要内容。我将来可能有一个要求,我必须将最后一列中的两个矩形分组,其中已经发生了独立的动画(如旋转)。所以,我把这个想象成plane/container
有这两个矩形,plane/container
本身可以为位置等设置动画。我对算法/概念很好,而不是代码。
【问题讨论】:
AFAIK 在 opengl 中没有这种常见的东西,您必须始终单独管理图形对象的渲染.. @Sorceror:看待这个问题的另一种方式是考虑将两个动画应用于某个形状。 (例如:在 Y 轴上旋转的矩形,并且已经动画的矩形本身进一步沿 X 轴旋转。)这类似于可以同时应用于对象的 PowerPoint 动画。朝那个方向看,它对如何将两个动画应用于单个对象有帮助吗? 如果你想对一个对象应用更多的动画,最好的方法是使用矩阵变换,然后你可以将尽可能多的变换应用到甚至单个对象,只需将它们相乘(变换矩阵)在一起..见en.wikipedia.org/wiki/Transformation_matrix 【参考方案1】:不是在 CPU 上为几何体设置动画,而是在 CPU 上为缩放/位置矩阵设置动画,并通过 MVP 矩阵将几何体的变换留给顶点着色器。对所有矩形使用一个相同的比例矩阵。 (或者两个矩阵,如果 X 和 Y 的比例因子不同)。
PS。这是一个例子:
float sc = 0;
void init()
glMatrixMode (GL_MODELVIEW);
glLoadIdentity ();
void on_each_frame()
// do other things
// draw pulsating rectangles
sc += 0.02;
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glScalef((float)sin(sc) + 1.5f);
// draw rectangles as usual, **without** scaling them
glPopMatrix();
// do other things
【讨论】:
我在程序中处理动画的方式是补间每一帧中的值,并在绘制矩形glRectangle(x, y, tweenedX, tweenedY)
中使用这些补间值。所以当 tweenedX 和 tweenedY 时,我得到一个缩放的矩形。我没有完全得到你的解决方案。如果您可以为此添加更多细节,那就太好了,因为到目前为止,我一直在关注 c++ 而不是 openGL(在 openGL 中是一个相当起步的人)【参考方案2】:
考虑实现一个“DrawableAnimatableObject”,它是一个高级 3D 对象,能够动画和绘制自身,并包含您的多边形(在您的情况下为多个矩形)作为内部数据。看下面不完整的代码给你个思路:
class DrawableAnimatableObject
private:
Mesh *mesh;
Vector3 position;
Quaternion orientation;
Vector3 scale;
Matrix transform;
public:
DrawableAnimatableObject();
~DrawableAnimatableObject();
//update the object properties for the next frame.
//it updates the scale, position or orientation of your
//object to suit your animation.
void update();
//Draw the object.
//This function converts scale, orientation and position
//information into proper OpenGL matrices and passes them
//to the shaders prior to drawing the polygons,
//therefore no need to resize the polygons individually.
void draw();
//Standard set-get;
void setPosition(Vector3 p);
Vector3 getPosition();
void setOrientation(Quaternion q);
Quaternion getOrientation();
void setScale(float f);
Vector3 getScale();
;
在此代码中,Mesh 是一个包含多边形的数据结构。简单来说,可以是一个顶点-面列表,也可以是半边这样更复杂的结构。 DrawableAnimatableObject::draw() 函数应该如下所示:
DrawableAnimatableObject::draw()
transform = Matrix::CreateTranslation(position) * Matrix::CreateFromQuaternion(orientation) * Matrix::CreateScale(scale);
// in modern openGL this matrix should be passed to shaders.
// in legacy OpenGL you will apply this matrix with:
glPushMatrix();
glMultMatrixf(transform);
glBegin(GL_QUADS);
//...
// Draw your rectangles here.
//...
glEnd();
glPopMatrix();
【讨论】:
以上是关于将动画应用于openGL中的对象的主要内容,如果未能解决你的问题,请参考以下文章