Pergunta

Usando o Glscene em Delphi, preciso encontrar a interseção entre um objeto (uma linha ou avião é suficiente) e o espaço visível, para determinar qual parte desse objeto está sendo exibida no momento.
Tentei obter o View Frustum, mas não consegui encontrar como. Eu estava pensando em usar a posição, a direção e o campo da câmera, mas suspeito que eles não sejam atualizados ao usar métodos como o MovearoundTarget ou definir o objeto de destino.
Obrigado,
Marco

Foi útil?

Solução

Para obter o frustum, você pode usar a matriz ModelViewProjection obtida multiplicando o ModelViewMatrix e a projeção Matrix do buffer atual da TglScene. Para obter os aviões da matriz, use a função ExtractFrustumFrodelViewProjeção. Aqui está um trecho de código:

var
  matMVP: TMatrix;
  frustum : TFrustum;
  intersectPoint : TVector;
begin
  // get the ModelViewProjection matrix
  matMVP:=MatrixMultiply(GLScene1.CurrentBuffer.ModelViewMatrix, GLScene1.CurrentBuffer.ProjectionMatrix);
  // extract frustum
  frustum:=ExtractFrustumFromModelViewProjection(matMVP);
  // calculate intersection between left plane and line passing through GLArrowLineX object
  if (IntersectLinePlane(GLArrowLineX.Position.AsVector,GLArrowLineX.Direction.AsVector, frustum.pLeft, @intersectPoint)=1)
  then begin
    // do something with intersectPoint
  end else begin
    // no intersection point (parallel or inside plane)
  end;
end;

Outras dicas

Você pode tirar o frustum do objeto da câmera (propriedade tglSceneViewer.camera) - as propriedades NearPlane, DepthOfView, Position, Direction será necessário, bem como 'tglSceneViewer.FieldOfView'.

O tglcamera também tem um método chamado RayCastIntersect Isso pode ser útil.

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