Jump to content
Sign in to follow this  
Zero

Animação 3D em C

Recommended Posts

Zero    0
Zero

Hoje desenvolvi uma função que criava um cubo em 3D, na linguagem C.

Postei aqui no fórum, mas parece que o novo sistema faz com que o tópico só seja visível quando um moderador aprova.

Felizmente eu desenvolvi uma função que gera movimento ao cubo antes de qualquer moderador aprovar meu tópico anterior.

 

O movimento é rotativo, isto é: o cubo gira em seu próprio eixo.

 

É um ótimo exemplo pra quem está começando a programar com gráficos em C.

 

Minha função:

void drawCube2(int x, int y, int aresta, int ir)
{
   int i;
   float dif = (aresta / 2); /* constante diferenca */

   if(ir > aresta / 2)
   {
       ir = ir % (aresta / 2);
   }

   /* Quadrado Principal */
   line(x, y + (2 * ir), x - ir, y + aresta - ir);
   line(x, y + (2 * ir), x + aresta, y + (2 * ir));
   line(x + aresta, y + (2 * ir), x + aresta - ir, y + aresta - ir);
   line(x + aresta - ir, y + aresta - ir, x - ir, y + aresta - ir);

   /* Arestas que ligam os dois quadrados */
   line(x, y + (2 * ir), x - dif + ir, y - dif + ir);
   line(x + aresta, y + (2 * ir), x + dif + ir, y - dif + ir);
   line(x - ir, y + aresta - ir, x - dif, y + dif - (2 * ir));
   line(x + aresta - ir, y + aresta - ir, x + dif, y + dif - (2 * ir));

   x = x - dif;
   y = y - dif;

   /* Quadrado Secundario */
   line(x + ir, y + ir, x, y + aresta - (2 * ir));
   line(x + ir, y + ir, x + aresta + ir, y + ir);
   line(x + aresta + ir, y + ir, x + aresta, y + aresta - (2 * ir));
   line(x + aresta, y + aresta - (2 * ir), x, y + aresta - (2 * ir));
}

Explicação das variáveis de chamada:

X e Y são as coordenadas X e Y do ponto superior esquerdo do quadrado principal do cubo.

 

Aresta é o comprimento de cada "traço" que compõe o cubo.

 

ir é o índice de rotação. Um sistema que eu criei para alterar o desenho do cubo em seu próprio eixo, fazendo o efeito de rotação.

 

Note que o índice de rotação deve valer de 0 até a metade do valor da aresta.

Logo 0 e (aresta / 2) é o estado estático do cubo.

 

Um exemplo que eu criei em que o cubo da 5 voltas e para, daí você pressiona qualquer tecla e a aplicação é finalizada:

/* Animação 3D, por Zero */
#include <stdio.h>
#include <conio.h>
#include <dos.h>
#include <graphics.h>

int main()
{
   /* VARIAVEIS */
   int far *gDriver, *gMode;
   int color = WHITE;
   int i;

   /* FUNCOES */
   void drawCube2(int, int, int, int);

   /* Inicia componentes graficos */
   detectgraph(gDriver, gMode);
   initgraph(gDriver, gMode, '');

   for(i = 0; i <= 40 * 5; i ++)
   {
       cleardevice();
       drawCube2(450, 200, 80, i);
       delay(25000);
   }

   /* Fecha componentes graficos e encerra o programa */
   getch();
   closegraph();
   return 1;
}

void drawCube2(int x, int y, int aresta, int ir)
{
   int i;
   float dif = (aresta / 2); /* constante diferenca */

   if(ir > aresta / 2)
   {
       ir = ir % (aresta / 2);
   }

   /* Quadrado Principal */
   line(x, y + (2 * ir), x - ir, y + aresta - ir);
   line(x, y + (2 * ir), x + aresta, y + (2 * ir));
   line(x + aresta, y + (2 * ir), x + aresta - ir, y + aresta - ir);
   line(x + aresta - ir, y + aresta - ir, x - ir, y + aresta - ir);

   /* Arestas que ligam os dois quadrados */
   line(x, y + (2 * ir), x - dif + ir, y - dif + ir);
   line(x + aresta, y + (2 * ir), x + dif + ir, y - dif + ir);
   line(x - ir, y + aresta - ir, x - dif, y + dif - (2 * ir));
   line(x + aresta - ir, y + aresta - ir, x + dif, y + dif - (2 * ir));

   x = x - dif;
   y = y - dif;

   /* Quadrado Secundario */
   line(x + ir, y + ir, x, y + aresta - (2 * ir));
   line(x + ir, y + ir, x + aresta + ir, y + ir);
   line(x + aresta + ir, y + ir, x + aresta, y + aresta - (2 * ir));
   line(x + aresta, y + aresta - (2 * ir), x, y + aresta - (2 * ir));
}

 

Programa com a animação: http://rapidshare.com/files/96573512/3D_em_C.zip.html

 

Abraços !

Share this post


Link to post
Share on other sites
mos    0
mos

Cara, tentei de todo jeito visualizar aqui, mas tá dando erro. Tanto o executável que você postou, quanto ao código. Dá erro ao compilar o código e dá erro ao executar o executável.

 

Talvez seja a biblioteca graphics.h, talvez as funções não-declaradas, sei lá, tem tanto erro que nem quero corrigir.

Share this post


Link to post
Share on other sites
iuniX    4
iuniX

Muito Bom kra :D

Share this post


Link to post
Share on other sites
Commander    0
Commander
Muito Bom kra :D

 

Mensagem pouco criativa.

Reportado.

Share this post


Link to post
Share on other sites
mos    0
mos

Além de pouco criativa, talvez iunix nem tenha chegado a testar...

Eu mesmo testei e não pegou aqui, não sei o porquê.

Share this post


Link to post
Share on other sites
death26    0
death26

Mensagem pouco criativa? Sinceramente, nunca gostei dessas coisas no fórum, o cara foi reportado por elogiar o programa, porque? um elogio deveria ser +/- como isso?: "Muito bom cara, achei legal, ótimo, adorei, gostei muito, parabéns, legal d+ ta?"?

Elogios não têm que ter criatividade, não concorda?

 

Quanto ao programa, interessante, muito interessante. Uma coisa que eu não sabia era programação gráfica com essa biblioteca graphics.h...

Eu diria que se alguém quer programar graficamente com c++, use uma engine ja criada pela microsoft (direct X) ou pela Silicon Graphics (OpenGL). OpenGL é interessantíssima e ja inclui funções de rotação de câmera, colisão, luz, neblina, rotação de objetos, etc...

Está de parabéns com seu programa, e se quer ter uma idéia de engines de jogos 3D baixe o SDK do half-life e começe a estudá-lo. Estou desenvolvendo um MOD de half-life e se aprende muito sobre engine 3D nele.

Abraços

Share this post


Link to post
Share on other sites
mos    0
mos

Você chegou a testá-lo?

Aqui nem chega a compilar...

 

Obs: eu fiz o download do executável disponibilizado, mas quando vou rodar ele simplesmente abre e fecha, num vejo nada aparecer na tela antes de fechar.

Edited by mos

Share this post


Link to post
Share on other sites
death26    0
death26

Eu testei sim, não tenho a biblioteca graphics.h

Para compilar com bibliotecas assim tem que configurar o compilador direitinho, além de incluir graphics.h no diretorio include do compilador e talvez algum .lib

Abraços

Share this post


Link to post
Share on other sites
mos    0
mos

Acho que o desenvolvedor do programa deveria postar o que necessita para compilar.

Share this post


Link to post
Share on other sites
smeagoulh    0
smeagoulh

muito interessante, eu também estou começando a praticar esse tipo de coisa gráfica a esse nível, mas em Delphi, introduzindo trigonometria que aprendo na aula e dando uns toques meus :].

Edited by Gooden
Tirando oftopic

Share this post


Link to post
Share on other sites
Black Gooden    0
Black Gooden

Todos os posts foram Apagados por nao terem a haver com o topico.

Share this post


Link to post
Share on other sites
Akio182    0
Akio182

nao consegui abri D:

falta alguma coisa ??

Share this post


Link to post
Share on other sites
Eventide    7
Eventide

já vi coisa parecida na biblioteca alegro.

depois ainda dizem que aula de geometria é inutil. :P

Share this post


Link to post
Share on other sites
Milus Rox 01    0
Milus Rox 01

Cara, tentei varias vezes e não deu certo...

Da 2 tipos de erros e naão abre....

Share this post


Link to post
Share on other sites
Kah~    0
Kah~
Mensagem pouco criativa.

Reportado.

 

 

Se ele gosto do topico, ele pode dar sua opinião seja curta ou não - Isso não foi nada de flood, pois ele estava falando a verdade...vai reportar algo que está se manifestando com o gosto de uma pessoa.

 

Cresce :yes:

 

@Topic

 

Poxa vei, n consigui abrir o treko porqe meu pc é sux pakas n tem plaka de video :|

Share this post


Link to post
Share on other sites
Eventide    7
Eventide

lembrando que vocês devem ter a biblioteca gráfica que ele usa..

(ele não explicou qual h3h3)

 

por isso não deve ter dado certo.. :P

Share this post


Link to post
Share on other sites
Rdgxnk    0
Rdgxnk

Muito bom tutorial...

 

facil.....

Share this post


Link to post
Share on other sites
kibezx    0
kibezx

Po podia por uma SS de exemplo dessa animação em 3D

mas parece ser bem interessante

Share this post


Link to post
Share on other sites
Guest
This topic is now closed to further replies.
Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

×