Você está na página 1de 22

SubHeaven subheaven.paulo@gmail.

com

Parte 01

Eu sou um programador Delphi a 2 anos e, como f de RPGs e MMORPGs, resolvi estudar programao de jogos como hobby nas horas vagas. Como linguagem inicial eu escolhi o prprio Delphi pois j estou acostumado com ele. Nas minhas pesquisas eu conheci o 3Dstate (Ele serve pro C# tambm, e estou estudando essa linguagem) e logo depois conheci GLScene. Escolhi GLScene pois, apesar de mais pesado, a qualidade final bem melhor (Me baseei apenas nos exemplos j encontrados) e suporta vrios formatos. Ainda vou voltar a estudar o 3Dstate e at OpenGL puros. Mas para comeo vamos ver o que consigo fazer com o GLScene. Vamos ento ao que interessa. Crie um novo projeto. Fiz alguns testes baseados no demo ..\meches\actor at entender como ele funcionava. Vamos refaze-lo por partes. Primeiro vamos adicionar um GLScene ao nosso form. Vamos dar um clique duplo sobre ele e nos aparecer a seguinte tela.

Vamos ento clicar com o boto direito do mouse em Scene Objects e e vamos adicionar um Actor que se encontra em Scene Objects -> Add Object -> Mesh Objects -> Actor. Ele usado para carregar e manipular meshes (objetos 3D que podem ter sido criados em outros programas).

Vamos mudar sua propriedade name para Boneco (Ou qualquer outro nome que voc ache mais prtico).

Vamos mudar sua propriedade AnimationMode ali em cima para aaLoop, essa opo faz com que, ao acionarmos uma animao do modelo 3D, ele continue com a seqncia em um loop.

Vamos voltar ao GLScene e adicionar uma cmera:

Vamos setar a propriedade TargetObject para o nosso boneco. Assim no importa a posio da cmera e ela ir tentar focar o nosso boneco.

Agora vem uma parte que as vezes ainda me d dor de cabea (Pois as vezes ainda confundo as posies e as direes da cmera e assim ela no consegue mostrar o boneco). Como a propriedade position do boneco esta setado para 0,0,0 (O centro do eixo), vamos setar a posio da cmera para Z = 40(Quarenta unidades afastado da cena, caso o resultado final fique muito afastado a gente pode ajustar esse valor) e a sua direo para Z = -1 (Se um Z positivo vai em direo da tela, um valor negativo seta pro fundo da tela).

Com isso falta apenas adicionar uma fonte de luz e carregar o modelo 3D. Vamos ao GLScene e em Scene Objects -> Add Object -> LightSource.

Vamos ento mudar a sua propriedade LightStyle para lsOmni.

Salve o projeto e cole o arquivo waste.md2 na mesma pasta. (J pode colar o arquivo waste.jpg tambm pois logo iremos usa-lo).

Agora, para podermos habilitar a textura no nosso boneco, vamos salvar todo o projeto em uma pasta qualquer e copiar pra ele os arquivos com o modelo e a textura.

Agora vamos escrever um pouco de cdigo n? V at o OnActivate do Form principal (Caso tenha dvidas quanto a esse evento eu sugiro ler algum tutorial bsico sobre Delphi). O primeiro comando carrega o modelo 3D em nosso boneco. Pra isso adicionamos o comando: Boneco.LoadFromFile(waste.md2); Isso j carrega nosso modelo de um arquivo md2. Pra isso necessrio que declaremos a Unit que faz a converso desse tipo de modelo. Vamos at a clusula uses do nosso projeto e vamos adicionar a Unit GLFileMD2 (verifique depois a pasta FileFormats na pasta dos fontes do GLScene e voc ver que ele pode converter muitos outros tipos de modelos).

Agora devemos apenas carregar o boneco na cena com o seguinte comando: Boneco.Scale.SetVetor(0.4, 0.4, 0.4); A procedure OnActivate do Form deve ficar assim: procedure TForm1.FormActivate(Sender: TObject); begin Boneco.LoadFromFile('waste.md2'); Boneco.Scale.SetVector(0.4,0.4,0.4); end;

Com isso j estamos prontos para rodar nosso programa. Mas h um problema. Devemos colocar um GLSceneViewer para podermos visualizar a cena criada. Adicione esse componente ao form e sete sua propriedade Align para alClient e Cmera para a nossa cmera (Como eu no mudei o nome dela ela ainda se chama GLCamera1).

Salve o projeto e rode o programa. Caso no veja nada porque h algum problema com a posio e direo da cmera. Verifique se a posio do boneco esta em (0,0,0) e depois aumente a distncia da cmera no eixo Z. Se mesmo assim no ver nada refaa o projeto verificando se tudo foi feito como o mostrado. Mas uma coisa engraada que o boneco apareceu deitado na tela.

Eu andei lendo sobre as posies (x, y e z) e parece que esse sistema no GLScene um pouco diferente (Mas preciso pesquisar mais T_T). Porm utilizei o velho sistema para resolver isso. As costas do modelo deveriam apontar para trs (Z negativo) mas est apontando pra cima (Y positivo) e a cabea dele deveria estar pra cima (Y positivo) e esta pra frente (Z positivo); Logo concluo que o a parte de cima do referido objeto na verdade suas costas e sua parte da frente e possivelmente sua cabea (Se algum souber alguma coisa a esse respeito ou souber onde encontro o Help do GLScene com essas informaes eu agradeceria muito). Partindo desse pressuposto, se apontar sua parte de cima (Up na propriedade) para o fundo da tela (Z negativo) e a sua parte da frente (Direction) para cima (Y positivo) eu colocaria meu boneco na posio desejada.

Agora vamos ver como ficou.

Est quase como queremos. Ele ainda no esta com a frente voltada pra mim. como se a parte de cima dele precisasse ser ajusta mais um pouco em direo ao eixo X. Ento vamos ajustar a propriedade Up do nosso boneco um pouco mais pra X.

Pode ver que agora que ele ficou como queramos porm agora nosso problema a luz. Nosso boneco no est bem iluminado mas resolver isso muito simples.

Basta abrir o GLScene e arrastar o GLLightSource para dentro de GLCamera1. Com isso a luz passa a ser filha da cmera e passar a segui-la.

Vamos ver como ficou nossa cena agora.

Estamos evoludo. Agora falta colocar a textura no modelo. Podemos fazer isso visualmente pelo GLScene ou por linha de comando (No esquea de verificar se o arquivo com a textura esta na pasta do projeto).

No esquea de desabilitar a opo Disabled. Para fazer isso por linha de comando, apenas incluiramos essas duas linhas no OnActivate do nosso form

procedure TForm1.FormActivate(Sender: TObject); begin Boneco.LoadFromFile('waste.md2'); Boneco.Material.Texture.Image.LoadFromFile('waste.jpg'); Boneco.Material.Texture.Disabled := false; Boneco.Scale.SetVector(0.4,0.4,0.4); end;

Antes de tentarmos rodar o programa (Se voc optou por linha de comando ser gerado um erro e se no, simplesmente no carregou textura nenhuma) declare outra a unit JPEG no uses de nosso projeto, ela serve pra que nosso programa consiga ler o arquivo que est em jpg.

Agora podemos ver como est a cena.

Agora falta apenas ligar o movimento do personagem. Pra isso adicione um GLCadencer no form.

Sete a sua propriedade Scene para GLScene1.

Agora v ao evento OnProgress do prprio GLCadencer.

E adicione o seguinte comando:

procedure TForm1.GLCadencer1Progress(Sender: TObject; const deltaTime, newTime: Double); begin GLSceneViewer1.Invalidate; end;

Teste o programa e ver que o boneco faz toda a seqncia de animao e depois comea novamente (Isso por causa da propriedade AnimationMode que setamos antes). Caso queira que o boneco execute apenas uma das animaes em loop basta adicionar a seguinte linha de comando no OnActivate do form: procedure TForm1.FormActivate(Sender: TObject); begin Boneco.LoadFromFile('waste.md2'); Boneco.Material.Texture.Image.LoadFromFile('waste.jpg'); Boneco.Material.Texture.Disabled := false; Boneco.SwitchToAnimation(0, true); Boneco.Scale.SetVector(0.4,0.4,0.4); end;

Com isso setamos o boneco para executar a animao 0. Podemos usar essa funo tambm chamando a animao pelo nome (Se soubermos o nome claro). Caso seja possvel estude o demo do qual tirei esse tutorial. Ele deve ficar na pasta Demos\Meshes\Actor da pasta do GLScene.

APNDICE 1 - RESPOSTA NO FRUM UNIDEV SOBRE AS POSIES XYZ

Postado por ferasso em http://www.unidev.com.br/forum/topic.asp?TOPIC_ID=25048 subheaven: Li seu tutorial, e, embora simples, demonstra os conceitos bsicos para a programao com GLScene, parabns. Afinal, por isso que ele se chama "Tutorial 1", e no "Tutorial 322". Porm, voc fala sobre o sistema de coordenadas de GLScene e MD2, sobre o qual gostaria de ajudar a esclarecer melhor. O sistema de coordenadas de GLScene consiste em: X > 0 Aponta para a "direita" do monitor (se voc estiver sentado, na frente de monitor) Y > 0 Aponta para "cima" do monitor Z > 0 Aponta para "voc", ou ele "sai" do monitor. o sistema dextrgiro de coordenadas. Utilize sua mo direita para se localizar no espao:

Cuidado para no utilizar isto em locais pblicos! Quake 2, Quake 3, assim como o formato MD2, tambm utiliza o sistema dextrgiro, porm, as coordenadas sofrem um rotao no eixo X, de modo que o Z > 0 aponte para "cima" do monitor, e Y > 0 aponte para "dentro" do monitor:

Por isso, basta rotacionar os modelos no eixo X em 90 graus, e o "problema" estar resolvido.