在delphi中使用GLScene,我需要找到一个对象(一条线或一个平面就足够)和可见空间之间的交点,以确定该对象当前正在显示的部分。
我试图使视锥化,但我找不到方法。我当时在考虑使用相机的位置,方向和视野,但是我怀疑当使用MoveAroundTarget之类的方法或设置目标对象时,它们不会更新。
谢谢,
马可
最佳答案
要获得平截头体,可以使用从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;