Matemática 3D: Calcule o ângulo do banco (rolo) a partir de vetores ortogonais de look e UP
-
28-09-2019 - |
Pergunta
Espero que este seja o local adequado para fazer esta pergunta que é o o mesmo que este, mas expresso como matemática pura em vez de graficamente (pelo menos espero traduzir o problema para a matemática corretamente).
Considerando:
- Dois vetores que são ortogonais: UP (UX, UY, UZ) e Look (LX, LY, LZ)
- um plano p que é perpendicular à aparência (daí, inclusive para cima)
- Y1, que é a projeção de y (eixo vertical) junto com P para P
Pergunta: Qual é o valor do ângulo entre Y1 e UP?
Como os matemáticos concordam, essa é uma pergunta muito básica, mas eu tenho coçado a cabeça há pelo menos duas semanas sem poder visualizar como projetar y para p ... talvez agora velho demais para encontrar soluções para exercícios escolares.
Estou procurando a solução trigonométrica, não uma solução usando uma matriz. Obrigado.
Editar: Descobri que precisava determinar o sinal do ângulo, em relação a um eixo de rotação que precisava ser uma aparência. Publiquei o código final na minha pergunta vinculada (veja o link acima). Obrigado àqueles que ajudaram. Eu aprecio seu tempo.
Solução
Estou apenas fazendo isso no papel. Espero que esteja certo.
Vamos assumir e olhar normalizados, isto é, comprimento 1. Digamos que o plano p contém a origem e l é normal. Y é (0, 1, 0)
Para projetar y em P, encontre sua distância para p ...
d = Y dot L = ly
... e então escala o normal por -d para obter o y1 (ou seja, a projeção de y em p)
Y1 = (lx * ly, ly * ly, lz * ly)
Agora normalize Y1, isto é, escala -o por (1 / comprimento). Se seu comprimento era 0, você está sem sorte.
O produto dot de y1 e up = o cosseno do ângulo. Então
angle = acos(Y1 dot Up)
Outras dicas
- Dois vetores que são ortogonais: UP (UX, UY, UZ) e Look (LX, LY, LZ)
- um plano p que é perpendicular à aparência (daí, inclusive para cima)
- Y1, que é a projeção de y (eixo vertical) junto com P para P
Vou assumir e procurar vetores de unidade. Seja y = (0,1,0).
Vamos encontrar Y1.
Y1 = y - (y * look) * look y1 = y - ly * look y1 = (-lylx, 1 - lyly, -ly*lz)
Observe que Y1 será (0,0,0) quando a aparência for (0,1,0) ou (0, -1,0).
Como Detmar disse, encontre o ângulo entre Y1 e a UP normalizando Y1 e encontrando os ArcCos de Y1 * Up (onde * é o produto DOT)
Este é um problema relativamente simples usando matemática vetorial. Use o equação para projeção vetorial Para obter y1, então o Equação trigonométrica para o produto DOT Para obter o ângulo entre Y1 e Up.
Essas equações seriam muito fáceis de se implementar em praticamente qualquer idioma, mas se você estiver fazendo esse tipo de pergunta, pode estar pretendendo fazer mais matemática vetorial pesada; nesse caso, eu sugiro tentar encontrar um terceiro -Parcary Party.
Você precisa saber sobre vetores no espaço 3D. Eu acho que um entendimento fundamental desses, especialmente pontos e produtos cruzados, o resolverá. Procure um livro de vetores elementares.
Dois vetores que são ortogonais: UP (UX, UY, UZ) e Look (LX, LY, LZ)
Os vetores ortogonais têm um produto de ponto zero.
um plano p que é perpendicular à aparência (daí, inclusive para cima)
Se você aceitar o produto cruzado da pesquisa, receberá o terceiro vetor que, junto com a UP, define o plano perpendicular para procurar.
Y1, que é a projeção de y (eixo vertical) junto com P para P
Não sei o que você está conseguindo aqui, mas o produto DOT de qualquer vetor com look oferece a magnitude do seu componente na direção da aparência.
Se y = (0,1,0) então
Y1 = (-lylx, 1 - lyly, -ly*lz)
| Y1 | = sqrt (y1x^2 + y1y^2 + y1z^2)
| Up | = sqrt (upx^2 + upy^2 + upz^2)
Ângulo do banco = (y1xUPX + Y1YUPY + Y1ZUpz)/(| y1 || Up |)