terça-feira, 21 de fevereiro de 2012

[Curso Gm 3D] Aula 5: TRANSFORMAÇÕES

ENGINE: Game Maker
NÍVEL: intermediário
TEMA: Game Maker, Transformações.
PRÉVIA:Nesta aula, vamos falar sobre transformações, que são ações aplicadas sobre os nossos shapes e modelos,afim de move-los,escala-los ou rotaciona-los .
DIREITOS: Este tutorial não pode ser copiado nem exibido em outros locais na internet sem a devida autorização do autor.Caso tenha interesse em usá-lo ,contate-me.


                                          INTRODUÇÃO

As transformações no Game Maker são um ponto forte dos jogos 3D.
As ações usadas são: Escala,Rotação e Posição, elas nos permitem alterar um modelo mesmo após definido sua forma e atributos básicos.
Elas devem ser usadas no evento draw do objeto, englobando o código de modelagem do mesmo.
Para entender como elas funcionam,vamos relembrar o conceito de eixos,explicados ao longo das nossas aulas anteriores:
A terceira dimensão trabalha com 3eixos: x,y e z , estes eixos são a base para se aplicar uma transformação de forma adequada.
Por padrão, os eixos são a orgem da room(0,0,0), mas podemos mudá-lo,de acordo com a nossa nescessidade.
Para isso usaremos o método de transformações.

A estrutura de uma transformação é a seguinte:

1º- d3d_transform_set_identity()
iniciamos o modo de transformação.

2º- d3d_transform_add_...
aplicamos a transformação.

3º- d3d_transform_set_translation(xt,yt,zt)
definimos os eixos a se desenhar o modelo.

4º- d3d_draw_...
desenhamos o modelo.

5º- d3d_transform_set_identity()
terminamos o modo de transformação.

Seguindo este método, nós conseguiremos Transformar o modelo desejado.


                                             OS EIXOS

Os eixos vão determinar a posição na room, onde tudo vai acontecer.
Se vc quer que o modelo tenha as transformações aplicados em torno de si mesmo, vc deve definir a posição dele como eixo: (x,y,z).
Mas se deseja aplicar as transformações num local exato na room, você pode definir este local, como eixo. Por exemplo:(20,20,0)
Note que quando você define um eixo,com a posição exata, você não poderá mover seu modelo,pois não tem uma variável de referência para isso!
O mesmo vai ocorrer com as transformações, caso use um valor exato, não conseguirá alterá-lo em runtime, pois vc não definiu uma variável para isso.

Portanto, a regra para se obter o resultado esperado é a seguinte:
-Se o seu modelo, nunca vai sair do lugar,ou se vc está usando um objeto para desenhar modelos em vários locais na room, que vc sabe extamente onde é.
Exemplo:(Uma casa.)
Use um eixo fixo,com o valor que você deseja.

-Se o seu modelo vai se mover,ou se você tem um objeto específicamente pra ele.
Exemplo:(Um carro que se move.)
Use um eixo com variáveis(de preferência: x,y,z), assim vc pode movê-lo alterando o valor delas.

-Se seu modelo terá uma transformação definida,e não pretende mudá-la.
Exemplo:(uma casa,girada 90graus em torno de si.)
Use um valor exato para transformar.

-Se seu modelo terá transformações que mudam ao longo do jogo.
Exemplo:(Um carro que se move.)
Use varáveis para as transformações,assim vc pode transformá-la alterando o valor delas.


                                             ESCALA

O modo escalar é usado quando se deseja alterar o tamanho do modelo,sem ter que mecher nas suas coordenadas.
A função que o representa é a seguinte:
d3d_transform_add_scaling(xs,ys,zs)

Onde xs,ys e zs, são os valores de escala do objeto.
Tenha o valor 1 como padrão, tudo que for acima dele, vai aumentar o objeto, e o que for abaixo irá diminuir.



                                             ROTAÇÃO

A rotação é usada para fazer com que um modelo gire em torno de um eixo.
Pode ser feita pelas seguintes funções:
d3d_transform_add_rotation_x(Ângulo)
d3d_transform_add_rotation_y(Ângulo)
d3d_transform_add_rotation_z(Ângulo)
d3d_transform_add_rotation_axis(xa,ya,za,Ângulo)

Onde Ângulo é o valor que se deseja girar o modelo.
xa,ya e za seriam os eixos a serem transformados.


                                               POSIÇÃO

A posição do modelo é definida pelo eixo configurado para transformação,e portanto não se define uma função para alterá-la.
Isso deve ser feito manualmente por vc, criando variáveis para representar os eixos, e alterando elas, para mover o modelo.



                                               PRÁTICA

Como de costume, vamos praticar o que aprendemos aqui, para reforçar nossas idéias.

*Abra a engine construída na segunda aula,se não tem , baixe-a AQUI.

*Crie uma background no tamanho: 128x128, e coloque o nome de bplayer.

*Crie um objeto, e ponha o nome dele de: oplayer.

-No create dele,coloque o seguinte código:
//criamos a var z,para guardar a altura
z=10
//criamos as vars que vão guardar a quantia de rotação em cada eixo:
rx=0
ry=0
rz=0
//criamos as vars que vão guardar a quantia de escala em cada eixo:
xs=1
ys=1
zs=1


-Agora, ponha no Step:
//controles de rotação
if keyboard_check(ord("X"))
{
if keyboard_check(vk_add) rx+=2
if keyboard_check(vk_subtract) rx-=2
}

if keyboard_check(ord("Y"))
{
if keyboard_check(vk_add) ry+=2
if keyboard_check(vk_subtract) ry-=2
}

if keyboard_check(ord("Z"))
{
if keyboard_check(vk_add) rz+=2
if keyboard_check(vk_subtract) rz-=2
}

//controles de escala
if keyboard_check(ord("S"))
{
if keyboard_check(ord("X"))
{
if keyboard_check(vk_add) xs+=1
if keyboard_check(vk_subtract) xs-=1
}

if keyboard_check(ord("Y"))
{
if keyboard_check(vk_add) ys+=1
if keyboard_check(vk_subtract) ys-=1
}

if keyboard_check(ord("Z"))
{
if keyboard_check(vk_add) zs+=1
if keyboard_check(vk_subtract) zs-=1
}
}

-E por fim, coloque no Draw:
//inicia o modo de transformações:
d3d_transform_set_identity();
//aplica escala ao modelo:
d3d_transform_add_scaling(xs,ys,zs)
//aplica rotação ao eixo x:
d3d_transform_add_rotation_x(rx);
//aplica rotação ao eixo y:
d3d_transform_add_rotation_y(ry);
//aplica rotação ao eixo z:
d3d_transform_add_rotation_z(rz);
//Define os eixos para modelagem:
d3d_transform_add_translation(x,y,z);
//desenha o modelo na tela:
d3d_draw_ellipsoid(-8,-8,-8,8,8,8,background_get_texture(bplayer),1,1,16)
//Finalzia o modo de transformações:
d3d_transform_set_identity();


*Só pra esclarecer,ponha no Game Information:
Controles:
x+ :rotaciona no eixo x.
y+ :rotaciona no eixo y.
z+ :rotaciona no eixo z.
sx+: escala no eixo x.
xy+: escala no eixo y.
sz+: escala no eixo z.
Use setas para se movimentar.


*Coloque o objeto na room, e teste.

*Use os controles para girar e escalar ele.


                                                       CONCLUSÃO

As Transformações são de grande utilidade, e se você quer fazer algo que preste no GM3D, é bom que aprenda a usá-las.
Pode ser complicado entender no início, ou apenas com a explicação dada aqui.
Portanto vou deixar como exercício, que você baixe o meu programa: BRUM SHAPES
E brinque um pouco com ele!
Mas não se esqueça de testar as transformações que ele oferece: Posição,Escala e Rotação.
Troque os eixos que está transformando, Escale, Gire, Mova, Observe!!
E veja com frequência tb, o código gml gerado, ele é de grande ajuda para o entendimento das transformações.

Vou disponibilizar aqui, o download da engine, pra quem não conseguiu montar:  DOWNLOAD

Nas próximas aulas, vamos falar sobre texturas,colisão por simulação 2D,controles...

Até lá!


Nenhum comentário:

Postar um comentário