使用 C++ 在 OpenGL 中的动画点?

Posted

技术标签:

【中文标题】使用 C++ 在 OpenGL 中的动画点?【英文标题】:animation points in OpenGL with C++? 【发布时间】:2013-05-12 06:58:28 【问题描述】:

我尝试 3D 但我是初学者,所以我首先尝试使用 2D 和 z = 0 的值。我有一个点数组,其值在数组点 [] 中使用 std::vector 随机。我有函数 Distance(...) 和 CaculateF(...) 来计算 points[] 的新值并存储在数组 pnew[] 中。我需要绘制点 [] 并将它们移动到 pnew [] 的值,但我只知道首先在数组点 [] 中绘制随机点,我不能将它们完全移动到 pnew [] 中的值。谁能帮帮我?!

#include<stdlib.h>
#include<glut.h>
#include<iostream>
#include<conio.h>
#include<math.h>
#include<omp.h>
#include<time.h>
#include<Windows.h>
#include<vector>

using namespace std;

struct Point

    float x, y , z;
    float vx, vy, vz; 
    unsigned long m;
    unsigned char r, g, b, a;
;
vector< Point > points, pnew;

void animation_points( int value )

    // move all points left each frame
    for( size_t i = 0; i < points.size(); ++i )
    
        points[i].x -= 1;
        // wrap point around if it's moved off
        // the edge of our 100x100 area
        if( points[i].x < -50 )
        
            points[i].x = 100 + points[i].x;
        
    

    glutPostRedisplay();
    glutTimerFunc(30, animation_points, 1);


void display(void)

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(-50, 50, -50, 50, -1, 1);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    // draw
    glColor3ub( 255, 255, 255 );
    glEnableClientState( GL_VERTEX_ARRAY );
    glEnableClientState( GL_COLOR_ARRAY );
    glVertexPointer( 2, GL_FLOAT, sizeof(Point), &points[0].x );
    glColorPointer( 4, GL_UNSIGNED_BYTE, sizeof(Point), &points[0].r );
    glPointSize( 3.0 );
    glDrawArrays( GL_POINTS, 0, points.size() );
    glDisableClientState( GL_VERTEX_ARRAY );
    glDisableClientState( GL_COLOR_ARRAY );

    glFlush();
    glutSwapBuffers();


void reshape(int w, int h)

    glViewport(0, 0, w, h);


//Distance between i and j
float Distance(float x1,float y1, float z1, float x2, float y2, float z2)

    return (sqrt(pow(x1-x2,2) + pow(y1-y2,2) + pow(z1-z2,2)));


//Value of F on Ox, Oy, Oz
Point CalculateF(double d, Point a, Point b, int dt)

    Point F;
    float vnewx, vnewy, vnewz, xnew , ynew, znew;
    float G = 6.6742*pow(10,-11);
    float Fx = (G*a.m*b.m/pow(d,2)*(a.x-b.x)/d);
    float Fy = (G*a.m*b.m/pow(d,2)*(a.y-b.y)/d);
    float Fz = (G*a.m*b.m/pow(d,2)*(a.z-b.z)/d);

    vnewx = a.vx + Fx*dt/a.m;
    vnewy = a.vy + Fy*dt/a.m;
    vnewz = a.vz + Fz*dt/a.m;

    xnew = a.x + a.x*dt;
    ynew = a.y + a.y*dt;
    znew = a.z + a.z*dt;

    F.x = xnew;
    F.y = ynew;
    F.z = znew;
    F.vx = vnewx;
    F.vy = vnewy;
    F.vz = vnewz;
    F.m = a.m;
    return F;


int main(int argc, char **argv)

    // begin
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGBA | GLUT_DEPTH | GLUT_DOUBLE);

    glutInitWindowSize(640,480);
    glutCreateWindow("N - body");

    glutDisplayFunc(display);
    glutReshapeFunc(reshape);
    // animation points
    //glutTimerFunc(30, animation_points, 1);

    ////
    int n, t;
    cout<<"\n Number of body: ";
    cin>>n;
// move after time t
    cout<<"\n\n Time: ";
    cin>>t;
    t *= 3600;

    // random points
    for( int i = 0; i < n; ++i )
    
    Point pt;
    pt.x = -50 + (rand() % 100);
    pt.y = -50 + (rand() % 100);
    pt.z = 0;
    pt.r = rand() % 255;
    pt.g = rand() % 255;
    pt.b = rand() % 255;
    pt.a = 255;
    points.push_back(pt);
        

glutMainLoop();

float d;

//#pragma omp parallel default(shared) private(i,j)
for (int i = 0 ; i < n ; i++)

    //#pragma omp for schedule(static)
    for (int j = 0 ; j < n ; j++)
    
        d = Distance(points[i].x, points[i].y,points[i].z, points[j].x, points[j].y, points[j].z);
        if (d!=0)
            points[i] = CalculateF(d,points[i], points[j], t); 
    
    pnew.push_back(points[i]);


return 0;

【问题讨论】:

您的问题陈述不清楚。所以你想要的是插值点的位置,这样points[i] 移动到pnew[i] 的位置?在某个预定义的时间间隔内?匀速? 是的,速度不是主要问题!我只需要在输入 t 值后从 points[i] 移动到 pnew[i] 的位置绘制随机动画点!请帮助我,tks这么多...... 【参考方案1】:

您需要将点的初始位置和目标位置存储在数组中,然后在渲染代码中在它们之间进行插值。为此,您需要确定已经过去了多少时间,从时间计算 0.0 到 1.0 范围内的 double lambda,然后在位置 p_start + lambda * (p_target - p_start) 处绘制点。

【讨论】:

以上是关于使用 C++ 在 OpenGL 中的动画点?的主要内容,如果未能解决你的问题,请参考以下文章

openGL关于画点

Qt OpenGL点大小

使用opengl和c ++使用动画(在一定间隔后一个接一个)翻译三角形

如何为我的 GIF tilesheet 制作动画(OpenGL、DevIL、C++)

鼠标点击开始动画 OpenGL/GLUT C++

如何用OpenGL实现计算机图形学中的平移动画