Interseção de Ray-Box durante a travessia de cena com transformadas de matriz

StackOverflow https://stackoverflow.com/questions/2557681

  •  23-09-2019
  •  | 
  •  

Pergunta

Existem algumas maneiras pelas quais estou testando minhas interseções de caixa de raio:

  1. Usando o método ComputeIntersectionBox (...), que pega um raio e uma caixa como argumentos e calcula a interseção mais próxima do raio e da caixa. Esse método funciona formando um plano com cada uma das faces da caixa e encontrando um cruzamento com cada um dos planos. Depois que um cruzamento é encontrado, é feita uma verificação se o ponto está na superfície da caixa, verificando se o ponto de interseção está entre os pontos de canto. Quando olho para os Rays depois de executar esse algoritmo em duas caixas diferentes, obtenho os cruzamentos corretos.

  2. Usando o método ComputeIntersectionScene (...) sem usar as transformações da matriz em uma cena que possui duas esferas, um dodecaedro (uma malha triangular) e duas caixas. ComputeIntersectionScene (...) atravessa recursivamente todos os nós do gráfico da cena e calcula a interseção mais próxima com o raio fornecido. Este teste em particular não aplica nenhuma transformação que os nós pais possam ter isso também precisam ser aplicados aos seus filhos. Com este teste, também obtenho as interseções corretas.

  3. Usando o método ComputeIntersectionScene (...) com as transformações da matriz. Este teste funciona como o acima, exceto que, antes de encontrar uma interseção entre o raio e um nó na cena, o raio é transformado no quadro de coordenadas do nó usando o inverso da matriz de transformação do nó e, após a interseção ter sido calculada, essa interseção é transformado de volta às coordenadas mundiais aplicando a matriz de transformação ao ponto de interseção.

Ao testar com o terceiro método no mesmo arquivo de cena descrito em 2, testando com 4 raios (assim um raio cruza a esfera, um raio da outra esfera, uma caixa de raio e um raio na outra caixa), apenas As duas esferas se cruzam e as duas caixas não recebem cruzamentos. Quando depuro investigar meu método ComputeIntersectionBox (...), ele realmente me diz que o raio cruza todos os aviões na caixa, mas cada ponto de interseção não está na caixa.

Isso parece ser um comportamento estranho, pois, ao usar o teste 2 sem transformações, obtenho os cruzamentos corretos da caixa (assim, acredito que minha interseção de caixa de raio esteja correta) e, ao usar o teste 3 com transformações, obtenho as interseções corretas da esfera ( Assim, acredito que meu raio transformado deve estar bem).

Alguma sugestão de onde eu poderia estar errado?

Agradeço antecipadamente.

Foi útil?

Solução

Portanto, o erro foi na verdade um bug de implementação: quando eu estava transformando o raio, estava transformando o ponteiro para o raio, que transformou todos os ponteiros dentro dele também (já que a função é recursiva). O que eu deveria ter feito é fazer uma cópia separada do meu raio e executar a transformação na cópia, não a original.

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