Determinazione intersezione con frustum in GLScene
Domanda
utilizzando GLScene in Delphi ho bisogno di trovare l'intersezione tra un oggetto (una linea o un piano è sufficiente) e lo spazio visibile, per determinare quale parte di questo oggetto è attualmente in mostra.
Ho provato ricevendo il tronco di vista, ma non riuscivo a trovare il modo. Stavo pensando di utilizzare la posizione della telecamera, la direzione e il campo visivo, ma ho il sospetto che non vengono aggiornati quando si utilizzano metodi come MoveAroundTarget o impostando l'oggetto di destinazione.
Grazie,
Marco
Soluzione
Per ottenere il tronco è possibile utilizzare la matrice ModelViewProjection ottenuto multipying il ModelViewMatrix e il ProjectionMatrix dal buffer corrente di TGLScene. Per ottenere gli aerei dalla matrice utilizzano la funzione ExtractFrustumFromModelViewProjection. Ecco un frammento di codice:
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;
Altri suggerimenti
È possibile ottenere il tronco di fuori dell'oggetto fotocamera (proprietà TGLSceneViewer.Camera) - le proprietà NearPlane
, saranno necessari DepthOfView
, Position
, Direction
, nonche 'TGLSceneViewer.FieldOfView'.
Il TGLCamera ha anche un metodo chiamato RayCastIntersect
che può rivelarsi utile.