2

在 delphi 中使用 GLScene 我需要找到对象(一条线或平面就足够了)和可见空间之间的交集,以确定该对象当前显示的部分。
我尝试获取视锥,但找不到方法。我正在考虑使用相机的位置、方向和视野,但我怀疑在使用 MoveAroundTarget 等方法或设置目标对象时它们没有更新。
谢谢,
马可

4

2 回答 2

2

要获得截锥体,您可以使用从 TGLScene 的当前缓冲区中乘以 ModelViewMatrix 和 ProjectionMatrix 获得的 ModelViewProjection 矩阵。要从矩阵中获取平面,请使用 ExtractFrustumFromModelViewProjection 函数。这是一个代码片段:

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;
于 2010-01-08T10:51:21.930 回答
1

您可以从相机对象(TGLSceneViewer.Camera 属性)中取出截锥体——将需要属性、、、NearPlane以及DepthOfView“ TGLSceneViewer.FieldOfView”。PositionDirection

TGLCamera 还有一个被称为RayCastIntersect可能有用的方法。

于 2009-12-30T22:38:43.247 回答