Entrar
Últimos assuntos
» player não consegue andarpor lovn7 Qui 21 Nov 2024, 13:33
» É possível fazer istó no game maker
por William Lima Qui 21 Nov 2024, 10:56
» Rio Rise - novo launcher do Gta San Andreas SAMP Brasil
por Lua Sáb 16 Nov 2024, 20:22
» (Resolvido) Cenario longo x Texture Pages
por josuedemoraes Sáb 16 Nov 2024, 15:31
» Kids' band
por Adilson Lucindo Santos Sex 15 Nov 2024, 12:23
» (RESOLVIDO) Engasgos-Troca de Sprites/animações
por josuedemoraes Ter 12 Nov 2024, 01:49
» Block Room - DEMO
por Joton Qua 06 Nov 2024, 22:58
» Game Infinito vertical (subindo)
por macmilam Sáb 26 Out 2024, 12:36
» Retorno da GMBR!!!
por Dancity Ter 22 Out 2024, 16:36
» Máquina de estados
por aminaro Qui 10 Out 2024, 13:33
» como faço pra um objeto colidir com o outro e diminuir a vida do player ?
por josuedemoraes Qui 03 Out 2024, 16:51
» RESOLVIDO: Colisão com objetos moveis
por josuedemoraes Qua 02 Out 2024, 20:28
» Crypt of the Blood Moon
por divin sphere Qua 11 Set 2024, 18:18
» como fazer um objeto seguir?
por divin sphere Dom 18 Ago 2024, 18:08
» Procuro de alguém para Modelar/Texturizar/Animar objetos 3D
por un00brn Dom 11 Ago 2024, 11:10
» Destruição de cenário (estilo DD Tank)
por CoronelZeg Sex 09 Ago 2024, 17:16
» RESOLVIDO-Como destruir uma instancia especifica de um objeto
por josuedemoraes Ter 23 Jul 2024, 00:40
» Automatizar a coleta de id
por GabrielXavier Seg 22 Jul 2024, 18:01
» Preciso de ajuda para concluir um pequeno projeto
por lmoura Qui 27 Jun 2024, 15:45
» ANGULO ACOMPANHAR O OBJETO
por Klinton Rodrigues Qui 27 Jun 2024, 08:34
» Musica reinicia quando sala reinicia
por GabrielXavier Ter 18 Jun 2024, 07:28
» como fazer uma copia de gd
por generico_cube Sex 14 Jun 2024, 15:48
» Square Adventure
por guilherme551 Ter 11 Jun 2024, 09:54
» como posso definir limite de uma variavel
por GabrielXavier Sex 07 Jun 2024, 14:14
» [Resolvido] Dúvida, colisão única de objeto
por vdm842 Sex 24 maio 2024, 09:50
GM3D 03 - Usando Transformações
+7
.:Allison:.
moisesBR
fonetico
Kevin
André Gustavo
tata139
Kabeção
11 participantes
GMBR :: Ensine & Aprenda :: Tutoriais :: Game Maker
Página 1 de 1
GM3D 03 - Usando Transformações
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);
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;
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)
Re: GM3D 03 - Usando Transformações
KRAK ! Agora eu sei oque é 3d O.o
tata139- Data de inscrição : 11/08/2008
Reputação : 3
Número de Mensagens : 1121
Prêmios :
x 0 x 0 x 0
x 0 x 0 x 0
x 0 x 0 x 0
André Gustavo- Data de inscrição : 16/06/2009
Reputação : 1
Número de Mensagens : 278
Prêmios :
x 0 x 0 x 0
x 0 x 0 x 0
x 0 x 0 x 0
Re: GM3D 03 - Usando Transformações
Uma Dúvida
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?
VLWs
FLWs
KKG
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?
VLWs
FLWs
KKG
Re: GM3D 03 - Usando Transformações
Seria bom algumas fotos né? Pra deixar o tópico mais elegante, charmoso e que chame atenção.
Gostei muito do tópico, está muito bem explicado parabéns !
Gostei muito do tópico, está muito bem explicado parabéns !
fonetico- Data de inscrição : 05/10/2009
Reputação : 7
Número de Mensagens : 1830
Prêmios :
x 0 x 0 x 0
x 0 x 0 x 0
x 0 x 0 x 0
Re: GM3D 03 - Usando Transformações
souza, se ocê soubesse o trampo q dá colocar imagens... se o cêw tem outra maeneira me fala aí! valew!
Re: GM3D 03 - Usando Transformações
Os links das engines estão quebrados, das partes 2 e 3.
Fuzenrad- Games Ranking :
Notas recebidas : A-A-A-A-B
Data de inscrição : 04/07/2010
Reputação : 46
Número de Mensagens : 1063
Prêmios :
x 0 x 0 x 0
x 1 x 0 x 1
x 0 x 0 x 0
Re: GM3D 03 - Usando Transformações
Links consertados!
Parece que eles mudaram sozinhos. oO
Obrigado por avisar.
Parece que eles mudaram sozinhos. oO
Obrigado por avisar.
Re: GM3D 03 - Usando Transformações
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?
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- Data de inscrição : 20/08/2010
Reputação : 0
Número de Mensagens : 167
Prêmios :
x 0 x 0 x 0
x 0 x 0 x 0
x 0 x 0 x 0
Re: GM3D 03 - Usando Transformações
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!
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- Games Ranking :
Notas recebidas : B
Data de inscrição : 28/11/2010
Reputação : 58
Número de Mensagens : 504
Prêmios :
x 0 x 0 x 0
x 0 x 0 x 0
x 0 x 0 x 0
Plataformas :- Game Maker Studio 1.4
- Game Maker Studio 2.0
Tópicos semelhantes
» Criando Transformações
» GM3D 01 - Primeiros passos
» [Curso Gm 3D] Aula 5: TRANSFORMAÇÕES
» Problema com transformações de sprite e com inimigo
» Luzes do GM3D
» GM3D 01 - Primeiros passos
» [Curso Gm 3D] Aula 5: TRANSFORMAÇÕES
» Problema com transformações de sprite e com inimigo
» Luzes do GM3D
GMBR :: Ensine & Aprenda :: Tutoriais :: Game Maker
Página 1 de 1
Permissões neste sub-fórum
Não podes responder a tópicos