سؤال

باستخدام 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 قد يكون مفيدًا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top