Conectar-se
Quem está conectado
31 usuários online :: Nenhum usuário registrado, Nenhum Invisível e 31 Visitantes

Nenhum

Ver toda a lista


Compartilhe
Ver o tópico anteriorIr em baixoVer o tópico seguinte
avatar
Ranking : Sem avaliações
Data de inscrição : 08/06/2008
Número de Mensagens : 2314
Insígnias de JAM :

Insignia 1x 0 Insignia 2x 0 Insignia 3x 0
Reputação : 100

Prêmios
   : 3
   : 0
   : 1
Ver perfil do usuáriohttp://blackcapapps.blogspot.com.br/

GM3D 03 - Usando Transformações

em Ter 18 Ago 2009, 19:57
Reputação da mensagem: 100% (2 votos)
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)
avatar
Data de inscrição : 11/08/2008
Número de Mensagens : 1121
Insígnias de JAM :

Insignia 1x 0 Insignia 2x 0 Insignia 3x 0
Reputação : 3

Prêmios
   :
   :
   :
Ver perfil do usuário

Re: GM3D 03 - Usando Transformações

em Ter 18 Ago 2009, 20:09
KRAK ! Agora eu sei oque é 3d O.o
avatar
Data de inscrição : 16/06/2009
Número de Mensagens : 278
Insígnias de JAM :

Insignia 1x 0 Insignia 2x 0 Insignia 3x 0
Reputação : 1

Prêmios
   :
   :
   :
Ver perfil do usuário

Re: GM3D 03 - Usando Transformações

em Ter 18 Ago 2009, 20:46
Reputação da mensagem: 100% (1 votos)
MUITO BOMMM!!!
avatar
Ranking : Nota C
Notas recebidas : C - C
Data de inscrição : 14/11/2008
Número de Mensagens : 1166
Insígnias de JAM :

Insignia 1x 0 Insignia 2x 0 Insignia 3x 0
Reputação : 9

Prêmios
   : 0
   : 1
   : 0
Ver perfil do usuáriohttp://www.programaCODM.webs.com/

Re: GM3D 03 - Usando Transformações

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©
avatar
Data de inscrição : 05/10/2009
Número de Mensagens : 1830
Insígnias de JAM :

Insignia 1x 0 Insignia 2x 0 Insignia 3x 0
Reputação : 7

Prêmios
   :
   :
   :
Ver perfil do usuário

Re: GM3D 03 - Usando Transformações

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 !
avatar
Data de inscrição : 24/10/2009
Número de Mensagens : 873
Insígnias de JAM :

Insignia 1x 0 Insignia 2x 0 Insignia 3x 0
Reputação : 14

Prêmios
   :
   :
   :
Ver perfil do usuáriohttp://inprovise.blogspot.com/

Re: GM3D 03 - Usando Transformações

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!
avatar
Ranking : Nota B
Notas recebidas : B
Data de inscrição : 25/07/2010
Número de Mensagens : 630
Insígnias de JAM :

Insignia 1x 0 Insignia 2x 0 Insignia 3x 0
Reputação : 4
Ver perfil do usuáriohttp://clubmaker.forumeiros.com

Re: GM3D 03 - Usando Transformações

em Qua 01 Set 2010, 17:30
Cara por favor continua ! a fazer mais tutoriais
avatar
Ranking : Nota A
Notas recebidas : A-A-A-A-B
Data de inscrição : 04/07/2010
Número de Mensagens : 1028
Insígnias de JAM :

Insignia 1x 0 Insignia 2x 0 Insignia 3x 0
Reputação : 42

Prêmios
   : 1
   : 0
   : 1
Ver perfil do usuário

Re: GM3D 03 - Usando Transformações

em Qui 28 Out 2010, 16:58
Os links das engines estão quebrados, das partes 2 e 3.
avatar
Ranking : Sem avaliações
Data de inscrição : 08/06/2008
Número de Mensagens : 2314
Insígnias de JAM :

Insignia 1x 0 Insignia 2x 0 Insignia 3x 0
Reputação : 100

Prêmios
   : 3
   : 0
   : 1
Ver perfil do usuáriohttp://blackcapapps.blogspot.com.br/

Re: GM3D 03 - Usando Transformações

em Sex 29 Out 2010, 12:04
Links consertados!
Parece que eles mudaram sozinhos. oO

Obrigado por avisar.
avatar
Data de inscrição : 20/08/2010
Número de Mensagens : 167
Insígnias de JAM :

Insignia 1x 0 Insignia 2x 0 Insignia 3x 0
Reputação : 0

Prêmios
   : 0
   : 0
   : 0
Ver perfil do usuário

Re: GM3D 03 - Usando Transformações

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?
avatar
Data de inscrição : 27/06/2012
Número de Mensagens : 25
Insígnias de JAM :

Insignia 1x 0 Insignia 2x 0 Insignia 3x 0
Reputação : 1

Prêmios
   : 0
   : 0
   : 0
Ver perfil do usuáriohttp://game-maker-br.blogspot.com.br

Re: GM3D 03 - Usando Transformações

em Sex 29 Jun 2012, 09:14
show muito bom gostei dimais
avatar
Ranking : Nota B
Notas recebidas : B
Data de inscrição : 28/11/2010
Número de Mensagens : 454
Insígnias de JAM :

Insignia 1x 0 Insignia 2x 0 Insignia 3x 0
Reputação : 37

Prêmios
   : 0
   : 0
   : 0
Ver perfil do usuário

Re: GM3D 03 - Usando Transformações

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!
Ver o tópico anteriorVoltar ao TopoVer o tópico seguinte
Permissão deste fórum:
Você não pode responder aos tópicos neste fórum