Frage

mit GLScene in delphi Ich brauche die Kreuzung zwischen einem Objekt (eine Linie oder Ebene ist genug) und den sichtbaren Raum zu finden, um zu bestimmen, welcher Teil dieses Objekts zur Zeit angezeigt wird.
Ich habe versucht, immer die Sichtstumpfs, aber ich konnte nicht finden, wie. Ich dachte an Kamera Position, Richtung und Sichtfeld, aber ich vermute, dass sie nicht aktualisiert werden, wenn Methoden wie MoveAroundTarget oder Einstellen des Zielobjekts.
Danke,
Marco

War es hilfreich?

Lösung

Um die Stumpfes erhalten Sie die ModelViewProjection Matrix erhalten können Sie die ModelViewMatrix und die ProjectionMatrix von TGLScene aktuellen Puffer multipying. Um die Flugzeuge aus der Matrix die ExtractFrustumFromModelViewProjection-Funktion verwenden. Hier ist ein Code-Snippet:

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;

Andere Tipps

Sie können die Stumpfes aus dem Kameraobjekt (TGLSceneViewer.Camera Eigenschaft) erhalten - die Eigenschaften NearPlane, DepthOfView, Position, Direction benötigt werden, sowie ‚TGLSceneViewer.FieldOfView‘.

Die TGLCamera hat auch ein Verfahren RayCastIntersect genannt, die als nützlich erweisen können.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top