Entrar
Últimos assuntos
» Procuro Programador de game makerpor Wou Sex 15 Mar 2024, 10:27
» Retorno da GMBR!!!
por vinians Qui 14 Mar 2024, 19:07
» Mod APK
por gamerainha Qua 13 Mar 2024, 06:30
» Mudar cor de apenas uma palavra
por lunalol Sex 01 Mar 2024, 13:42
» Aceito pedidos de sprites (Com exemplos meus)
por Sevilha Qua 28 Fev 2024, 12:17
» Inventário simples
por Isquilo_Roedor Qui 22 Fev 2024, 15:18
» Problemas na programaçnao de inimigo [jogo DOOM LIKE]
por Black Mirror Dom 11 Fev 2024, 13:34
» ANDROID MULTI TOUCH
por DiegoBr Dom 04 Fev 2024, 12:13
» Servidor de Discord do fórum?
por Lighter Sáb 27 Jan 2024, 17:18
» Save e Load Json
por Klinton Rodrigues Qui 25 Jan 2024, 11:12
» Colisão com mais de um objeto
por aminaro Seg 22 Jan 2024, 15:02
» Oi sou novo aqui
por Thiago Silveira Alexandre Sáb 20 Jan 2024, 20:55
» Como acessar conteudo comprado no marketplace
por macmilam Sex 19 Jan 2024, 07:42
» Devlogs em vídeos do Block Room
por Joton Seg 15 Jan 2024, 16:56
» Alguém aqui já ganha dinheiro com seus games?
por Joton Seg 15 Jan 2024, 16:49
» ACERVO GMBR MAGAZINE
por Joton Qui 11 Jan 2024, 19:21
» como aumentar o obj sem aumentar a colisão??
por GabrielXavier Qua 10 Jan 2024, 07:21
» Asteroid Core - Early Acesse Update [0.2.0.0]
por JOZ. Seg 08 Jan 2024, 14:39
» Versionamento de código com GitHub
por GabrielXavier Seg 08 Jan 2024, 07:32
» Rio Rise - novo launcher do Gta San Andreas SAMP Brasil
por kolesovsup Sex 29 Dez 2023, 07:16
» a funçao approach ainda existe?
por PEDRINDEV Ter 26 Dez 2023, 20:05
» Inimigo ataca até por trás! >:(
por saim Sex 22 Dez 2023, 08:55
» [RESOLVIDO]Spawn após morte
por Deception_1999 Dom 17 Dez 2023, 16:39
» Remunerado $$$ - Procuro programador para ajudar a "montar" um jogo
por theguitarmester Sáb 02 Dez 2023, 16:28
» Game maker nao abre
por Cerf Dom 26 Nov 2023, 12:01
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