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
» 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
» 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
Criando, texturizando e importando modelos 3D
2 participantes
GMBR :: Ensine & Aprenda :: Tutoriais :: Game Maker
Página 1 de 1
Criando, texturizando e importando modelos 3D
Tutorial
Criando, texturizando e importando modelos 3D
Criando, texturizando e importando modelos 3D
Para executar o conteúdo do tutorial precisaremos de:
- Game Maker 8+ Pro
- Blender 2.67 e conhecimento básico no mesmo
- Paint ou qualquer outro editor de imagem
- Paciência
Scripts do Game Maker
Primeiramente vamos citar os scripts necessários para fazer o tudo funcionar no projeto do Game Maker.
model_import (de Zoltan Percsich) importar modelos .obj para o jogo.
- Código:
// MOSAIC Light 3D OBJ IMPORTER
// (c) 2006. Zoltan Percsich. All Rights Reserved.
// Don't edit this script
filename=argument0;
flipnormals = 1;
if (argument1>0) flipnormals=-1;
vertex_list1=ds_list_create();ds_list_clear(vertex_list1);ds_list_add(vertex_list1,0);
vertex_list2=ds_list_create();ds_list_clear(vertex_list2);ds_list_add(vertex_list2,0);
vertex_list3=ds_list_create();ds_list_clear(vertex_list3);ds_list_add(vertex_list3,0);
normal_list1=ds_list_create();ds_list_clear(normal_list1);ds_list_add(normal_list1,0);
normal_list2=ds_list_create();ds_list_clear(normal_list2);ds_list_add(normal_list2,0);
normal_list3=ds_list_create();ds_list_clear(normal_list3);ds_list_add(normal_list3,0);
texture_list1=ds_list_create();ds_list_clear(texture_list1);ds_list_add(texture_list1,0);
texture_list2=ds_list_create();ds_list_clear(texture_list2);ds_list_add(texture_list2,0);
faces_list=ds_list_create();ds_list_clear(faces_list);
fp=file_text_open_read(filename);
for (i=0;file_text_eof(fp)==false;i+=1) {
row=file_text_read_string(fp);row=string_replace_all(row," "," ");
if (string_char_at(row,1)=="v" && string_char_at(row,2)==" ") {
row=string_delete(row,1,string_pos(" ",row));
vx=real(string_copy(row,1,string_pos(" ",row)));
row=string_delete(row,1,string_pos(" ",row));
vy=real(string_copy(row,1,string_pos(" ",row)));
row=string_delete(row,1,string_pos(" ",row));
vz=real(string_copy(row,1,string_length(row)));
ds_list_add(vertex_list1,vx);
ds_list_add(vertex_list2,vy);
ds_list_add(vertex_list3,vz);
}
if (string_char_at(row,1)=="v" && string_char_at(row,2)=="n") {
row=string_delete(row,1,string_pos(" ",row));
nx=real(string_copy(row,1,string_pos(" ",row)));
row=string_delete(row,1,string_pos(" ",row));
ny=real(string_copy(row,1,string_pos(" ",row)));
row=string_delete(row,1,string_pos(" ",row));
nz=real(string_copy(row,1,string_length(row)));
ds_list_add(normal_list1,nx);
ds_list_add(normal_list2,ny);
ds_list_add(normal_list3,nz);
}
if (string_char_at(row,1)=="v" && string_char_at(row,2)=="t") {
row=string_delete(row,1,string_pos(" ",row));
tx=real(string_copy(row,1,string_pos(" ",row)));
row=string_delete(row,1,string_pos(" ",row));
ty=real(string_copy(row,1,string_length(row)));
ds_list_add(texture_list1,tx);
ds_list_add(texture_list2,ty);
}
if (string_char_at(row,1)=="f" && string_char_at(row,2)==" ") {
row=string_replace_all(row," "," ");
row=string_delete(row,1,string_pos(" ",row));
if (string_char_at(row,string_length(row))==" ") row=string_copy(row,0,string_length(row)-1);
face_num=string_count(" ",row);
face_division=1;
temp_faces[0]=0;
for (fc=0;fc<face_num;fc+=1) {
f=string_copy(row,1,string_pos(" ",row));
row=string_delete(row,1,string_pos(" ",row));
temp_faces[face_division]=f;
face_division+=1;
}
f=string_copy(row,1,string_length(row));temp_faces[face_division]=f;
if (face_division==3) {
f1=temp_faces[2];
f2=temp_faces[3];
f3=temp_faces[1];
ds_list_add(faces_list,f1);
ds_list_add(faces_list,f2);
ds_list_add(faces_list,f3);
} else {
f1=temp_faces[2];
f2=temp_faces[3];
f3=temp_faces[1];
ds_list_add(faces_list,f1);
ds_list_add(faces_list,f2);
ds_list_add(faces_list,f3);
for (t=0;t<face_division-3;t+=1) {
f1=temp_faces[4+t];
f2=temp_faces[1];
f3=temp_faces[3+t];
ds_list_add(faces_list,f1);
ds_list_add(faces_list,f2);
ds_list_add(faces_list,f3);
}
}
}
file_text_readln(fp);
}
file_text_close(fp);
tm=d3d_model_create();
tsn=0;
d3d_model_primitive_begin(tm,pr_trianglelist);
for (fc=0;fc<ds_list_size(faces_list);fc+=1) {
sub_face=ds_list_find_value(faces_list,fc);
if (string_count("/",sub_face)==0) {
f_index=sub_face;
t_index=-1;
n_index=-1;
}
if (string_count("/",sub_face)==1) {
f_index=string_copy(sub_face,1,string_pos("/",sub_face)-1);
sub_face=string_delete(sub_face,1,string_pos("/",sub_face));
t_index=string_copy(sub_face,1,string_length(sub_face));
n_index=-1;
}
if (string_count("/",sub_face)==2 && string_count("//",sub_face)==0) {
f_index=string_copy(sub_face,1,string_pos("/",sub_face)-1);
sub_face= string_delete(sub_face,1,string_pos("/",sub_face));
t_index=string_copy(sub_face,1,string_pos("/",sub_face)-1);
sub_face= string_delete(sub_face,1,string_pos("/",sub_face));
n_index=string_copy(sub_face,1,string_length(sub_face));
}
if (string_count("/",sub_face)==2 && string_count("//",sub_face)==1) {
sub_face=string_replace(sub_face,"//","/");
f_index=string_copy(sub_face,1,string_pos("/",sub_face)-1);
sub_face= string_delete(sub_face,1,string_pos("/",sub_face));
t_index=-1;
n_index=string_copy(sub_face,1,string_length(sub_face));
}
vx=ds_list_find_value(vertex_list1,floor(real(f_index)));
vy=ds_list_find_value(vertex_list2,floor(real(f_index)));
vz=ds_list_find_value(vertex_list3,floor(real(f_index)));
if (floor(real(n_index))!=-1 && ds_list_size(normal_list1)>=1) {
nx=flipnormals*ds_list_find_value(normal_list1,floor(real(n_index)));
ny=flipnormals*ds_list_find_value(normal_list2,floor(real(n_index)));
nz=flipnormals*ds_list_find_value(normal_list3,floor(real(n_index)));
} else {
nx=0;
ny=0;
nz=0;
}
if (floor(real(t_index))!=-1 && ds_list_size(texture_list1)>=1) {
tx=ds_list_find_value(texture_list1,floor(real(t_index)));
ty=ds_list_find_value(texture_list2,floor(real(t_index)));
} else {
tx=0;
ty=0;
}
d3d_model_vertex_normal_texture(tm,vx,vy,vz,nx,ny,nz,tx,ty);
tsn+=1;
if (tsn==999) {
tsn=0;
d3d_model_primitive_end(tm);
d3d_model_primitive_begin(tm,pr_trianglelist);
}
}
d3d_model_primitive_end(tm);
return tm;
model_draw (criado por mim) para desenhar o modelo, com correção aos erros de rotação proporcionados pelo Blender.
- Código:
d3d_transform_set_identity();
d3d_transform_add_rotation_x(argument5+270);
d3d_transform_add_rotation_y(argument6+0);
d3d_transform_add_rotation_z(argument7);
d3d_transform_add_translation(argument1, argument2, argument3);
d3d_model_draw(argument0, 0, 0, 0, argument4);
d3d_transform_set_identity();
O Modelo
Agora vamos criar um modelo normalmente, criei esse simples e quadradão carro:
Sempre tenha como frente para aonde a seta verde aponta, caso contrário terá erros de rotação no Game Maker!
A Textura
Agora vamos criar a textura do modelo. Essa parte eu considero a mais chata, mas vamos lá. Primeiramente vamos entrar no Edit Mode, selecionar tudo (tecla A), pressionar U e selecionar a opção Smart UV Project. Dê OK:
Agora vamos sair da tela 3D View, e entrar em UV/Image Editor. Veremos o modelo em forma 2D, é em cima dela que desenharemos nossa textura:
É como se pegássemos um barquinho de papel e abríssemos a folha deixando-a plana.
Recomendo espalhar luzes pelo editor do blender, para que se possa ver o modelo com a textura (Add > Lamp > Point no Object Mode):
Em algumas imagens é bem fácil identificar a que parte do modelo a imagem UV corresponde, mas em uma quadrada é mais difícil. Mas podemos identificar a qual parte do modelo correspondente à imagem do UV selecionando vértices no Edit Mode.
Primeiro selecionamos os vértices (por exemplo querendo saber qual é a parte do vidro da frente):
Quando voltamos ao UV/Image Editor, apenas a parte corresponde será mostrada:
Agora já sabemos que aqueles 4 retângulos correspondem ao vidro da frente.
Bom, agora que já conseguimos identificar as partes, vamos editar essa "moldura" do modelo (a nossa imagem 2D). Voltamos no Edit Mode e selecionamos todos os vértices (tecla A). E depois UV/Image Editor > UVs > Export UV Layout:
Vamos abrir essa imagem em um editor de imagens (eu usarei o próprio editor de imagem do Game Maker). Eu gosto de botar a opacidade máxima possível (desativando o Relative).
Vamos editar primeiramente só a parte do vidro, e ver como fica. Deixei assim:
Agora vamos na opção Image do UV/Image Editor, ao lado da opção UVs, e clicar em Open Image.
Voltamos ao 3D View e mudamos a opção de amostra do modelo de Solid para Texture:
Podemos ver que uma parte já se encontra pintada, para ver melhor você pode colocar no Object Mode:
Agora já sabe-se o esquema para encontrar as partes, e como editar.
Sempre que editar a imagem da textura, basta ir em UV/Image Editor > Image > Reload Image para atualizar no Blender. Ao fim deixei assim:
Só pintei diferente as partes com vidro mesmo, fiz rápido. Resultado:
Fim. Acho que com isso já dá pra fazer textura decentes pros modelos.
Temos que subir o modelo para que fique no "chão do editor", e não meia parte pra cima e meia pra baixo:
Preparando o Modelo e Textura
Vamos agora exportar o modelo (File > Export > Wavefront (.obj)). Nas opções vamos colocar escala 5:
A opção fica no canto inferior esquerdo. Salve numa pasta.
Agora criamos um novo projeto no Game Maker nessa mesma pasta, e importamos os scripts que passei no início do tutorial.
Agora, pegamos a imagem da textura do modelo, colocamos como background no GM e invertemos verticalmente (isso, viramos de ponta-cabeça), no editor de sprites do Game Maker tem essa opção (Flip).
Abrindo no Game Maker
Crie um objeto e no seu Create importamos o modelo:
- Código:
//model_import(nome_do_modelo)
modelo = model_import("modelo.obj")
E no seu Draw, desenhamos o modelo com meu script:
- Código:
//model_draw(modelo,x,y,z,textura,rot_x,rot_y,rot_z)
model_draw(modelo,x,y,z,background_get_texture(back_textura),0,0,0)
E Voila! Funcionando dentro do Game Maker:
Os erros na textura não são do GM, mas sim meus mesmo.
Agradecimentos a JoaVanBlizzard e Jiraya!
Engine do tutorial: http://db.tt/hI1POr0sEspero que ajude alguém a criar modelos para jogos 3D! o/
Gonçalves- Games Ranking :
Notas recebidas : B + A + C
Data de inscrição : 29/10/2010
Reputação : 79
Número de Mensagens : 1013
Prêmios :
x 0 x 4 x 0
x 2 x 0 x 0
x 0 x 0 x 0
Re: Criando, texturizando e importando modelos 3D
Tutorial MUITO bom e detalhado, mais acho melhor em vez de usar um script para leitura , usar a dll do jyraia que é 20 ou 30 vezes mais rápido, e lembrar de sempre trasformar as faces para triangulos.
E também só lembrando que o GameMaker só suporta modelos com < de 3200 triangulos
Dica: modo de edição --selecione todos os triangulos -- mesh > faces > shade smooth. Pronto, Melhorado 200 vezes sem almentar 1 único vértice.
E também só lembrando que o GameMaker só suporta modelos com < de 3200 triangulos
Dica: modo de edição --selecione todos os triangulos -- mesh > faces > shade smooth. Pronto, Melhorado 200 vezes sem almentar 1 único vértice.
Rodrigo Santiago- Games Ranking :
Notas recebidas : C + C + B
Data de inscrição : 28/07/2012
Reputação : 73
Número de Mensagens : 1281
Prêmios :
x 0 x 0 x 0
x 3 x 1 x 3
x 0 x 0 x 0
Re: Criando, texturizando e importando modelos 3D
Link?Usar a dll do jyraia que é 20 ou 30 vezes mais rápido
Como? E qual seria a diferença?Lembrar de sempre trasformar as faces para triangulos
Edit: CTRL+T, mas ainda não sei a serventia...
Gostei do resultado. Eu estava usando o modifier mas deixava bem mais lento pra carregar (não cheguei a testar se o FPS caía drasticamente).modo de edição --selecione todos os triangulos -- mesh > faces > shade smooth.
Valeu!
Gonçalves- Games Ranking :
Notas recebidas : B + A + C
Data de inscrição : 29/10/2010
Reputação : 79
Número de Mensagens : 1013
Prêmios :
x 0 x 4 x 0
x 2 x 0 x 0
x 0 x 0 x 0
Tópicos semelhantes
» importando modelos
» Importando modelos .d3d para o Game Maker
» [Ajuda]Importando engines
» Importando de uma pasta compactada!?
» GameMaker Studio 2 - Importando um projeto
» Importando modelos .d3d para o Game Maker
» [Ajuda]Importando engines
» Importando de uma pasta compactada!?
» GameMaker Studio 2 - Importando um projeto
GMBR :: Ensine & Aprenda :: Tutoriais :: Game Maker
Página 1 de 1
Permissões neste sub-fórum
Não podes responder a tópicos