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.

Foi útil?

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).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top