Zero 0 #1 Posted March 2, 2008 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 #2 Posted April 13, 2008 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
Commander 0 #4 Posted April 13, 2008 Muito Bom kra Mensagem pouco criativa. Reportado. Share this post Link to post Share on other sites
mos 0 #5 Posted April 16, 2008 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 #6 Posted May 15, 2008 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 #7 Posted May 16, 2008 (edited) 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 May 16, 2008 by mos Share this post Link to post Share on other sites
death26 0 #8 Posted May 16, 2008 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 #9 Posted May 17, 2008 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 #10 Posted May 20, 2008 (edited) 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 May 20, 2008 by Gooden Tirando oftopic Share this post Link to post Share on other sites
Black Gooden 0 #11 Posted May 20, 2008 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 #12 Posted March 27, 2009 nao consegui abri D: falta alguma coisa ?? Share this post Link to post Share on other sites
Eventide 7 #13 Posted March 27, 2009 já vi coisa parecida na biblioteca alegro. depois ainda dizem que aula de geometria é inutil. Share this post Link to post Share on other sites
Milus Rox 01 0 #14 Posted March 28, 2009 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 #15 Posted March 29, 2009 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 #16 Posted March 30, 2009 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.. Share this post Link to post Share on other sites
Rdgxnk 0 #17 Posted May 9, 2009 Muito bom tutorial... facil..... Share this post Link to post Share on other sites
kibezx 0 #18 Posted September 12, 2010 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