Gostaria de reagir a esta mensagem? Crie uma conta em poucos cliques ou inicie sessão para continuar.



 
InícioÚltimas imagensProcurarRegistarEntrar
A Equipe Central RPG Maker deseja a todos Boas Vindas!
Olá galera venho aqui pedir para ajuda a vocês pesso que postem conteúdo em nossa comunidade irei ajudar a vocês também.
Agora nossa comunidade também tem o famoso projeto de ouro porem da nossa comunidade leva um nome diferente leva o nome Osca de Ouro entre no tópico de Notícias e fique por dentro das novidades.

 

 [Tutorial]GM3D 03 – Usando Transformações

Ir para baixo 
AutorMensagem
CLS
Membro
Membro
CLS


Sexo : Masculino
Mensagens : 115

[Tutorial]GM3D 03 – Usando Transformações  Empty
MensagemAssunto: [Tutorial]GM3D 03 – Usando Transformações    [Tutorial]GM3D 03 – Usando Transformações  Icon_minitimeDom Dez 12, 2010 9:47 pm

Autor: Kabeção

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.

Na próxima vamos ver como usar e controlar as luzes no mundo.
Até mais.
Ir para o topo Ir para baixo
http://www.totalmakers.forumais.com
 
[Tutorial]GM3D 03 – Usando Transformações
Ir para o topo 
Página 1 de 1
 Tópicos semelhantes
-
» [Tutorial]GM3D 01 - Primeiros passos
» [Tutorial]GM3D 02 – Projeção e Movimento da Câmera
» [Tutorial]Movimentação em Plataforma
» [Tutorial]Dicionário GM
» [Tutorial] Explicação Geral sobre GML

Permissões neste sub-fórumNão podes responder a tópicos
 :: Game Maker :: Tutoriais e Scripts de GM-
Ir para: