تحديد التقاطع مع frustum في glscene
سؤال
باستخدام Glscene في Delphi ، أحتاج إلى العثور على التقاطع بين كائن (خط أو طائرة كافية) والمساحة المرئية ، لتحديد جزء من هذا الكائن الذي يظهر حاليًا.
حاولت الحصول على عرض الرؤية لكنني لم أتمكن من العثور على كيف. كنت أفكر في استخدام موضع الكاميرا واتجاهها ومجال الرؤية ، لكنني أظن أنه لم يتم تحديثها عند استخدام طرق مثل MoveAroundTarget أو إعداد الكائن الهدف.
شكرًا،
ماركو
المحلول
للحصول على frustum ، يمكنك استخدام مصفوفة ModelViewProjection التي حصلت على مضاعفة ModelViewMatrix و DespsisterMatrix من المخزن المؤقت الحالي لـ Tglscene. للحصول على الطائرات من المصفوفة ، استخدم دالة ExtractFrustumFrommfieLviewProjection. هنا مقتطف رمز:
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;
نصائح أخرى
يمكنك إخراج frustum من كائن الكاميرا (خاصية tglsceneviewer.camera) - الخصائص NearPlane
, DepthOfView
, Position
, Direction
ستكون هناك حاجة ، وكذلك "tglsceneviewer.fieldofview".
لدى tglcamera أيضًا طريقة تسمى RayCastIntersect
قد يكون مفيدًا.