B3D Iniciante: Luzes, Câmera, Ação! - Blitz 3D - Artigos - Articles - Fórum

Jump to content

Bem vindo à Unidev
Registre para ter acesso a todos os recursos do site. Uma vez registrado e logado, você poderá criar tópicos, postar em tópicos já existentes, gerenciar seu perfil e muito mais. Se você já tem uma conta, faça login aqui - ou então crie aqui uma conta agora mesmo!
* * * * *
Photo

B3D Iniciante: Luzes, Câmera, Ação!


B3D Iniciante: Luzes, Câmera, Ação!
por


ccnkrylar@aol.com


Traduzido por
willianpolis@bol.com.br?subject=artigo unidev



Introdução:
Para criar um espaço 3D você deve imaginar-se como um diretor decinema. Você precisa de câmeras, luzes, atores, local, efeitosespeciais, uma história, etc. E você como sendo o diretor, controlaonde todas estas coisas estão e como elas interagem-se juntas. Sevocê acha que uma luz deve ser mais azulada para um determinadocenário, por exemplo. Você quer que a câmera focalize da esquerda adireita de um ator, ou seja, você diz à câmera o que você está querendo ver. [/b]



Bem, você pode fazer todas estas coisas no B3D também! A única diferença é que ao invés de somente dizer "câmera: focalize o ator da esquerda à direita", você precisa escrever o código que irá fazer isto.


O que nós iremos fazer neste tutorial é mostrar à você como iluminar um cenário utilizando diferentes tipos de luzes, modificar as cores das luzes e assistir como as diferentes cores das luzes misturam e formam efeitos. E mais ainda. Nós iremos mostrar como controlar a câmera em torno do cenário que é a coisa mais legal que existe em um jogo 3D ... em minha opinião.


Iluminação do Ambiente
A iluminação do ambiente é o termo utilizado para descrever qual tipo de iluminação está sendo utilizada, especialmente a cor. Aqui está um programa simples que seta a cor de iluminação do ambiente para vermelho. [/b]



; Primeiro nós devemos setar a resolução do B3D. Eu estou utilizando 640x480.
  Graphics3D 640,480
  
  ; Depois, somente no B2D, nós iremos utilizar o double buffering
  SetBuffer BackBuffer()
  
  ; Adicione a iluminação do ambiente para vermelho
  AmbientLight 255,0,0
  
  ; Agora nós iremos precisar de uma câmera
  Camera = CreateCamera()
  
  ; E nós iremos fazer com que a câmera cubra toda a tela
  CameraViewport camera,0,0,GraphicsWidth(),GraphicsHeight()

  ; Criar uma cilindro para termos algo na tela
  Global Cylinder=CreateCylinder(6)
  
  ; Mover o cilindro para o tornar visível
  MoveEntity Cylinder,0,0,5

  ; Cheque se o usuário não apertou a tecla "ESC"
  While Not KeyHit(1)
        ; Gire o cilindro para todas as direções
        TurnEntity Cylinder,1,1,1
        
        ; Atualiza as animações e checa as colisões
        UpdateWorld
        
        ; Renderize todos os desenhos na tela
        RenderWorld
        
        ; Movimente a página para vermos o que aconteceu
        Flip
        
   Wend  ; fim do loop while
Se você rodar este programa você verá um cilindro vermelho girando em um eixo em diferentes sentidos e direções. Ele está na cor vermelha por estar refletindo a iluminação do ambiente que nós determinamos como vermelho. Modifique os valores do comando AmbientLight para ver as diferentes visualizações. O primeiro parâmetro é o valor da cor vermelha, o segundo é a cor verde e o terceiro é o valor da cor azul. Os valores podem ser modificados com valores que variam do 0 ao 255, onde o 0 é o mais escuro é o 255 é o mais claro. Exemplo: 0,0,0 seria a cor preta e 255,255,255 seria a cor branca.


Iluminação Direcionada
A luz direcional é simplesmente ter uma determinada direção para a iluminação. É diferente da Iluminação Ambiente pois este não cobre todo o cenário e sim somente a parte direcionada pelo comando. Veja o exemplo: [/b]
; Primeiro nós devemos setar a resolução do B3D. Eu estou utilizando 640x480.
  Graphics3D 640,480
  
  ; Depois, somente no B2D, nós iremos utilizar o double buffering
  SetBuffer BackBuffer()
  
  ; Criar uma origem de luz e setala para "1" 
  Light = CreateLight(1)
  
  ; Setar a cor da luz para azul
  LightColor Light,0,0,255
  
  ; Agora nós iremos utilizar uma câmera
  Camera = CreateCamera()
  
  ; E nós iremos fazer com que a câmera cubra toda a tela
  CameraViewport camera,0,0,GraphicsWidth(),GraphicsHeight()

  ; Criar dois cilindros para termos algo na tela
  Global Cylinder=CreateCylinder(6)
  Global Cylinder2=CreateCylinder(6)
  
  ; Mover os cilindros para torná-los visíveis
  MoveEntity Cylinder,-7,0,10
  MoveEntity Cylinder2,7,0,10

  ; Checar se o usuário não apertou a tecla "ESC"
  While Not KeyHit(1)
        ; Vire nossa fonte de luz da direita para a esquerda (utilizando o Yaw)
        TurnEntity Light,0,-1,0
        
        ; Atualizar as animações e checar por colisões
        UpdateWorld
        
        ; Renderizar os desenhos na tela
        RenderWorld
        
        ; Movimentar a página para ver o que aconteceu
        Flip
        
   Wend  ; Fim do loop While
Este programa irá exibir dois cilindros de lados opostos na tela e uma origem de luz azul que os atravessam. Este é um exemplo de Iluminação Direcionada.


Posicionando Iluminação
Quando criar uma iluminação do tipo "Point", você pode imaginar o que acontece. A luz irá ser direcionada em um ângulo entre 0 e 360
graus qualquer que seja a cor de luz utilizada.
[/b]
; Primeiro nós devemos setar a resolução do B3D. Eu estou utilizando 640x480.
  Graphics3D 640,480
  
  ; Depois, somente no B2D, nós iremos utilizar o double buffering
  SetBuffer BackBuffer()
  
  ; Criar uma origem de luz e setala para "2"
  Light = CreateLight(2)
  
  ; Setar a cor da luz para azul
  LightColor Light,0,0,255
  
  ; Agora nós iremos utilizar uma câmera
  Camera = CreateCamera()
  
  ; E nós iremos fazer com que a câmera cubra toda a tela
  CameraViewport camera,0,0,GraphicsWidth(),GraphicsHeight()

  ; Criar dois cilindros para termos algo na tela
  Global Cylinder=CreateCylinder(6)
  Global Cylinder2=CreateCylinder(6)
  
  ; Mover os cilindros para torná-los visíveis
  MoveEntity Cylinder,0,1.5,5
  MoveEntity Cylinder2,0,-1.5,5
  MoveEntity Light,0,-5,0

  ; Checar se o usuário não apertou a tecla "ESC"
  While Not KeyHit(1)
        ; Atualizar as animações e checar por colisões
        UpdateWorld
        
        ; Renderizar os desenhos na tela
        RenderWorld
        
        ; Movimentar a página para ver o que aconteceu
        Flip
        
   Wend  ; Fim do loop While
Note que o topo do menor cilindro não tem qualquer foco de luz sobre ele. Isto ocorre pois apontamos a iluminação diretamente ao outro cilindro. Se nós movermos a câmera para trás destes cilindros nós veremos que o mesmo ocorre na parte de trás.


Spotlights
O último tipo de iluminação que você pode utilizar é o tipo spotlight. Este método é basicamente descrito como grandes luzes que são anguladas de tal forma que a luz se precipita para mais adiante da origem da luz, efeito este que é representa em forma de raio. Pense nisto como o símbolo do Batman em Gotham city. Como luzes direcionadas, as spotlights podem ser posicionadas onde você quiser.

[/b]



Veja sua utilização:
; Primeiro nós devemos setar a resolução do B3D. Eu estou utilizando 640x480.
  Graphics3D 640,480
  
  ; Depois, somente no B2D, nós iremos utilizar o double buffering
  SetBuffer BackBuffer()
  
  ; Setar a cor da luz para verde-azulado escuro
  AmbientLight(0,55,55)
  
  ; Criar uma origem de luz e setala para "3"
  Light = CreateLight(3)
  
  ; setar a cor de nossa iluminação para azul
  LightColor Light,255,0,255
  ; Ajustar os ângulos do spotlight para parecer como um cone
  LightConeAngles Light,0,2
  ; Posicionar a luz para ser setada para 75
  PositionEntity light,0,0,-75
  ; Permitir a faixa de iluminação acabar
  LightRange light,75

  ; Agora nós iremos utilizar uma câmera
  Camera = CreateCamera()
  
  ; E nós iremos fazer com que a câmera cubra toda a tela
  CameraViewport camera,0,0,GraphicsWidth(),GraphicsHeight()

  ; Criar duas esferas para termos algo na tela
  Global Sphere=CreateSphere(12)
  Global Sphere2=CreateSphere(6)


  ; Mover as esferaspara torná-las visíveis
  MoveEntity Sphere,-1.5,0,3
  MoveEntity Sphere2,1.5,0,7

  ; Angulação do nosso spotlight
  Offset# = .05

  ; Checar se o usuário não apertou a tecla "ESC"
  While Not KeyHit(1)
        ; Se o Yaw da luz for maior que 5
        If EntityYaw(Light) > 5
           ; inicie o movimento da luz de outra forma 
           Offset = -.05
        EndIf

        ; Se o Yaw da luz for menor que 5
        If EntityYaw(Light) < -5
           ; inicie o movimento da luz de outra forma 
           Offset = .05
        EndIf

        ; Vire nossa fonte de luz da direita para a esquerda (utilizando o Yaw)
        TurnEntity Light,0,Offset,0

        ; Atualizar as animações e checar por colisões
        UpdateWorld
        
        ; Renderizar os desenhos na tela
        RenderWorld
        
        ; Movimentar a página para ver o que aconteceu
        Flip
        
   Wend  ; Fim do loop While
Quando você rodar este programa você verá duas esferas. Uma delas está mais perto e outra está mais distante. O spotlight avermelhado movimentará vagarosamente entre as esferas. O movimento da esquerda para à direita do spotlight é manipulado pelo comando TurnEntity, utilizando o elemento Yaw. Mas como nós iremos saber até qual distância nós iremos mover esta spotlight nesta direção? Nós chamamos o comando EntityYaw para saber o Yaw atual de nosso spotlight. Se nós quiséssemos checar o movimento de cima para baixo, nós utilizaríamos o comando EntityPitch. E para a posição? Nós utilizamos o comando EntityRoll.



P.S.: Yaw, Pitch e Roll já foram discutidos em tutoriais anteriores, consulte-os em caso de dúvida.




Note também o uso do comando AmbientLight. Ele foi utilizado para mostrar um contraste do spotlight.



Existem mais alguns comando que nós devemos discutir. O primeiro é o comando LightConeAngles. Existem três argumentos para este
comando. O primeiro é sobre qual luz utilizar. O segundo é sobre a largura do cone e o terceiro é sobre o raio do cone. Por terem o
formato de um cone, os spotlights possuem um círculo interior e um círculo exterior. Você pode controlar a largura de ambos. Você
precisa mexer com os valores de parâmetro deste comando para verificar isto.



O segundo comando é o LightRange. Dois argumentos são requeridos para este comando: entity e range. O entity é qual luz nós queremos setar e o range é a distância que a luz pode alcançar. Este valor é muito aproximado e deve ser experimentado com melhores resultados. Por exemplo, eu setei esta luz para 75 unidades mas um valor de 50 para o range. Eu seto o valor para 75 no exemplo acima para ter um valor de efeito melhor. Lide com este valor e veja o que acontece.


Movimento de Câmera
Movimento de câmera é muito bom quando criar jogos por muitas razões, mas uma das melhores (em minha opinião) é que ele permite o jogador ver coisas de diferentes perspectivas. Você pode utilizar câmeras para ver seu personagem de costas, de frente, de lado, de cima, de baixo, olho-a-olho, etc. [/b]


O código seguinte é algo maior, mas muito legal. Eu adicionei dois cones e os iniciei girando-os. Eu adicionei duas novas fontes de luz spotlights. Finalmente existe a habilidade de mover a câmera. Isto será visto no código fonte.



Aqui está o código:
; Primeiro nós devemos setar a resolução do B3D. Eu estou utilizando 640x480.
  Graphics3D 640,480
  
  ; Depois, somente no B2D, nós iremos utilizar o double buffering
  SetBuffer BackBuffer()
  
  ; Setar a cor da luz para verde-azulado escuro
  AmbientLight(0,55,55)

  ; Criar 3 origens de luz, setar o Spotlight para "3" 
  Light = CreateLight(3)
  Light2 = CreateLight(3)
  Light3 = CreateLight(3)
  
  ; setar a cor de nossa primeira luz para azul
  LightColor Light,255,0,255
  ; Ajustar os ângulos do cone spotlight 
  LightConeAngles Light,0,2
  ; Posicionar a luz para ser setada para 75
  PositionEntity light,0,0,-75
  ; Permitir a faixa de iluminação acabar
  LightRange light,75

  ; setar a cor de nossa segunda luz para azul
  LightColor Light2,255,255,0
  ; Ajustar os ângulos do cone spotlight
  LightConeAngles Light2,0,2
  ; Posicionar a luz para ser setada para 75
  PositionEntity light2,0,0,-75
  ; Permitir a faixa de iluminação acabar 
  LightRange light2,75

  ; setar a cor de nossa terceira luz para azul
  LightColor Light3,255,255,255
  ; Ajustar os ângulos do cone spotlight
  LightConeAngles Light3,0,5
  ; Posicionar a luz para ser setada para 75
  PositionEntity light3,18,0,-75
  ; Permitir a faixa de iluminação acabar
  LightRange light3,100


  ; Agora nós iremos utilizar uma câmera
  Camera = CreateCamera()
  
  ; E nós iremos fazer com que a câmera cubra toda a tela
  CameraViewport camera,0,0,GraphicsWidth(),GraphicsHeight()

  ; Criar duas entidades para termos algo na tela
  Global Sphere=CreateSphere(12)
  Global Sphere2=CreateSphere(6)
  Global Cone=CreateCone(24)
  Global Cone2=CreateCone(24)


  ; Mover nossas entidades para o lugar
  MoveEntity Sphere,-1.5,0,3
  MoveEntity Sphere2,1.5,0,7
  MoveEntity Cone,18,0,30
  MoveEntity Cone2,18,0,20


  ; Angulação do nosso spotlight
  Offset# = .05

  ; Checar se o usuário não apertou a tecla "ESC"
  While Not KeyHit(1)
        ; Se o Yaw da luz for maior que 10
        If EntityYaw(Light) > 5
           ; inicie o movimento da luz de outra forma 
           Offset = -.08
        EndIf

        ; Se o Yaw da luz for menor que -10
        If EntityYaw(Light) < -17
           ; inicie o movimento da luz de outra forma 
           Offset = .08
        EndIf

        ; Vire nossa primeira origem de luz da direita para esquerda (utilizando Yaw)
        TurnEntity Light,0,Offset,0


        ; gire nosso cones para ter um pequeno efeito visual 
        TurnEntity cone,0,0,1
        TurnEntity cone2,2,2,2

        ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
        ;; Cheque o movimento da esquerda para à direita YAW ;;
        ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
        ; Se o usuário apertar a tecla de direção "direita"
        If KeyDown(205) 
           ; move a cena para a baixo
           CameraYaw = -2
           ; seta um flag para fazer nossa tela ir para baixo
           YawKeyHit = 1
        EndIf

        ; se o usuário apertar a tecla para a esquerda
        If KeyDown(203) 
           ; mova o cenário para a direita em 2
           CameraYaw = 2
           ; seta um flag quando a tecla for apertada
           YawKeyHit = 1
        EndIf

        ; se o YawKeyHit flag estiver stadp então faça 
        ; o movimento da câmera utilizando o YAW.
        If YawKeyHit = 1
           ; mova o cenário para a direção correta em 1 
           TurnEntity Camera,0,CameraYaw,0
           ; reseta o flag
           YawKeyHit = 0
        EndIf

        ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
        ;; Cheque o movimento de cima para baixo (Pitch)    ;;
        ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
        If KeyDown(208) 
           ; mova o cenário para baixo em 1
           CameraPitch = -1
           ; sete um flag quando a tecla for apertada
           PitchKeyHit = 1
        EndIf
        If KeyDown(200) 
           ; mova o cenário para baixo em 1
           CameraPitch = 1
           ; sete um flag quando a tecla for apertada
           PitchKeyHit = 1
        EndIf


        ; se o PitchKeyHit flag estiver setado, então faça 
        ; o movimento de giro da câmera utilizando o PITCH
        If PitchKeyHit = 1
           ; move o cenário uma direção correta em um 
           TurnEntity Camera,CameraPitch,0,0
           ; reseta o flag
           PitchKeyHit = 0
        EndIf

        ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
        ;; Cheque o movimento de mais perto e mais longe    ;;
        ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
        If KeyDown(44) 
           ;  mova a câmera em -.1
           CameraDir# = -.1
           ; sete um flag quando a tecla for apertada
           DirKeyHit = 1
        EndIf

        If KeyDown(30) 
           ; mova a câmera em .1
           CameraDir# = .1
           ; sete um flag quando a tecla for apertada 
           DirKeyHit = 1
        EndIf

        ; Se o DirKeyHit flag estiver setado, então faço o atual
        ; movimento da câmera utilizando o valor z# 
        If DirKeyHit = 1
           ; move a câmera para uma distância e direção correta
           MoveEntity Camera,0,0,CameraDir#
           ; reseta o flag
           DirKeyHit = 0
        EndIf


        ; Atualizar as animações e checar por colisões
        UpdateWorld
        
        ; Renderizar os desenhos na tela
        RenderWorld
       
        ; Informar ao usuário quais tecla ele deve utilizar para movimentar-se 
        Text 0,0,"A=Forward, Z=Backward, ArrowKeys=Up/Down/Left/Right, ESC=Exit"
        
        ; Movimentar a página para ver o que aconteceu
        Flip
        
   Wend  ; Fim do loop While 
Não há nada neste código que nós não tenhamos discutido ainda. Ele apresenta-se um pouco complexo devido ao seu tamanho. Mexa os parâmetros dos comando para notar as diferenças de resultado. Tente também adicionar o "roll" para o código. A idéia é que você precisa das teclas de direção para setar a velocidade do roll e utilizar o TurnEntity para atualizar o valor do roll.


Conclusão

Eu espero que você tenha gostado deste tutorial do B3D. Eu irei continuar a trabalhar mais sobre novas coisas. Até mais!

[/b]
  • doll likes this



0 Comments