2

我在编写一个使用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本身可以为位置等设置动画。我对算法/概念很好,而不是代码。

4

2 回答 2

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
}
于 2012-12-14T16:33:55.017 回答
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();
}
于 2012-12-20T19:01:08.353 回答