Howto Process A Planar Polygon على متن طائرة في مساحة ثلاثية الأبعاد

StackOverflow https://stackoverflow.com/questions/2500499

سؤال

أريد أن أعرض مضلعتي على طول متجه إلى طائرة في مساحة ثلاثية الأبعاد. يفضل أن أستخدم مصفوفة تحويل واحدة للقيام بذلك ، لكنني لا أعرف كيفية بناء مصفوفة من هذا النوع.

منح

  • معلمات الطائرة (AX+بواسطة+CZ+D) ،
  • إحداثيات العالم من المضلع الخاص بي. كما هو مذكور في العنوان ، تكمن جميع رؤوس مضلع بلدي في طائرة أخرى.
  • متجه الاتجاه الذي يتقدم به من مضلع بلدي (حاليًا المتجه الطبيعي لطائرة المضلع)

هدف-مصفوفة تحويل 4x4 التي تؤدي الإسقاط المطلوب ،

أو

  • بعض البصيرة حول كيفية بناء واحدة بنفسي

تحديث

شكرا لك على الإجابة ، فهو يعمل على النحو المقصود.

كلمة تحذير للأشخاص الذين وجدوا هذا: إذا كانت طائرة الإسقاط العادية موازية لمتجه الإسقاط ، فسيصبح المقام D (تقريبًا) 0 ، وذلك لتجنب حدوث أشياء غريبة ، نوعًا من التعامل مع هذه الحالة الخاصة وهناك حاجة. لقد قمت بحلها عن طريق التحقق مما إذا كان D <1e-5 ، وإذا كان الأمر كذلك ، فما عليك سوى ترجمة المضلع الخاص بي على طول متجه بثق HTE.

هل كانت مفيدة؟

المحلول

لنفترض أن واحدة من رؤوس المضلع (x0, y0, z0), ، وناقل الاتجاه هو (dx,dy,dz).

نقطة على خط الإسقاط هي: (x,y,z) = (x0 + t*dx, y0 + t*dy, z0 + t*dz).

تريد أن تجد تقاطع هذا الخط مع الطائرة ، لذا قم بتوصيله بمعادلة الطائرة ax+by+cz+d = 0 وحل T:

t = (-a*x0 - b*y0 - c*z0 - d) / (a*dx + b*dy + c*dz)

ثم لديك قمة الرأس المستهدفة: x = x0+dx*t, ، إلخ.

نظرًا لأن هذا تحول أفيني ، يمكن تنفيذه بواسطة مصفوفة 4x4. يجب أن تكون قادرًا على تحديد عناصر المصفوفة من خلال كتابة المعادلات الثلاثة لـ X و Y و Z كدالة لـ X0 و Y0 و Z0 وأخذ المعاملات.

على سبيل المثال ، لـ X:

x = x0 - (a*dx*x0 + b*dx*y0 + c*dx*z0 + d*dx) / D
x = (1 - a*dx/D)*x0 - (b*dx/D)*y0 - (c*dx/D)*z0 - d*dx/D

أين D = a*dx + b*dy + c*dz هو المقام من الأعلى. Y و Z يعملون بالمثل.

مصفوفة النتيجة:

1-a*dx/D    -b*dx/D    -c*dx/D   -d*dx/D
 -a*dy/D   1-b*dy/D    -c*dy/D   -d*dy/D
 -a*dz/D    -b*dz/D   1-c*dz/D   -d*dz/D
    0          0          0         1

(ملاحظة: على Direct3D يجب نقل هذه المصفوفة ، لأنها تستخدم متجهات الصف بدلاً من متجهات العمود).

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