GM3D 03 - Usando Transformações

Ver o tópico anterior Ver o tópico seguinte Ir em baixo

Qualidade GM3D 03 - Usando Transformações

Mensagem por Kabeção em Ter 18 Ago 2009, 19:57

GM3D 03 – Usando Transformações

As transformações em D3D são usadas para rotacionar um modelo no jogo. Há também a possibilidade de escalar o objeto aumento ou diminuindo seu tamanho mas isso não é aconselhável se você usar iluminação no jogo porque tem um bug no GM que calcula as normais (projeção da textura) erradas fazendo o modelo escurecer cada vez que é aumentado.


Transformações

Para rotacionar ou escalar um objeto você precisara usar as transformação D3D. Todas as suas funções começam com a expressão “d3d_transform_”.

Primeiro você precisa definir o que será transformado senão os efeitos serão aplicados no mundo todo.
Para isso existe uma função que identifica o que esta sendo desenhado e aplica os efeitos apenas neles. Ela é a “d3d_transform_set_identity()”.

Outra coisa importante é que as transformação são aplicadas usando o ponto de origem da room (que é 0,0,0 para x,y,z) e não o do objeto, ou seja, quanto você rodar um modelo ele vai girar em torno do ponto 0 da room e não em torno de si mesmo (como a Terra girando em torno do Sol).

Para resolver isso alem de usar “d3d_transform_set_identity” você também usará a função “d3d_transform_add_translation(x,y,z);” que defini que a transformação será aplicada em torno dos argumentos x,y,z.

Veja um exemplo:
Código:
d3d_transform_set_identity();

d3d_transform_add_translation(x,y,z);
d3d_draw_model(modelo,0,0,0,textura);

d3d_transform_set_identity();

Explicando linha por linha:

d3d_transform_set_identity(); – identifica o que vai ser afetado. Note que há também um no final do código, isso quer dizer que todo que esta entre essas funções será alterado.

d3d_transform_add_translation(x,y,z) – defini o ponto de origem das transformações. Os modelos também serão desenhados a partir dele (é como se fossem os novos pontos x, y e z do objeto).

d3d_draw_model(modelo,0,0,0,textura) – desenha o modelo. Note que os pontos x,y,z são definidos como 0. Por que?
A resposta é simples. Quanto eu usei d3d_transform_add_translation(x,y,z) os argumentos x,y,z dele se tornaram os novos pontos de origem do modelo. Tudo que for desenhado entre os identificadores será relativo a esta nova origem.
Se o modelo fosse desenhado em 10,15,8:
Código:
d3d_transform_add_translation(x,y,z);
d3d_draw_model(modelo,10,15,8,textura);
Seria o mesmo que desenhá-lo na posição x+10,y+15,z+8 na room.

d3d_transform_set_identity(); – por último outro identificador. Lembrando que tudo que estiver entre ele e o primeiro será afetado.


Uma coisa interessante é que as transformações funcionam em qualquer tipo de desenho do GM. Você também pode usá-las na hora de desenhar uma sprite, background ou texto!


Continuando a engine

Abra a engine que fez seguindo as outras aulas ou baixe por este link.

Antes de continuar com as explicações vamos resolver um bug nessa engine.
O movimenta da câmera não esta seguindo direito o movimento do personagem. Quanto nós movimentamos o objeto a câmera puxa pros lados.
Para resolver isso apague as linhas de código abaixo no evento Step e coloque-os no evento Draw antes da função de projeção no objCamera:
Código:
 // Calculando posição da camera no mundo
x = obj1.x+dx*zoom;
y = obj1.y+dy*zoom;
z = obj1.z+dz*zoom;

// Movimento no personagem
px = obj1.x;
py = obj1.y;
pz = obj1.z;

O evento Step ficará assim:
Código:
 // Definindo angulos a partir do mouse
zang-=(window_mouse_get_x()-200)/8;
yang-=(window_mouse_get_y()-200)/8;
window_mouse_set(200,200);
yang=median(yang,-89,89);

// Animação da camera

// calculando movimento dos vetores da camera
dx=cos(degtorad(zang));
dy=-sin(degtorad(zang));
dz=tan(degtorad(yang));

// normalizar vetores
// torna movimento da camera totalmente esferico.
m=sqrt(sqr(dx)+sqr(dy)+sqr(dz));
dx/=m;
dy/=m;
dz/=m;

// Zoom
if keyboard_check(vk_add) zoom += 4;
if keyboard_check(vk_subtract) zoom -= 4;

E o evento Draw assim:
Código:
 // Calculando posição da camera no mundo
x = obj1.x+dx*zoom;
y = obj1.y+dy*zoom;
z = obj1.z+dz*zoom;

// Movimento no personagem
px = obj1.x;
py = obj1.y;
pz = obj1.z;

d3d_set_projection_ext(x,y,z,px,py,pz,0,0,1,90,1.3,1,32000);

Agora sim a camera está ótima.
Mude o desenho do cubo para uma forma mais achatada para dar uma impressão de ser um carro.
Troque os valores no código que desenha o cubo no evento Draw do obj1:
Código:
d3d_draw_block(-16,-32,-10,16,32,10,tex,1,1);

Agora está tudo pronto para a próxima explicação.


Rotação e Escalação

As funções seguintes podem ser usadas para rotacionar e escalar os objetos:

d3d_transform_add_rotation_x(angle) – Gira o objeto em torno do eixo x.

d3d_transform_add_rotation_y(angle) – Gira o objeto em torno do eixo y.

d3d_transform_add_rotation_z(angle) – Gira o objeto em torno do eixo z.

d3d_transform_add_scaling(xs,ys,zs) – Altera a escala nos eixos x, y e z.

Vamos fazer um teste na nossa engine para entender o funcionamento.
Crie variaveis rx, ry e rz no evento Create do obj1:
Código:
rx = 0;
ry = 0;
rz = 0;
Ela será o valor do ângulo das rotações.

No evento Step adicione isso para mudar os ângulos com os números do teclado numérico:

Código:
if keyboard_check(vk_numpad1) rx += 1;
if keyboard_check(vk_numpad4) rx -= 1;
if keyboard_check(vk_numpad2) ry += 1;
if keyboard_check(vk_numpad5) ry -= 1;
if keyboard_check(vk_numpad6) rz += 1;
if keyboard_check(vk_numpad3) rz -= 1;

No evento Draw vamos adicionar a função de rotação dos eixos.
Elas devem estar sempre antes da função d3d_transform_add_translation.
A parte que desenha o cubo ficará assim:
Código:
d3d_transform_set_identity()

d3d_transform_add_rotation_x(rx);
d3d_transform_add_rotation_y(ry);
 
d3d_transform_add_rotation_z(rz);
d3d_transform_add_translation(x,y,z);
d3d_draw_block(-16,-32,-10,16,32,10,tex,1,1);

d3d_transform_set_identity()

Teste o jogo e aperte 1 e 4 para girar no eixo x, 2 e 5 para girar no eixo y e 3 e 6 para girar no eixo z.

Notou a diferença entre eixo x, y e z?

Bom, agora é hora de testar as escalas.
No evento Create do obj1 adicione mais variáveis para cada escala:
Código:
sx = 1;
sy = 1;
sz = 1;

E no Step o código para mudar as escalar:
Código:
if keyboard_check(vk_delete) sx += 0.1;
if keyboard_check(vk_insert) sx -= 0.1;
if keyboard_check(vk_end) sy += 0.1;
if keyboard_check(vk_home) sy -= 0.1;
if keyboard_check(vk_pagedown) sz += 0.1;
if keyboard_check(vk_pageup) sz -= 0.1;

No evento Draw adicione a função para escalar o modelo também sempre antes de d3d_transform_add_translation.
Código:
d3d_transform_set_identity()

d3d_transform_add_rotation_x(rx);
d3d_transform_add_rotation_y(ry);
d3d_transform_add_rotation_z(rz);
d3d_transform_add_scaling(sx,sy,sz);
d3d_transform_add_translation(x,y,z);
d3d_draw_block(-16,-32,-10,16,32,10,tex,1,1);

d3d_transform_set_identity()

Teste e use Delete e Insert para mudar o eixo x, End e Home para o eixo y, Page Up e Page Down para o eixo z.

Copie essa engine com outro nome se quiser para fazer testes mais tarde.
Agora vamos fazer nosso “carro” andar!


Movimentação

A movimentação dessa engine será da seguinte forma:
As teclas A e D giram o objeto, W e S acelera e desacelera, C muda o modo da câmera.

Apague as novas variáveis que criamos e faça apenas uma para a rotação r, y_speed para a velocidade e mude o valor z para 16.
Evento Create Completo:
Código:
z = 16;
tex = background_get_texture(background0);
tex2 = background_get_texture(background1);

x = 96;
y = 96;

r = 0;        // rotação z
y_speed = 10;  // velocidade

Apague todo o código no evento Step e coloque este para girar o carro para os lados:
Código:
if keyboard_check(ord('A')) r += 2;
if keyboard_check(ord('D')) r -= 2;

O carro tem que andar na direção que esta virado então temos que usar cos e sin para achar x e y de acordo com o ângulo.
No evento Step adicione este código:
Código:
if keyboard_check(ord('W'))
{
    x += cos(degtorad(r+90))*y_speed;
    y -= sin(degtorad(r+90))*y_speed;
}
if keyboard_check(ord('S'))
{
    x -= cos(degtorad(r+90))*y_speed;
    y += sin(degtorad(r+90))*y_speed;
}

O “r+90” ajeita o ângulo de calculo para faze-lo correr na direção certa.

Por ultimo deixe o evento Draw desta forma:
Código:
d3d_transform_set_identity()

d3d_transform_add_rotation_z(r);
d3d_transform_add_translation(x,y,z);
d3d_draw_block(-16,-32,-10,16,32,10,tex,1,1);

d3d_transform_set_identity()

d3d_draw_floor(0,0,0,room_width*3,room_height*3,0,tex2,10,10);

Isso muda a rotação do eixo z e aumento o tamanho do chão.
Teste o jogo é veja o resultado!

A engine pronta pode ser baixada aqui:
Código:
http://www.mediafire.com/?amdjj5mal4r

Na próxima vamos ver como usar e controlar as luzes no mundo.
Até mais.


Última edição por Kabeção em Sex 29 Out 2010, 12:03, editado 3 vez(es)

Kabeção

Ranking : Sem avaliações
Número de Mensagens : 2314
Data de inscrição : 08/06/2008
Reputação : 100
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 3
   : 0
   : 1

http://blackcapapps.blogspot.com.br/

Voltar ao Topo Ir em baixo

Qualidade Re: GM3D 03 - Usando Transformações

Mensagem por tata139 em Ter 18 Ago 2009, 20:09

KRAK ! Agora eu sei oque é 3d O.o

tata139

Número de Mensagens : 1121
Data de inscrição : 11/08/2008
Reputação : 3
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   :
   :
   :

Voltar ao Topo Ir em baixo

Qualidade Re: GM3D 03 - Usando Transformações

Mensagem por André Gustavo em Ter 18 Ago 2009, 20:46

MUITO BOMMM!!!

André Gustavo

Número de Mensagens : 278
Data de inscrição : 16/06/2009
Reputação : 1
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   :
   :
   :

Voltar ao Topo Ir em baixo

Qualidade Re: GM3D 03 - Usando Transformações

Mensagem por Kevin em Sex 27 Nov 2009, 17:10

Uma Dúvida Happy

Bem.. Vi Todos os Tutoriais dele XD

só que.... os Objetos que eu crio... com os códigos que ele deu... Ficam Sempre na Posição x=0 e y=0... e coloco mais de 1 do mesmo estilo eles somem da room e ficam no fundo :S

alguém poderia dar um help? Happy

VLWs

FLWs

KKG©

Kevin

Ranking : Nota C
Número de Mensagens : 1166
Idade : 22
Data de inscrição : 14/11/2008
Notas recebidas : C - C
Reputação : 9
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 1
   : 0

http://www.programaCODM.webs.com/

Voltar ao Topo Ir em baixo

Qualidade Re: GM3D 03 - Usando Transformações

Mensagem por fonetico em Sex 27 Nov 2009, 17:51

Seria bom algumas fotos né? Pra deixar o tópico mais elegante, charmoso e que chame atenção.

Happy

Gostei muito do tópico, está muito bem explicado parabéns !

fonetico

Número de Mensagens : 1830
Idade : 21
Data de inscrição : 05/10/2009
Reputação : 7
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   :
   :
   :

Voltar ao Topo Ir em baixo

Qualidade Re: GM3D 03 - Usando Transformações

Mensagem por moisesBR em Qui 03 Dez 2009, 13:59

souza, se ocê soubesse o trampo q dá colocar imagens... se o cêw tem outra maeneira me fala aí! valew!

moisesBR

Número de Mensagens : 873
Idade : 40
Data de inscrição : 24/10/2009
Reputação : 14
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   :
   :
   :

http://inprovise.blogspot.com/

Voltar ao Topo Ir em baixo

Qualidade Re: GM3D 03 - Usando Transformações

Mensagem por .:Allison:. em Qua 01 Set 2010, 17:30

Cara por favor continua ! a fazer mais tutoriais

.:Allison:.

Ranking : Nota B
Número de Mensagens : 630
Idade : 19
Data de inscrição : 25/07/2010
Notas recebidas : B
Reputação : 4
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

http://clubmaker.forumeiros.com

Voltar ao Topo Ir em baixo

Qualidade Re: GM3D 03 - Usando Transformações

Mensagem por Fuzenrad em Qui 28 Out 2010, 16:58

Os links das engines estão quebrados, das partes 2 e 3.

Fuzenrad

Ranking : Nota A
Número de Mensagens : 1026
Idade : 26
Data de inscrição : 04/07/2010
Notas recebidas : A-A-A-A-B
Reputação : 41
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 0
   : 1

Voltar ao Topo Ir em baixo

Qualidade Re: GM3D 03 - Usando Transformações

Mensagem por Kabeção em Sex 29 Out 2010, 12:04

Links consertados!
Parece que eles mudaram sozinhos. oO

Obrigado por avisar.

Kabeção

Ranking : Sem avaliações
Número de Mensagens : 2314
Data de inscrição : 08/06/2008
Reputação : 100
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 3
   : 0
   : 1

http://blackcapapps.blogspot.com.br/

Voltar ao Topo Ir em baixo

Qualidade Re: GM3D 03 - Usando Transformações

Mensagem por M.F-Sasuke em Sex 17 Dez 2010, 21:08

caraca muleke essas suas 3 engines fikaram mto massa!!!
Da pra invés de um cubo colocar um sprite de um personagem? Como eu faço isso? Da para limitar o obj1 pra ele ñ sair do xadrez?

M.F-Sasuke

Número de Mensagens : 167
Idade : 19
Data de inscrição : 20/08/2010
Reputação : 0
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Qualidade Re: GM3D 03 - Usando Transformações

Mensagem por lolkack em Sex 29 Jun 2012, 09:14

show muito bom gostei dimais

lolkack

Número de Mensagens : 25
Data de inscrição : 27/06/2012
Reputação : 1
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

http://game-maker-br.blogspot.com.br

Voltar ao Topo Ir em baixo

Qualidade Re: GM3D 03 - Usando Transformações

Mensagem por NPH em Sab 06 Abr 2013, 22:38

Muito Obrigado Kabeção! Seu tutorial me ajudou com uma dúvida frustrante sobre rotação d3d!
Se não tivesse pesquisado, seria certeza que teria um novo tópico com uma dúvida assim:
título: "[Dúvida] Rotação D3D"
Assunto: "Me expliquem como posso fazer uma rotação em D3D no gm!"
E com um texto longo no qual ninguém teria coragem de ler...
Muito obrigado novamente!

NPH

Ranking : Nota B
Número de Mensagens : 452
Idade : 22
Data de inscrição : 28/11/2010
Notas recebidas : B
Reputação : 32
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Qualidade Re: GM3D 03 - Usando Transformações

Mensagem por Conteúdo patrocinado Hoje à(s) 01:58


Conteúdo patrocinado


Voltar ao Topo Ir em baixo

Ver o tópico anterior Ver o tópico seguinte Voltar ao Topo

- Tópicos similares

 
Permissão deste fórum:
Você não pode responder aos tópicos neste fórum