我在编写程序时偶然发现了一个问题,我正在使用openGL设置动画形状。
目前在该计划中,我正在使用以下代码段创建一些形状
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 }
}
给了我这个输出:
现在,我必须调整这些矩形的大小并将它们全部移动到另一个位置。对于应移动的第一个矩形Point
,我有最终目标rectangle at position[0][0]
。但是,当我用
rectangle.resize(newWidth, newHeight, animationTime);
由于显而易见的原因矩形不会粘在一起,我得到类似的东西:
我正在寻找可以将这些形状绑定在一起的Grouping
之类的东西,这样即使应用了不同的动画(如调整大小(和运动等)),顶点或边界也应该在一起。
请注意,Grouping
是主要内容。我将来可能会要求在最后一列中对两个矩形进行分组,其中已经发生了独立的动画(如旋转)。所以,我想象这个像plane/container
这样的两个矩形,plane/container
本身可以为位置等动画。我对算法/概念很好,而不是代码。
答案 0 :(得分:0)
不是动画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
}
答案 1 :(得分:0)
考虑实现一个'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();
}