La détermination de l'intersection avec GLScene en tronc de cône
Question
à l'aide GLScene dans delphi Je dois trouver l'intersection entre un objet (une ligne ou un plan est suffisant) et l'espace visible, afin de déterminer quelle partie de cet objet est présente actuellement.
J'ai essayé d'obtenir la vue mais frustum je ne pouvais pas trouver comment. Je pensais à l'aide de la caméra la position, la direction et le champ de vision, mais je pense qu'ils ne sont pas mis à jour lors de l'utilisation des méthodes telles que MoveAroundTarget ou réglage de l'objet cible.
Merci,
Marco
La solution
Pour obtenir le tronc de cône, vous pouvez utiliser la matrice ModelViewProjection obtenue multipying la ModelViewMatrix et la ProjectionMatrix du tampon courant de TGLScene. Pour obtenir les plans de la matrice utilisent la fonction ExtractFrustumFromModelViewProjection. Voici un extrait de code:
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;
Autres conseils
Vous pouvez obtenir de tronc de cône l'objet caméra (propriété TGLSceneViewer.Camera) - les propriétés NearPlane
, DepthOfView
, Position
, Direction
seront nécessaires, ainsi que « TGLSceneViewer.FieldOfView ».
Le TGLCamera a aussi une méthode appelée RayCastIntersect
qui peut se révéler utile.