Bestimmen Kreuzung mit Stumpfes in GLScene
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
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.