Projeção de luz e sombra usando cálculo vetorial

Ver o tópico anterior Ver o tópico seguinte Ir em baixo

Projeção de luz e sombra usando cálculo vetorial

Mensagem por GameMakerTutoriais em Dom 17 Jul 2011, 20:46




Vector Easy Lighting 1.1 beta

Vantagens de usar a projeção de luz pelo vetor:

>> Controle total sobre a performance e qualidade da luz, podendo ajustar de acordo com o fps automaticamente se necessário. Nos testes que eu fiz em um computador bem modesto, consegui desenhar até 50 luzes na tela, com ótima qualidade no render e fps aceitável.

>> Controle total do efeito, podendo ser reajustado em tempo real, a fim de criar ambientes de acordo com a situação e/ou desempenho.

>> Não requer nenhuma mudança no projeto. O exemplo que postei faz o uso de uma surface, porém, o script também pode ser usado diretamente no evento Draw. Além disso não é necessário usar nenhum sprite adicional nem implementar nenhum código aos demais objetos pois o efeito é um vetor, que é calculado com base na instância que emite a luz e as demais que circundam ela.

>> Rápido. Nos testes que eu fiz, consegui desenhar vetores com quase 1000 vértices por luz, com fps muito bom.

>> Você pode adaptar a precisão do efeito de acordo com a máscara de colisão do objeto. Isso significa que você pode usá-lo em um jogo com perspectivas diferentes de visão ou isométrico, em casos onde "a base" do objeto é a própria máscara. E como o efeito é fácil de usar (apenas um script pra cada tipo de luz), você desenhá-lo na surface e distorcê-la depois se achar melhor.

>> Fácil de usar. É só usar um script para cada tipo de efeito. Por enquanto só criei dois tipos de luz, uma "spot" e uma "lighting point", mas quero criar mais, e a medida que eu for criando vou complementando o tópico.

>> O donwload é para Game Maker 8 mas o script também pode ser usado em versões anteriores (6 ou 7). O exemplo ficou bem básico, pois experimentei até agora apenas dois blends, mas usando outros o efeito é bem bonito e dá "um up" bem legal nos gráficos do jogo.

Download:
http://dl.dropbox.com/u/77818756/Game%20Maker/vector_easy_lighting_v1_11.gmk


Última edição por Ninja8086 em Qui 28 Jun 2012, 10:39, editado 2 vez(es)

GameMakerTutoriais

Número de Mensagens : 800
Data de inscrição : 29/01/2011
Reputação : 26
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Re: Projeção de luz e sombra usando cálculo vetorial

Mensagem por PedroX em Dom 17 Jul 2011, 21:17

Genial!
Eu gostei muito dessa engine.
Ficou muito boa mesmo. Rodou sem lentidão. Você usou bem as surfaces.
Valeu cara!

Até mais!


Última edição por PedroX em Ter 14 Maio 2013, 13:10, editado 1 vez(es)

PedroX

Ranking : Nota C
Número de Mensagens : 6034
Idade : 21
Data de inscrição : 26/07/2008
Notas recebidas : C+B
Reputação : 286
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   :
   :
   :

Voltar ao Topo Ir em baixo

Re: Projeção de luz e sombra usando cálculo vetorial

Mensagem por GameMakerTutoriais em Dom 17 Jul 2011, 21:28

.


Última edição por brendan640 em Sab 08 Jun 2013, 20:36, editado 1 vez(es)

GameMakerTutoriais

Número de Mensagens : 800
Data de inscrição : 29/01/2011
Reputação : 26
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Re: Projeção de luz e sombra usando cálculo vetorial

Mensagem por PedroX em Dom 17 Jul 2011, 21:56

Esqueci de falar no meu post:
Será que tem como fazer o ambiente ficar mais escuro, ficando claro somente onde a luz alcança?

Até mais!

PedroX

Ranking : Nota C
Número de Mensagens : 6034
Idade : 21
Data de inscrição : 26/07/2008
Notas recebidas : C+B
Reputação : 286
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   :
   :
   :

Voltar ao Topo Ir em baixo

Re: Projeção de luz e sombra usando cálculo vetorial

Mensagem por Convidad em Seg 18 Jul 2011, 08:33

ótima engine,nota dez .
nem conhecia esse recurso .
continue assim Happy

Convidad
Convidado


Voltar ao Topo Ir em baixo

Re: Projeção de luz e sombra usando cálculo vetorial

Mensagem por GameMakerTutoriais em Seg 18 Jul 2011, 10:21

Pedro Henrique escreveu:Esqueci de falar no meu post:
Será que tem como fazer o ambiente ficar mais escuro, ficando claro somente onde a luz alcança?

Até mais!

Tem sim! Nesse caso é só usar um blend diferente, daria pra fazer usando dest color e source color. Vai lá do Draw, troca o blend que tá lá por esse aqui:

Código:
draw_set_blend_mode_ext( bm_dest_color, bm_src_color);

Mas esse blend que eu coloquei é bem básico, se você for experimentando outros misturados com os efeitos do engine, fica muito legal. Eu vou postar uns exemplos mais legais depois que eu terminar ele.

Pedro, se ficar lento quando você usar muitos efeitos juntos, eu tenho uma dica pra acelerar todos de uma vez, saca só: cria uma variável "prevfps" no create com o valor do fps;

Código:
prevfps := fps;

Daí, na hora em que você desenhar o efeito, no valor de "beams" você usa isso:
Código:
(perfeicao/30) * max(1,prevfps)

Ficaria mais ou menos assim:
Código:
eff_lighting_point(x, y, 250, c_white, c_red, 1, 0, (300/30) * max(1,prevfps), 2, 0, 1);

Depois que você desenhar o efeito (tem que ser depois de tudo, a última coisa), você atualiza a variável prevfps.

Código:
prevfps := fps;

Vai tudo ser desenhado de acordo com o fps do jogo, diminuindo ou aumentando a qualidade quando for preciso. blz

TRFN escreveu:ótima engine,nota dez .
nem conhecia esse recurso .
continue assim

Valeu! Obrigado por baixar e testar! blz

GameMakerTutoriais

Número de Mensagens : 800
Data de inscrição : 29/01/2011
Reputação : 26
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Re: Projeção de luz e sombra usando cálculo vetorial

Mensagem por uriel.56 em Seg 18 Jul 2011, 11:35

Eu naum acredito cara... Logo quando eu ia baixar o 4shared em manutenção..., manda o Script por favor !! Eu estou precisando desse code agora!

Eu tenho uma duvida....

Como esse efeito ficaria em um jogo 3d com a luz ativada !?

uriel.56

Número de Mensagens : 430
Idade : 19
Data de inscrição : 13/02/2010
Reputação : -2
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Re: Projeção de luz e sombra usando cálculo vetorial

Mensagem por PedroX em Seg 18 Jul 2011, 13:07

Tem sim! Nesse caso é só usar um blend diferente, daria pra fazer usando dest color e source color. Vai lá do Draw, troca o blend que tá lá por esse aqui:
Deu certinho. Ficou mais legal ainda.
Teria como você fazer uma explicação dos calculos usados?
Não precisa ser hoje (nem amanhã), mas é que seria legal saber como funciona.

Até mais!

PedroX

Ranking : Nota C
Número de Mensagens : 6034
Idade : 21
Data de inscrição : 26/07/2008
Notas recebidas : C+B
Reputação : 286
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   :
   :
   :

Voltar ao Topo Ir em baixo

Re: Projeção de luz e sombra usando cálculo vetorial

Mensagem por GameMakerTutoriais em Seg 18 Jul 2011, 18:54

uriel.56 escreveu:Eu naum acredito cara... Logo quando eu ia baixar o 4shared em manutenção..., manda o Script por favor !! Eu estou precisando desse code agora!

Eu tenho uma duvida....

Como esse efeito ficaria em um jogo 3d com a luz ativada !?

O 4shared ficou em manutenção hoje mesmo um tempão... mas eu dei uma olhada agora, parece que já tá ok. A questão do 3D, eu nunca tentei, na verdade parece que o GM não aceita muito bem o uso de surfaces quando o modo 3D estiver ativado...

Pedro Henrique escreveu:
Teria como você fazer uma explicação dos calculos usados?
Não precisa ser hoje (nem amanhã), mas é que seria legal saber como funciona.

Até mais!

Então, na verdade a única coisa que eu fiz foi desenhar dois triângulos e fazer com que os vértices colidissem com os objetos. Eu fiz um loop pra e ir repetindo de acordo com o nível de "perfeição" do desenho. Quanto maior for o loop, mais triângulos ele iria desenhar, e então teria uma probabilidade maior dele encontrar um objeto "em um espaço menor" de distância, daí o desenho fica com um acabamento melhorzinho...

Daí é só usar a função draw_primitive() e escolher o tipo de vetor que vc quer desenhar, como eu queria triângulos, eu usei o tipo pr_trianglelist que "cria" um triângulo a cada 3 vértices que a gente põe. Cada vez que você chama a draw_vertex(), você tá definindo um ponto a mais no desenho.

Daí o que eu fiz foi só projetar o desenho de acordo com o ângulo e o "alcance" da "lanterna"! A medida que ele vai colidindo, ele vai pegando a forma do objeto! É tosco mas fica massa. Se vc colocar várias bolinhas uma do lado da outra, quando a luz colide fica parecendo uma grade! Eu achei da hora d+

GameMakerTutoriais

Número de Mensagens : 800
Data de inscrição : 29/01/2011
Reputação : 26
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Re: Projeção de luz e sombra usando cálculo vetorial

Mensagem por PedroX em Seg 18 Jul 2011, 19:01

Então eu poderia usar um draw_triangle() normal para desenhar a faixa de luz? Claro, usando as funções de blend. Como seria?

Edit: Agora que pensei melhor, acho que ia ser complicado fazer o triângulo colidir com os objetos, mas espero sua resposta.

Até mais!

PedroX

Ranking : Nota C
Número de Mensagens : 6034
Idade : 21
Data de inscrição : 26/07/2008
Notas recebidas : C+B
Reputação : 286
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   :
   :
   :

Voltar ao Topo Ir em baixo

Re: Projeção de luz e sombra usando cálculo vetorial

Mensagem por GameMakerTutoriais em Seg 18 Jul 2011, 19:25

Pedro Henrique escreveu:Então eu poderia usar um draw_triangle() normal para desenhar a faixa de luz? Claro, usando as funções de blend. Como seria?

Pode sim, nesse caso você pode escolher duas alternativas diferentes. A primeira seria o tipo pr_trianglestrip: os 3 primeiros pontos q vc fizer com draw_vertex() vai formar um triângulo e se vc fizer mais um ponto, dos dois últimos pontos do triângulo vão se juntar a esse novo ponto formando mais um triângulo, um "pra cima" e outro "pra baixo", fazendo um retângulo.

O outro jeito seria usar o pr_trianglelist e usar 6 pontos pra fazer dois triângulos igual eu fiz no engine. Eu podia ter usado o pr_trianglestrip pq eu ia ganhar velocidade de cálculo jogando fora 2 pontos por vetor, mas como eu fiz o esquema de reflexão de luz, eu precisava de uma medição mais exata e também dá pra colocar textura no meu engine sem distorcer, justamente pq eu usei esse kind que fica fácil calcular os pontos da textura.

Se eu colocar uma textura tipo de folhagem, quando eu refletir a luz, vai dar a impressão que a luz ta pegando de cima de uma árvore! Fica bem legal, mas é um pouco mais trabalhoso usar textura. Não é complicado, só é chato.

Pedro Henrique escreveu:Agora que pensei melhor, acho que ia ser complicado fazer o triângulo colidir com os objetos, mas espero sua resposta.

Na verdade não é. O lance é fazer colidir rápido porque são muitos vetores pra desenhar. Esse que é o segredo. Eu até pedi ajuda o pessoal do fórum, tem um tópico que a galera toda, a gente tava vendo um jeito rápido de testar a posição de objeto usando collision_line ao invés de place_meeting (ou position_metting). Usei esse esquema e o resultado é o engine! blz

Daí fazer a colisão fica fácil, é só direcionar a collision_line com lenght_dir da direção da lanterna e correr pro abraço! blz

GameMakerTutoriais

Número de Mensagens : 800
Data de inscrição : 29/01/2011
Reputação : 26
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Re: Projeção de luz e sombra usando cálculo vetorial

Mensagem por PedroX em Seg 18 Jul 2011, 19:33

Pode sim, nesse caso você pode escolher duas alternativas diferentes. A primeira seria o tipo pr_trianglestrip: os 3 primeiros pontos q vc fizer com draw_vertex() vai formar um triângulo e se vc fizer mais um ponto, dos dois últimos pontos do triângulo vão se juntar a esse novo ponto formando mais um triângulo, um "pra cima" e outro "pra baixo", fazendo um retângulo.
Eu me referia àquelas funções básicas, como draw_circle(), draw_rectangle() e draw_triangle(). Não referia ao draw_vertex e pr_trianglestrip. Se entendeu, poderia mostrar como seria?

Até mais!

PedroX

Ranking : Nota C
Número de Mensagens : 6034
Idade : 21
Data de inscrição : 26/07/2008
Notas recebidas : C+B
Reputação : 286
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   :
   :
   :

Voltar ao Topo Ir em baixo

Re: Projeção de luz e sombra usando cálculo vetorial

Mensagem por GameMakerTutoriais em Seg 18 Jul 2011, 20:01

Pedro Henrique escreveu:Eu me referia àquelas funções básicas, como draw_circle(), draw_rectangle() e draw_triangle(). Não referia ao draw_vertex e pr_trianglestrip. Se entendeu, poderia mostrar como seria?

Até mais!

Dá pra desenhar com o draw_triangle(), mas com com draw_vertex é melhor e mais fácil, além de você poder definir um alpha pra cada vértice. Com draw_retangle já fica impossível, já que não tem jeito de rotacionar o retângulo usando só ela.

Mas com draw_triangle, é tranquilo. É só desenhar 2 triângulos. Salva esse script como "desenha_traco" e testa. Fiz de cabeça, se não funcionar me fala, mas eu tô sem o GM aqui agora...

Código:

var origemx, origemy, destinox, destinoy, largura, p1x, p1y, p2x, p2y, p3x, p3y, p4x, p4y, dir;

origemx  := argument0;
origemy  := argument1;
destinox := argument2;
destinoy := argument3;
largura  := argument4/2;

dir := point_direction(origemx, origemy, destinox, destinoy);

p1x := origemx + lengthdir_x(largura, dir + 90);
p1y := origemy + lengthdir_y(largura, dir + 90);

p2x := origemx + lengthdir_x(largura, dir - 90);
p2y := origemy + lengthdir_y(largura, dir - 90);

p3x := destinox + lengthdir_x(largura, dir + 90);
p3y := destinoy + lengthdir_y(largura, dir + 90);

p4x := destinox + lengthdir_x(largura, dir - 90);
p4y := destinoy + lengthdir_y(largura, dir - 90);

draw_set_color(c_black);
draw_triangle(p1x, p1y, p3x, p3y, p4x, p4y, 0);
draw_triangle(p1x, p1y, p2x, p2y, p4x, p4y, 0);


Daí você usa em um objeto qualquer só pra testar o que eu falei:
Código:
desenha_traco(x, y, mouse_x, mouse_y, 10);

----------------- Edit -----------------

Atualizei o exemplo e corrigi um bug.

GameMakerTutoriais

Número de Mensagens : 800
Data de inscrição : 29/01/2011
Reputação : 26
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Re: Projeção de luz e sombra usando cálculo vetorial

Mensagem por Conteúdo patrocinado Hoje à(s) 15:27


Conteúdo patrocinado


Voltar ao Topo Ir em baixo

Ver o tópico anterior Ver o tópico seguinte Voltar ao Topo

- Tópicos similares

 
Permissão deste fórum:
Você não pode responder aos tópicos neste fórum