Determinando a interseção com Frustum em Glscene
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
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.