Pular para o conteúdo principal

Destaque

Dia 281 e 283 a 285 - Matemática com Freya Holmer #2

Agora de volta a matemática 

Dot Product - Produto Escalar

Vou deixar o nome assim pq essa tradução automática esta me deixando confuso.

Aparentemente, há mais de uma forma de se multiplicar dois vetores 2D.

A primeira e que achei ser a única, é multiplicar os componentes de cada vetor um pelo outro ou seja:

a(1,2) * b(2,3) = (1*2, 2*3) = (2, 6) 

Segundo a Freya, na Unity, isso é feito por meio do método Vector2.Scale e Vector3.Scale...

Dia 281 - 12/02 - 2:30h

DIV: agora usarei esse abreviação para minhas divagações, apesar de em html isso ter um significado próprio, eu estava tentando assistir mais, mas sinceramente, comecei a não entender do que raios ela está falando :) aliás, penso em fazer um protótipo simples para aplicar tudo que ela já disse, quem sabe um jogo de tiro top down simples 2D.

Produto Escalar

    O Produto escalar, é como se você usasse um dos vetores para servir de base de um triangulo retângulo, e o resultado seria o comprimento do trecho que serviu de base.

 

    E independente da ordem, o resultado é o mesmo, um ou ambos vetores devem ser normalizados (comprimento de 1) antes.
    E se necessário o vetor pode ser meio que espelhado para o lado negativo, mas ai o resultado fica negativo.
A formula de Produto Escalar


    Mais algumas coisas interessantes sobre isso, se for feito o produto escalar entre dois vetores iguais o resultado será 1, e se os vetores estiverem em um ângulo de 90° um do outro o resultado vai ser 0. e se ambos estiverem digamos apontando em direções opostas/espelhadas, vai ser -1.

    Esse produto escalar significa basicamente, a diferença entre as direções que os dois vetores estão apontando.
    No vídeo a Freya citou um uso que me deixou meio confuso, ela tinha um jogo onde uma bola é lançada em uma superfície, para saber com que volume emitir um barulho quando a bola batesse na superfície, ela calculou o produto escalar entre a Normal da superfície e a direção da velocidade da bola, assim ela obteve a velocidade da bola em relação a direção da superfície. então se a bola estivesse caindo verticalmente na superfície, o valor seria -1, mas ai ela usaria um abs, que resultaria em 1, o que daria o volume máximo, e quando mais horizontalmente é a velocidade da bola, mais baixo seria o volume, já que o produto escalar estaria cada vez mais próximo de 0.

PS: Não importa se os vetores não estiverem normalizados, se os vetores forem perpendiculares, o resultado sempre vai ser 0, mas nesse caso o "1 e -1" muda.

E terminei de ver o vídeo 1.

E no final do vídeo ela propôs uns desafios

1 - Fazer um Trigger Radial

2 - Fazer um Script de "Campo de visão
Inicialmente pensei, isso vai ser fácil... moleza, mas demorei um tempinho.
Essa imagem representa o mundo, o problema de se calcular o Dot de A e B, é que ele sempre será em relação a (0, 0). e eu quero que o A seja a origem, a forma de fazer isso até que é bem simples, basicamente, eu vou fazer A - B, assim eu terei a posição de B caso A, fosse a origem do mundo, acho que dá pra chamar isso de posição no local space de A, mas nesse caso sem levar em conta a rotação. ai entra um problema, para calcular Dot eu preciso de dois vetores e agora A é a origem, ou seja (0, 0), mas não importa a posição de A o que importa é sua rotação, mas como não sei como calcular a rotação, por hora deixei um vetor para cima no lugar dela.


DIV
DIV: Hora de divagar, sobre a natureza da rotação, aquela imagem de circulo acima me lembra bastante a rotação, fiz a imagem abaixo, supondo que um dos vetores do seja para cima, acho que eu tendo o ângulo euler, talvez eu seja capaz de calcular o outro vetor 2D, mas creio que não, já que isso seriam o x e o y... mas uma certeza que tenho é que é possível calcular o ângulo, com a ajuda de um lerp, entre 0 e 1, ohhh descobri, eu acho, eu posso usar o transform do objeto para pegar uma direção do mesmo, como o up, right, foward, etc, e ai eu terei o vetor que preciso para usar no lugar do Vector2.up do código acima, e talvez isso também me ajude no desafio 3, meu tempo hoje acabou, então termino amanha.
Dia 284 - 15/02 - terminei o vídeo e parei por aqui
e foi...

3 - Fazer um método que converta de World Space para local Space e outro que faz o oposto e isso usando também a rotação.

Partindo do básico, apenas o calculo mais simples, que funciona sem considerar a rotação.

fiz com que o inspector mostrasse todas informações que quero e com isso comprovei uma suspeita. a Freya havia dito que o Dot, diz o quanto o vetor está apontando na direção do outro, então existe uma relação entre o Dot e a posição, se eu usar os eixos X e Y do meu objeto pai no dot com o objeto filho, eu terei um novo vetor 2d, que representa o dot, e como esse Dot é o quanto o vetor está indo em determinada direção se eu multiplicar pela distancia eu obtenho a posição local.
MAS, parece que a forma que se obtém a posição mundial é um pouco diferente. 

😱 aparentemente a partir de uma certa distancia a conversão de mundial para local usando esse método deixa de funcionar... pelas minhas observações essa distancia é 45 m. 😢 foda que o por que de funcionar fazia sentido.
Entendi pq a direção mundial está dando incorreta, primeiro na hora de calcular o dot, antes de normalizar eu tenho que somar a posição do objeto pai, e com isso ele vai consegui converter caso o objeto pai esteja na rotação zerada. Mas se tiver em outra rotação a posicão calculada será errada, por que tenho que considerar também a rotação do objeto pai... enfim por hoje é isso.
Dia 285 - 16/02 - continuei os exercícios

DIV: talvez amanhã eu continue ou talvez, eu vá logo ao próximo vídeo, já que nele tem as soluções explicadas :)

Comentários