Obrigado por visitar a The Game Makers Brasil 😁 Use o fórum de Dúvidas para fazer perguntas. Se está em busca de aprender dê uma olhada nos tutoriais.

como desenhar 3D 1 objecto usando sprites?

Perguntas? A comunidade te ajuda a resolver.
Avatar do usuário
Cambalinho
Membro
Membro
Reações: 0
Mensagens: 59

como desenhar 3D 1 objecto usando sprites?

Mensagem por Cambalinho » Sáb Ago 19, 2017 1:52 pm

veja esta imagem:
Imagem

ao observar esta imagem, nós podemos ver diversas subimagens para movimentos  e a volta do monstro.
sem falar da animação... como posso juntar algumas subimagens para desenhar o monstro em 3D?
(assim, com a camara podia ver o monstro por completo)

Avatar do usuário
J_Marlon
Membro
Membro
Reações: 1
Mensagens: 41

Re: como desenhar 3D 1 objecto usando sprites?

Mensagem por J_Marlon » Seg Ago 21, 2017 3:53 am

Existia um tutorial de FPS feito para o antigo Game Maker e em um dos processos ensinava a técnica para desenhar os sprites dos monstros 2D em ambiente 3D.

Imagem

O site original onde o tutorial estava (sandbox) já não existe mais mas você ainda pode encontrar os arquivos para download aqui:
https://enigma-dev.org/edc/games.php?game=43

Os editáveis foram feitos para o Game Maker 7, portanto você precisa ativar a opção "Used for 3D" nas properties dos Sprites e Backgrounds caso for usar o GameMaker: Studio.

Avatar do usuário
Cambalinho
Membro
Membro
Reações: 0
Mensagens: 59

Re: como desenhar 3D 1 objecto usando sprites?

Mensagem por Cambalinho » Seg Ago 21, 2017 6:22 am

desculpa, só usam o sprite frontal e não usam, tambem, lateral e trás.
a minha questão é: como posso desenhar esse monstro dando 1 efeito 3D(incluir frente, trás e lateral)?

Avatar do usuário
WellingtonBecker
Membro
Membro
Reações: 0
Mensagens: 57

Re: como desenhar 3D 1 objecto usando sprites?

Mensagem por WellingtonBecker » Seg Ago 21, 2017 10:02 am

Você poderia fazer isso com o blender no qual se modela em 3D, em seguida, cria-se sprites do angulo que quiser.
No link abaixo uma simples demonstração de como faze-lo.
https://www.youtube.com/watch?v=cCCO_thw164

Avatar do usuário
Cambalinho
Membro
Membro
Reações: 0
Mensagens: 59

Re: como desenhar 3D 1 objecto usando sprites?

Mensagem por Cambalinho » Seg Ago 21, 2017 10:24 am

wellingtonBecker, como voce viu, eu tenho as imagens o meu problema é como as desenho para dar o efeito 3D.
como era o Doom? não era assim ou usavam modelos?

Avatar do usuário
J_Marlon
Membro
Membro
Reações: 1
Mensagens: 41

Re: como desenhar 3D 1 objecto usando sprites?

Mensagem por J_Marlon » Ter Ago 22, 2017 2:24 am

Nesse caso, você precisa encontrar uma forma de calcular uma variável angulo (Em relação ao player e direção de movimento do monstro) para indexar as sprites/subimagens de acordo.

Well, eu gostaria de ser mais especifico mas não conheço muito bem o funcionamento do 3D no GMS.

Avatar do usuário
Cambalinho
Membro
Membro
Reações: 0
Mensagens: 59

Re: como desenhar 3D 1 objecto usando sprites?

Mensagem por Cambalinho » Qua Ago 23, 2017 6:45 pm

eu consegui alguma coisa, mas ainda noto erros:

Código: Selecionar todos

//evento Create:
z=40;
p=64;
w=64;
h=64;
image_speed=0;
angle=point_direction(x, y, objCamera.x, objCamera.y)
image_index=angle*(image_number)/360 *10;

//evento Step:
angle=point_direction(x, y, objCamera.x, objCamera.y)
image_index=ceil(angle*(image_number)/360 *10);

//evento Draw:
d3d_transform_set_identity();
d3d_transform_add_rotation_z(point_direction(x, y, objCamera.x, objCamera.y)+90);
d3d_transform_add_translation(x, y, z)
d3d_draw_wall(0+64,0+64, 0+64, 0, 0, 0, sprite_get_texture(sprCacodemon,image_index),1,1);
d3d_transform_set_identity();
erros:
1 - os ângulos ainda não estão correctos, a imagem pode variar mais do que devia;
2 - falta fazer com que a primeira imagem corresponda á direcção do monstro(a face).
podes me ajudar a corrigir esses cálculos?

Avatar do usuário
J_Marlon
Membro
Membro
Reações: 1
Mensagens: 41

Re: como desenhar 3D 1 objecto usando sprites?

Mensagem por J_Marlon » Qua Ago 23, 2017 10:33 pm

O objCamera somente desenha a view ou também é o player?

Também não entendi o porquê do *10 ou do ceil no código. 

Sugiro as seguintes alterações:

Create

Código: Selecionar todos

z=40;
p=64;
w=64;
h=64;

image_speed = 0;
angle = point_direction(x, y, objCamera.x, objCamera.y);
image_index = angle*image_number/360;
Step

Código: Selecionar todos

angle = point_direction(x, y, objCamera.x, objCamera.y);
image_index = angle*image_number/360;

Quanto a face do monstro, imagino que será necessário organizar a colocação das subimagens da sprite para exibir corretamente.

Avatar do usuário
ValdeciVieira
Moderador
Moderador
Reações: 4
Mensagens: 103
Localização: Rio de Janeiro, Brasil

Re: como desenhar 3D 1 objecto usando sprites?

Mensagem por ValdeciVieira » Qua Ago 23, 2017 10:53 pm

Não sei ao certo oque você quer,mas eu fiz oque eu entendi (e nem me pergunte como eu fiz '-',eu simplesmente estava inspirado :sorrir:)
Obs :Tem 2 gifs uma com a opção "Interpolate colors between pixels" ativada e outra desativada só pra ver a diferença
Obs2:Esqueci de tirar o mouse :P
Fazer uma breve explicação aqui.
O Personagem ai tem 8 sprites viradas para 8 direções,o propio personagem tem uma direção só dele,mas dependendo de onde a camera (jogador) estiver ele muda de sprite (mas continua á olhar a direção propia).
Edit:Eu durmo cedo então se for isso mesmo oq vc procura envia a mensagem e tentarei responder o mais rapido possivel (eu estudo a tarde 13:00 até as 17:30) o resto desse tempo estou em casa (ae depende da internet xD)

Gif 1  (com "Interpolate colors between pixels")
Imagem
Gif 2  (sem "Interpolate colors between pixels")
Imagem

Avatar do usuário
Cambalinho
Membro
Membro
Reações: 0
Mensagens: 59

Re: como desenhar 3D 1 objecto usando sprites?

Mensagem por Cambalinho » Qui Ago 24, 2017 5:35 am

sim Mega, é mesmo isso ;)
J_Marlon o '*10' é por causa de ter 1 numero superior a zero, porque esse calculo da-me numeros reais.

Avatar do usuário
ValdeciVieira
Moderador
Moderador
Reações: 4
Mensagens: 103
Localização: Rio de Janeiro, Brasil

Re: como desenhar 3D 1 objecto usando sprites?

Mensagem por ValdeciVieira » Qui Ago 24, 2017 8:24 am

Ok então eu simplismente criei o objeto camera com esses codigos (eu peguei do tutorial que se eu não me engano vc mencionou em outro post

Código: Selecionar todos

Create:
d3d_start(); //Inicia o 3d
direction = 0; //Direção da camera (horizontal)
pitch = 0; //Direção da camera (vertical)
z = 0; //Altura da camera
texture = background_get_texture(Txt_Floor) //Textura do chão

Step:
direction-=(display_mouse_get_x()-display_get_width()/2)/10; //Muda a direção (horizontal) com base no x do mouse na tela
pitch=clamp(pitch+(display_mouse_get_y()-display_get_height()/2)/10,-80,80); //Muda a direção (vertical) com base no y do mouse na tela
display_mouse_set(display_get_width()/2,display_get_height()/2); //Centraliza o mouse no centro da tela
if keyboard_check(vk_escape) {game_end()} //Fecha o jogo com a tecla "Esc" (já que o mouse fica preso no centro da tela)

var d=degtorad(direction); //Converte os graus da direção em radians

switch(keyboard_key){ //Faz a camera andar (da pra melhorar o codigo para fazer segurar mais de uma tecla)
    case ord("A"): 
        x-=sin(d)*4;
        y-=cos(d)*4;
        break;
    case ord("D"):
        x+=sin(d)*4;
        y+=cos(d)*4;
        break;  
    case ord("S"):
        x-=cos(d)*4;
        y+=sin(d)*4;
        break;
    case ord("W"):
        x+=cos(d)*4;
        y-=sin(d)*4;
        break;
}

Draw:
draw_set_color(c_white); //Define a cor como white (branca) para que o jogo não fique preto
d3d_set_projection(x,y,z+16,x+cos(degtorad(direction)),y-sin(degtorad(direction)),z-sin(degtorad(pitch))+16,0,0,1); //Meio complicado de explicar sugiro etudar :maluco:
d3d_draw_floor(0,0,0,room_width,room_height,0,texture,background_get_width(Txt_Floor),background_get_height(Txt_Floor)) //Desenha o chão do tamanho da sala

Agora o Obj_Megaman ou oque voce preferir
Create:
index = 0; //A subimg do sprite
xx1 = 1; //Estava tendo problemas com o sprite lateral que era menor que os demais então criei essas variaveis para mudar o tamanho da "wall" de acordo com  o sprite
xx2 = 1; //Eu nem utilizei o yy1 e yy2 porque eles davam uma projeção errada ao objeto,fazendo com que ele não ficasse virado pra camera
yy1 = 1; //''
yy2 = 1; //''
direction = 0; //Direção do objeto
z = 0; //Altura do objeto
sprite_direction = 0; //Qual sprite ele desenha de acordo com a direção que o jogador o vê

Step:
sprite_direction = point_direction(x,y,Obj_Camera.x,Obj_Camera.y) //Define a direção que a camera tem do objeto

//Define suas "index" e o tamanho da "wall" (Lembrando eu fiz esse codigo porque estava inspirado :sorrir: então deve ter jeito mais simples de se fazer)
if sprite_direction >= 0 && sprite_direction < 45 {index = 0;xx1=-9.5;yy1=-9.5;xx2=9.5;yy2=9.5}                      
if sprite_direction >= 45 && sprite_direction < 90 {index = 1;xx1=-10.5;yy1=-10.5;xx2=10.5;yy2=10.5}
if sprite_direction >= 90 && sprite_direction < 135 {index = 2;xx1=-6;yy1=-6;xx2=6;yy2=6}
if sprite_direction >= 135 && sprite_direction < 180 {index = 3;xx1=-10.5;yy1=-10.5;xx2=10.5;yy2=10.5}
if sprite_direction >= 180 && sprite_direction < 225 {index = 4;xx1=-9.5;yy1=-9.5;xx2=9.5;yy2=9.5}
if sprite_direction >= 225 && sprite_direction < 270 {index = 5;xx1=-10.5;yy1=-10.5;xx2=10.5;yy2=10.5}
if sprite_direction >= 270 && sprite_direction < 315 {index = 6;xx1=-6;yy1=-6;xx2=6;yy2=6}
if sprite_direction >= 315 && sprite_direction < 360 {index = 7;xx1=-10.5;yy1=-10.5;xx2=10.5;yy2=10.5}

Draw: //Desculpe mas eu precisei pegar seu codigo para criar isso (pq eu tinha me esquecido como se faz)
d3d_transform_set_identity(); //Define a transformação para a identidade (sem transformação)
d3d_transform_add_rotation_z(point_direction(x, y, Obj_Camera.x, Obj_Camera.y)+90); //Adiciona uma rotação em torno do eixo z com a quantidade indicada
d3d_transform_add_translation(x, y, z) //Adiciona uma tradução sobre o vetor indicado
d3d_draw_wall(xx1,0,24,xx2,0,0,sprite_get_texture(Spr_Megaman,index),1,1); //Desenha uma parede com o xx1 e xx2 (do tamanho das sprites que era 24),desenha o sprite com o "index")
d3d_transform_set_identity(); //Define a transformação para a identidade (sem transformação)

Pronto.
Obs :As sprites exibidas nas gifs não são de minha autoria,eu peguei de um jogo que tinha aqui.
O nome do jogo é Mega Man 8-bit Deathmatch
Link:http://cutstuff.net/mm8bdm/
Obs2 :O jogo é uma hack de doom
Edit:Obrigado cara,agora fiquei inspirado então vou continuar esse projeto para um jogo RPG ou de Tiro ou oq me sugerir melhor :sorrir:

Avatar do usuário
Cambalinho
Membro
Membro
Reações: 0
Mensagens: 59

Re: como desenhar 3D 1 objecto usando sprites?

Mensagem por Cambalinho » Qui Ago 24, 2017 12:50 pm

eu noto 1 problema:

Código: Selecionar todos

sprite_direction = point_direction(x,y,objCamera.x,objCamera.y) //Define a direção que a camera tem do objeto
1 - eu não posso mudar a direction do teu megaman?
(mantenho megaman para poderes me ajudar)

- desculpa mas o conjunto dos if's não pode ser simplificado?
(e assim poder-mos usar o codigo para outras situações)

Avatar do usuário
ValdeciVieira
Moderador
Moderador
Reações: 4
Mensagens: 103
Localização: Rio de Janeiro, Brasil

Re: como desenhar 3D 1 objecto usando sprites?

Mensagem por ValdeciVieira » Qui Ago 24, 2017 12:55 pm

Eu não entendi muito bem o problema 1
Edit:Olha eu fiz esse sprite_direction para que o objeto veja em que direção está a camera,assim definindo qual index vai aparecer (seguindo como ponto a direção do megaman)
Se eu coloca-se direction o objeto ia index ia ser 0 (que é a sprite virada para o jogador),ou seja nunca ia mudar
Essa  direction é pra definir qual a direção que o megaman está virado
Editado pela última vez por ValdeciVieira em Qui Ago 24, 2017 1:01 pm, em um total de 1 vez.

Avatar do usuário
Cambalinho
Membro
Membro
Reações: 0
Mensagens: 59

Re: como desenhar 3D 1 objecto usando sprites?

Mensagem por Cambalinho » Qui Ago 24, 2017 12:58 pm

nós podemos alterar o direction, e o direction é que manda onde mostrar a primeira image ;)
ou seja, os if's tem de ser aperfeiçoados para lidar tambem com a direction

Avatar do usuário
ValdeciVieira
Moderador
Moderador
Reações: 4
Mensagens: 103
Localização: Rio de Janeiro, Brasil

Re: como desenhar 3D 1 objecto usando sprites?

Mensagem por ValdeciVieira » Qui Ago 24, 2017 1:03 pm

Entendi,mas agora eu tenho escola
Umas 5:30 eu volto

Avatar do usuário
Cambalinho
Membro
Membro
Reações: 0
Mensagens: 59

Re: como desenhar 3D 1 objecto usando sprites?

Mensagem por Cambalinho » Qui Ago 24, 2017 1:05 pm

ok. abraço e muito obrigado por tudo

Avatar do usuário
Cambalinho
Membro
Membro
Reações: 0
Mensagens: 59

Re: como desenhar 3D 1 objecto usando sprites?

Mensagem por Cambalinho » Sex Ago 25, 2017 5:21 am

consegui simplificar o codigo ;)

Código: Selecionar todos

///GetSubImage2DSprite(objDrawed, objCamera, sprSprite);

imagecount=sprite_get_number(argument2);

sprite_direction = point_direction(argument0.x,argument0.y,argument1.x,argument1.y);

index=0;

for (i=0; i<360; i+=(360/imagecount))
{
    if sprite_direction >= (i) && sprite_direction < (i+(360/imagecount)) then
    {
        return index;
    }
    index++;
}

index-=1
return index;
o que ainda não entendi é como vou adicionar o direction :(
porque da-me index errados :(
eu se adicionar ao sprite_direction obtenho o index inicial errado, e depois se repete quando dou a volta :(
o que podes me aconselhar?

Avatar do usuário
ValdeciVieira
Moderador
Moderador
Reações: 4
Mensagens: 103
Localização: Rio de Janeiro, Brasil

Re: como desenhar 3D 1 objecto usando sprites?

Mensagem por ValdeciVieira » Sex Ago 25, 2017 7:13 am

Que bom que conseguiu simplificar o código :D 
Eu não trabalho com códigos assim que usam "i" e sei lá o que,tenho que estudar pra entender ;-;
Se eu entendesse o código ficaria melhor 

Avatar do usuário
Cambalinho
Membro
Membro
Reações: 0
Mensagens: 59

Re: como desenhar 3D 1 objecto usando sprites?

Mensagem por Cambalinho » Sex Ago 25, 2017 7:27 am

voltei a ler este documento: https://enigma-dev.org/docs/Wiki/3D_for ... ite_models

11.5 Using virtual rotation
Virtual rotated Flat Sprite Models are not really 3D models. They are Flat Sprite Models, so they’re 2D. The trick is to set an image for each angle. Take a look at the gm6 file (part D) and the script draw_virtual and you will see it’s basically the same code (as part C):

Código: Selecionar todos

//don't draw if too far from camera
if distance_to_object (obj_camera)>2048 then exit;
The first part (above) is used to avoid having to draw objects that are too far to see anyway. This has nothing to do with transformation. The next part (below) of the same script has and looks like this:

Código: Selecionar todos

//draw virtual rotating ball
d3d_transform_set_identity();
d3d_transform_add_rotation_x(90);
d3d_transform_add_rotation_z(point_direction(x, y, obj_character.x, obj_character.y)+90);
d3d_transform_add_translation(x, y, z+64)
draw_sprite_ext(spr_virtual, image_index, 0, 0, 1, 1, 0, c_white, 1);
d3d_transform_set_identity();
This time we will use almost the same code, using the image_index value but in the Step event we will run the script scr_virtual that looks like this:

Código: Selecionar todos

//set angle and image
angle=point_direction(x, y, obj_character.x, obj_character.y)
image_index=angle*8/360; //8 is the number of rotation images
Using the angle of the player in relation to the object, we will set the value of the image_index. Because we’re using 8 sub-images, we will use the number 8 (last line, above). If you run the gm6 (part D), you will see that the object rotates so that the player can view it from all sides. The more images you use, the more realistic the effect will be. But using more subimages will result in a larger overall file size because images take up memory. 

e agora sim. bem melhor ;)

Código: Selecionar todos

///GetSubImage2DSprite(objDrawed, objCamera, sprSprite);

imagecount=sprite_get_number(argument2);

sprite_direction = point_direction(argument0.x,argument0.y,argument1.x,argument1.y)+argument0.direction;
if sprite_direction>360 then sprite_direction-=360;
index=sprite_direction*imagecount/360;
return ceil(index);

//Create:
direction =180 -90;
o ceil é para obter numeros inteiros ;)
ja tenho o que pretendo. muito obrigado.
apenas noto 1 pequeno erro entre os angulos e a direcção(margem de erro). mas está melhor e aceito correcções.
muito obrigado

Avatar do usuário
ValdeciVieira
Moderador
Moderador
Reações: 4
Mensagens: 103
Localização: Rio de Janeiro, Brasil

Re: como desenhar 3D 1 objecto usando sprites?

Mensagem por ValdeciVieira » Sex Ago 25, 2017 7:32 am

que isso ?
eu não fiz nada '-'
mas que bom que conseguiu oque procurava

Responder

Quem está online

Usuários navegando neste fórum: Google [Bot] e 6 visitantes