Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Мультимедия, OpenGL/DirectX > Анимация


Автор: hitman88 13.4.2009, 19:51
Народ, у мя такая засада: нужно написать программу с анимацией,но анимация не простая и как ее делать ХЗ! Задача состоит в том что одна фигура должна медленно переходить в др., тобишь например шар в куб и т.п. Помогите написать, буду очень признателен

Автор: Mazzi 14.4.2009, 08:57
Предлагаю тебе решить эту задачу следующим образом:

1. Создаёшь сферу из треугольников.
2. Все координаты вершин записываешь в массив.
3. Передвигаешь вершины таким образом, чтобы из треугольников образовался например куб.
4. Все новые координаты вершин записываешь в другой массив.

Теперь для создания анимаци следует сначала отобразить исходную фигуру, а затем на каждом шаге анимации передвигать каждую точку приближая её к положению из второго массива.

Всё.

Удачи!

Автор: sdukshis 14.4.2009, 22:13
Это называется морфинг и описано в некоторых книгах по компьютерной графике

Так же можно посмотреть здесь:
http://pmg.org.ru/nehe/nehe25.htm

Автор: hitman88 15.4.2009, 21:18
Люди я реально не знаком с этим, может кто-нито поможет, плииииииз....

Автор: hitman88 22.4.2009, 22:46
Что люди, не добрых программистов что ли?  smile 

Автор: Mazzi 23.4.2009, 09:05
Напиши в личку.

Автор: goody 29.4.2009, 11:52
Возможно речь идет о твининге.
Вот пример :
Код

#include <stdlib.h>

#include <math.h>

#include <time.h>

#include <stdio.h>

#include <GL/glut.h>  



int Width = 800;

int  Height = 600;

int x[8]={30,30,130,130,110,110,50,50};

int y[8]={200,320,320,200,200,300,300,200};  

int postx[8]={230,230,300,300,260,260,300,300};

int posty[8]={250,370,370,360,360,270,270,250,};





int risx[8]={30,30,130,130,110,110,50,50};

int risy[8]={200,320,320,200,200,300,300,200};

float t=0;

int STOP=0;



void Display(void)  

{

    glClearColor(0, 0, 0, 1);

    glClear(GL_COLOR_BUFFER_BIT); 

    





 glBegin(GL_LINE_LOOP);

 for(int i=0; i<8; i++)

 {

 glVertex2f(risx[i],risy[i]);

    }

 

 

 

 glEnd();











    glutSwapBuffers ();

  glFlush();  

     

}





void Reshape(GLint w, GLint h)  

{

    Width = w;

    Height = h;   

    glViewport(0, 0, w, h);                         

  glMatrixMode(GL_PROJECTION);                               

  glLoadIdentity();             

  glOrtho(0, w, 0, h, -1, 1);        

                                                           

}



void idle()

{

    if(STOP==0){

    for(int i=0; i<8; i++)

    {

        risx[i]=x[i]*(1-t)+t*postx[i];    

        risy[i]=y[i]*(1-t)+t*posty[i];    

    }    

    t+=0.0001;

    if(risx[1]==postx[1] && risy[1]==posty[1])

    STOP=1;

    }

    Display();

    

    

}

 

void Keyboard( unsigned char key, int x, int y ) 

{

#define ESCAPE '\033'



    if( key == ESCAPE )

        exit(0);

}





int main(int argc, char *argv[])  

{

    glutInit(&argc, argv);   



    glutInitDisplayMode(GLUT_RGB|GLUT_DOUBLE);  



    glutInitWindowSize(Width, Height);  

   // glutWindowPosition(0,0);

    glutCreateWindow("ik");  

                                        

    glutIdleFunc(idle);



    glutDisplayFunc(Display); 



    glutReshapeFunc(Reshape); 



    glutKeyboardFunc(Keyboard);  



    glutMainLoop();  



}



Автор: hitman88 5.5.2009, 22:03
А экзешник можно, а то че то не компилиться... ошибки выдает...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)