Pular para o conteúdo principal

Destaque

Dia 291 a 295 - Matemática com Freya Holmer #4


 

Matrizes

    Os dados de transformação da Unity, como rotação na verdade não são armazenados como Quaternions, são armazenados em uma Matriz 4x4.

Essa ultima linha de baixo, aparentemente tem algo a ver com geometria não euclidiana.

    Ai, não mostra a Scale, mas ela está ai, a Scale fica junto da orientação, basicamente a Orientation é o vetor normalizado e a Scale é o comprimento deste mesmo vetor.
isso é de um dia anterior

Podemos usar matrizes para converter do espaço local para o mundial e vice-versa.

    Alias o vector3 também é uma espécie de matriz... de 4 elementos x, y, z, w. esse w aparentemente meio que define se o vector3 representa um ponto (1) ou um vetor (0). Caso w seja 0, a coluna de position da matrix4x4 seria ignorada, mas isso é algo que normalmente não é preciso alterar manualmente.


    Essa é a função usada, para transformar posições entre dois diferentes espaços na Unity. (isso aqui leva tudo em conta, inclusive a rotação)

    Matrizes também podem ser multiplicadas entre si, segundo a Freya dá pra usar isso para meio que fazer dois objetos serem pai e filho, sem ser pai e filho no inspector.

Cross Product/Produto Cruzado

    Cometi um erro antes :) uma falha de compreensão. ela tinha falado sobre multiplicação de vetores, na Unity não é possível multiplicar vetores diretamente, você teria que usar o método Scale. isso multiplicaria tipo: (a.x * b.x, a.y * b.y, a.z * b.z).

Na matemática existem 2 formas de multiplicar vetores:
  • A * B - DOT (retorna um numero)
  • A x B - CROSS (retorna um vetor)
    O que esse Cross faz é retornar um vetor que é perpendicular aos 2 vetores usados no calculo. (exceto se ambos vetores apontarem na mesma direção)
Então supondo que usássemos Z e Y em um Cross, o retorno seria o vetor X.

E se os vetores usados não forem normalizados pode dar uns problemas no resultado.

DIV: eu fiz um teste em uma calculadora de cross product que achei, e bem queria testar se consigo todos os eixos a partir de um único eixo, por exemplo eu poderia usar X e -X. para tentar obter Y ou Z ? e a resposta é não, ele vai retornar um vetor zerado.
DIV²: esse negocio de dois eixos opostos darem 0, ocorre por que existem varias soluções possíveis.

    A forma de calcular é bem simples, basicamente, você vai meio que ocultar cada um dos eixos e vai cruzar os valores e multiplica-los. depois você subtrai, os dois produtos da multiplicação, repete com os outros eixos. e depois você vai ter o seu vetor perpendicular.

Mas felizmente a Unity possui o metodo Vector3.Cross...

    Isso é bem legal, por que mostra que existe uma relação, entre Dot e Cross, aparentemente a saída de A x B (Cross) tem comprimento de A * B (Dot). Logo, o ideal é que se faça uma normalização do Cross.

Div: Eu estava com problema para entender isso de perpendicular entre dois vetores, mas ver essa imagem me ajudou a entender.


exemplo de uso do Cross
    A Freya citou um exemplo bem bacana de uso, no TF2 tem a classe enginner, que pode instanciar uma turreta, se fizermos isso em um jogo, e tiver um terreno irregular, para instanciar a turreta eu vou precisar saber dos eixos para calcular a rotação dela.
    Então de eixo Y, eu poderia usar a normal do terreno onde a turreta seria instanciada, e de eixo Z (direção para onde a turreta apontaria) eu poderia usar a direção para onde o jogador estivesse olhando, mas o problema é que o jogador pode estar olhando para o ceu ou para o chão, então isso deixaria a rotação inicial da turreta estranha... para resolver isso eu posso primeiro fazer um Cross(YNormal,  ZPlayerCam) e isso me daria o eixo X, que está perpendicular ao terreno, ai bastaria eu fazer Cross(X, YNormal) e pronto eu tenho toda a informação que preciso.
OBS: isso se chama ortonormalização, a Unity até possui método que faz isso

DIV: Acho que também daria para fazer uma câmera em terceira pessoa, usando esse mesmo metodo da turreta, mas no lugar do player seria apenas a câmera (o que não muda muita coisa) e no lugar da turreta seria o player. ai com esses cálculos você obteria a direção que a câmera está apontando para quando o jogador precisar virar...

    Outro propriedade interessante, se temos um triangulo, se pegarmos a posição 2 vértices dele e fizermos um cross, o comprimento do cross vai ser o dobro da área do triangulo.

Uma coisa importante, se a ordem dos fatores do Cross for invertida o vetor que será retornado vai apontar na direção oposta.
Dia 292 - 26/02 - terminei o vídeo 2

Tarefas

As tarefas desse vídeo são interessantes.

4 - Fazer um Bouncing Laser

    Até que foi fácil, eu só tive um bugzinho estranho que não entendi o porquê, não estou conseguindo controlar a quantidade de bouncies... estranho, não parece ter nada de errado... depois eu tento resolver...
Dia 293 - 27/02
    Estou na dúvida se estou fazendo certo, tipo no texto da tarefa, ela cita o termo refletir. o que eu estou fazendo é usando o Cross para pegar um raio perpendicular a direção de "entrada", mas se for realmente refletir o objetivo, então seria tipo, refletir a direção de entrada em relação a normal do ponto de colisão. e eu não faço ideia de como fazer isso...
    Na descrição estava falando para não usar o Vector3.Reflect usei só para testar... e realmente não é perpendicular que ela quer...
Depois de muita tentativa e erro, consegui fazer em 2D, agora é tentar adaptar para 3D.
Omiti maior parte do código, mas é essa que interessa a parte onde a magica acontece.

6 - A Turreta


Fiz a primeira parte e é bem simples... o complicado é a segunda parte.
Dia 294 - 28/02
    Tenho que fazer o wireframe do cubo, no ângulo da superfície, mas checar se dois pontos no espaço 3D está sendo meio complicado, por algum motivo o DOT não funciona direito.. e nem um metodo da classe vector3 que checa o ângulo entre dois vetores.. então estou meio que sem como calcular se dois vetores são perpendiculares ou paralelos para poder saber se devo traçar uma linha entre eles, então estou só traçando entre todos por hora.
    Com isso acho que posso considerar a segunda parte 6b como concluída, apesar de que não ficou perfeita.
    E por fim a parte 6c que era fazer linhas representando os canhões da turreta, e fazer as posições delas configuráveis de acordo com alguns parâmetros.

A Solução

5 - Calcular a área de uma Mesh

    A ideia desse aqui é calcular área de um objeto 3D, como existe uma relação entre Cross e área do triangulo é possível, e a Unity enxerga toda malha 3D como um monte de triângulos, então é possível.
    Eu tentei, mas não entendi direito como se "pega" a posição dos vértices de um triangulo específico. então falhei nesse aqui.
Dia 295 - 01/03


Comentários