EP3
starship
Fonte: 20 tiras de Calvin e Haroldo para refletir sobre a vida e sobre o mundo
O prazo de entrega deste EP é 23h59m de quarta-feira, dia 21/06/2023. EPs com atraso receberão desconto de 2 pontos por dia.
Introdução
O objetivo desse exercício programa é praticar a modelagem de cenas e o desenvolvimento de programas gráficos 3D interativos.
Nesse EP vamos começar a implementar um simulador de vôo
simples, para controlar o navegação de uma nave (starship
) por meio do teclado, permitindo que a nave navegue no meio de obstáculos ‘móveis’.
A cena pode ser relativamente simples e a complexidade do desenho não é o foco principal desse exercício. A configuração exata da cena (número de objetos, formas, etc.) é livre e faz parte do exercício individual. Cada cena deve ser composta por objetos do tipo Cubo
e Esfera
, semelhantes aos objetos vistos em classe (veja, entre outras, a aula 15 da apostila). Você pode realizar “deformações” aplicando transformações afins, e o conjunto desses objetos vai representar a cena por onde a nave deverá navegar.
Não é necessário considerar colisões nesse EP, ou seja, a nave pode atravessar os obstáculos, assim como obstáculos podem cruzar outros obstáculos.
Objetos
Nesse EP você deve começar modelando a cena usando cubos e esferas. Uma forma de modelar esses objetos foi apresentada no Capítulo 15.
Sugerimos criar uma classe Cubo
e outra Esfera
para simplificar a criação e animação de múltiplos cubos e esferas. Essas classes devem permitir a criação de cubos de lado 1 e esferas de raio 1, na origem.
Parâmetros de cada objeto
Cada um desses objetos deve permitir conter as seguintes informações de estado
:
- pos: tipo
vec3
, translação do centro do objeto para as coordenadas do mundo. - theta: tipo
vec3
, rotação do objeto com relação a cada eixo do mundo. - escala: tipo
vec3
, escala do objeto com relação a cada eixo do mundo. - vtheta: tipo
vec3
, velocidade de rotação do objeto com relação a cada eixo do mundo. Na minha implementação eu apenas adiciono esse valor, multiplicado pelo intervalo de tempo, a cada frame. Isso permite que os objetos fiquem “rodando”.
O que você deve fazer para construir a cena.
Para facilitar a depuração do seu programa, vamos adotar uma referência única comum a todas as cenas/trabalhos.
Vamos adotar um “CUBO DE REFERÊNCIA” (CDR), de lado 30 e centrado na origem do mundo. Vamos adotar que esse cubo é a nossa referência no mundo, onde o eixo x
aponta para a direita (leste), o eixo y
para a frente (norte) e o eixo z
para cima. Vamos adotar também o seguinte código de cores RGBA:
- (1,0,0,1) - face +x
- (0,1,1,1) - face -x
- (0,1,0,1) - face +y
- (1,0,1,1) - face -y
- (0,0,1,1) - face +z
- (1,1,0,1) - face -z
Além do CDR, a cena deve conter ao menos mais 2 objetos do tipo Esfera
e outros 2 do tipo Cubo
. Ao ser criado, cada objeto deve receber uma lista de cores. Considere esse vetor para pintar cada triângulo do modelo. Considere a lista circular. Assim, caso a lista conter apenas uma cor, todos os triângulos serão pintados dessa cor.
Procure fazer esses objetos grandes o bastante para que possam ser vistos de longe da starship e aparecerem já na primeira renderização.
Seu programa deve oferecer dois botões: ‘Executar/Pausar’ e ‘Passo’. O programa deve iniciar no estado ‘Pausado’, ou seja, nenhum objeto deve se mover. Ao clicar em “Executar” o botão deve mudar de estado, para “Pausar”, e os objetos, inclusive a nave, devem começar a se mover. Clicando novamente em “Pausar”, o botão muda de volta para “Executar” e os objetos e a nave devem parar de se mover. Nesse estado, ao clicar em “Passo”, todos os objetos devem se movimentar o equivalente a 1 segundo. Esse botão não tem efeito quando os objetos estão se movendo.
O que você deve fazer para controlar a starship
Nesse EP a starship (ship
) será basicamente uma câmera. Podemos assumir que a câmera seja a vista do(a) “piloto” da starship. Por hora, imagine que a câmera está presa no nariz da ship. Vamos adotar que o sistema de coordenadas da câmera é inicialmente o mesmo da cena, ou seja, x
para o leste (ou direita), y
para o norte e z
para cima.
A condição inicial da ship
é definido por 3 parâmetros:
- pos: posição da câmera da
ship
; - theta: rotação da câmera em relação aos 3 eixos do mundo;
- vTrans: magnitude da velocidade inicial de translação.
Como orientar a câmera em relação ao mundo
Lembre-se que nossas câmeras apontam para -z
. Assim, após sofrer rotações ao redor de cada eixo (considere sempre que as rotações são aplicadas na mesma ordem dos eixos, ou seja, primeiro em x
, depois em y
e finalmente emz
), o eixo -z
da ship
deve apontar na direção de translação (movimento para frente), o eixo y
da camera deve apontar para cima e o eixo x
deve apontar para a direita no sistema de coordenadas do(a) piloto.
Por exemplo, os ângulos (90, 0, 0)
definem uma rotação em x
que resulta em um ship
apontando no sentido do eixo +y
do mundo (para o norte). Vamos adotar também ângulos em graus, lembre-se de convertê-los para radianos quando necessário.
Calculando o movimento da ship
A velocidade de translação vTrans
é usada para calcular o deslocamento da starship entre dois frames consecutivos, e é fornecida em alguma unidade por segundo. Nesse exercício, não vamos considerar velocidades de rotação (fica como um exercício futuro). Assim, a orientação da starship definida por theta
define para onde o nariz da ship
aponta. Vamos chamar esse vetor de dir
.
A magnitude do deslocamento é calculado medindo-se o intervalo transcorrido desde o último desenho, como fizemos em animações anteriores usando a função Date.now()
do JavaScript, e multiplicando esse tempo por vTrans
. Esse deslocamento deve atualizar a posição da starship, na direção do vetor dir
.
Interface
A aeronave é controlada pelo teclado.
Translação
As teclas J
, K
e L
controlam a velocidade de translação (por simplicidade vamos representar cada tecla por uma letra maiúscula, assim como você vê no seu próprio teclado, mas para interação o sistema deve funcionar com caracteres minúsculas e/ou maiúsculas).
teclas
J
eL
: decrementa/incrementa a velocidade de translação. Veja que a velocidade pode se tornar negativa e a ship vai navegar para trás.tecla
K
: a velocidade de translação é zerada, ou seja, a ship fica parada instantaneamente. Essa tecla pode facilitar a depuração da nave.
Rotação
Eu adotei uma variação de 1 grau cada vez que uma tecla de rotação pressionada.
- teclas
W
eX
: incrementa e decrementa a rotação emx
(pitch).W
faz o nariz da ship subir eX
faz o nariz descer (apontar para baixo). - teclas
A
eD
: incrementa e decrementa a rotação emy
(yaw).A
faz a ship virar para à esquerda eD
para à direita. - teclas
Z
eC
: incrementa e decrementa a rotação emz
(roll). O roll não altera a direção de translação.Z
faz a ship girar no sentido anti-horário eC
no sentido horário.
Depuração
Ao dar um “passo” na animação, use o console.log()
do javascript para imprimir informações sobre a posição e orientação da ship, além de outras informações que desejar. Aproveite que o console é interativo, você pode perguntar diretamente no console sobre o estado de cada variável e até alterar certos valores antes de dar outro passo.
Sugestão de roteiro
Comece criando a cena. Escreva mensagens usando
console.log()
para mostrar o que o seu programa está fazendo. Use objetos do tipo esfera e cubo para criar coisas na cena. Tente fazer um esboço (desenhar) no papel primeiro. Lembre-se que nesse exercício não é preciso se preocupar com colisão. Uma ship pode atravessar os objetos e continuar navegando livremente, mesmo dentro de um objeto.Implemente e teste os botões ‘Executar/Pausar’ e ‘Passo’, acredito que vão lhe ajudar muito. Eu usei um intervalo de 1 s para cada passo da simulação.
Teste as teclas de velocidade, com mensagens apropriados ao console. Com a ship parado, modifique a variação de rotação diretamente no console e clique no botão passo para verificar se seus cálculos estão corretos.
Divirta-se testando o seu programa, atravessando os objetos e visitando mini mundos (mundos dentro de um objeto :-).
Mais sugestões
discuta suas dúvidas com seus colegas no fórum da disciplina.
use o mouse para controlar pitch e yaw.
não deixe para a última hora!
O que você deve entregar
Entregue em um arquivo .zip
contendo todos os arquivos necessários para rodar o seu programa. Procure não utilizar arquivos externos disponíveis na Internet, além dos
módulos que costumamos usar em outros exercícios. Junte tudo em uma pasta, zip e submeta o arquivo zip. Além de todos os arquivos necessário para executar o seu programa [80% da nota], você deve entregar também um arquivo de documentação com o nome leiame.txt
(ou leiame.md
ou similar).
Nesse arquivo leiame.xxx
indique brevemente o que você fez e, caso tenha feito algo diferente (ou extra como partes opcionais) do que foi proposto, descreva. Descreva bugs que você conhecer no seu programa. Descreva também as dependências, outros arquivos e módulos usados em seu programa, caso houver.
Honestidade Acadêmica
Esse é um exercício individual, não em grupo. Isso não significa que você não pode receber ajuda de outras pessoas, inclusive de seus colegas. De uma forma geral, gostaríamos de incentivar as discussões de ideias, conceitos e alternativas de solução. Nossa maior recomendação é evitar olhar o código fonte de uma solução antes de escrever o seu programa. Em caso de dúvida, consulte nossa página.
De forma sucinta, evite as seguintes ações que caracterizam desonestidade acadêmica na realização dos trabalhos individuais desse curso:
- buscar e obter uma solução (parcial ou completa, correta ou não) de exercício programa (EP) na internet ou qualquer outro meio físico ou virtual, durante o período de submissão do referido EP;
- solicitar ou obter uma cópia (parcial ou completa, correta ou não) da solução de um EP durante o seu período de submissão;
- permitir que um colega acesse uma cópia (parcial ou completa, correta ou não) do seu EP, durante o período de submissão;
- ainda mais grave é o plágio, que se configura pela utilização de qualquer material não visto em aula ou não descrito no enunciado, que não seja de sua autoria, em parte ou ao todo, e entregar, com ou sem edição, como se fosse seu trabalho, para ser avaliado.