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

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top