Howto Process A Planar Polygon على متن طائرة في مساحة ثلاثية الأبعاد
-
21-09-2019 - |
سؤال
أريد أن أعرض مضلعتي على طول متجه إلى طائرة في مساحة ثلاثية الأبعاد. يفضل أن أستخدم مصفوفة تحويل واحدة للقيام بذلك ، لكنني لا أعرف كيفية بناء مصفوفة من هذا النوع.
منح
- معلمات الطائرة (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 يجب نقل هذه المصفوفة ، لأنها تستخدم متجهات الصف بدلاً من متجهات العمود).