Como projetar um polígono planar em um avião no espaço 3D
-
21-09-2019 - |
Pergunta
Quero projetar meu polígono ao longo de um vetor para um avião no espaço 3D. Eu preferencialmente usaria uma única matriz de transformação para fazer isso, mas não sei como construir uma matriz desse tipo.
Dado
- Os parâmetros do avião (ax+por+cz+d),
- As coordenadas mundiais do meu polígono. Conforme declarado na manchete, todos os vértices do meu polígono ficam em outro avião.
- o vetor de direção ao longo do qual projetar meu polígono (atualmente o vetor normal do avião do polígono)
meta-Uma matriz de transformação 4x4 que executa a projeção necessária,
ou
- Algumas dicas sobre como construir um eu mesmo
ATUALIZAR
Obrigado pela resposta, funciona como pretendido.
Uma palavra de cautela para as pessoas que encontraram isso: se o plano do normal da projeção é paralelo ao vetor de projeção, o denominador D se tornará (quase) 0, para evitar que coisas estranhas aconteçam, algum tipo de manuseio para este caso especial é preciso. Eu o resolvi verificando se D <1e-5, e se sim, basta traduzir meu polígono ao longo do vetor de extrusão HTE.
Solução
Suponha que um dos vértices do polígono seja (x0, y0, z0)
, e o vetor de direção é (dx,dy,dz)
.
Um ponto na linha de projeção é: (x,y,z) = (x0 + t*dx, y0 + t*dy, z0 + t*dz)
.
Você deseja encontrar a interseção dessa linha com o avião, então conecte -o à equação do plano ax+by+cz+d = 0
e resolver para t:
t = (-a*x0 - b*y0 - c*z0 - d) / (a*dx + b*dy + c*dz)
E então você tem seu vértice alvo: x = x0+dx*t
, etc.
Como essa é uma transformação afim, ela pode ser realizada por uma matriz 4x4. Você deve determinar os elementos da matriz escrevendo as três equações para x, y, z em função de x0, y0, z0 e tomando os coeficientes.
Por exemplo, para x:
x = x0 - (a*dx*x0 + b*dx*y0 + c*dx*z0 + d*dx) / D
x = (1 - a*dx/D)*x0 - (b*dx/D)*y0 - (c*dx/D)*z0 - d*dx/D
Onde D = a*dx + b*dy + c*dz
é o denominador de cima. Y e Z funcionam da mesma forma.
Resultado Matrix:
1-a*dx/D -b*dx/D -c*dx/D -d*dx/D
-a*dy/D 1-b*dy/D -c*dy/D -d*dy/D
-a*dz/D -b*dz/D 1-c*dz/D -d*dz/D
0 0 0 1
(Nota: No Direct3D, essa matriz deve ser transposta, porque usa vetores de linha em vez de vetores de coluna).