كيف يمكنني تحويل نقطة تقاطع الطائرة إلى إحداثيات barycentric؟
-
21-09-2019 - |
سؤال
مشكلتي:
كيف يمكنني أخذ نقطتين ثلاثي الأبعاد وقفلهما على محور واحد؟ على سبيل المثال ، بحيث يكون كل من z-ass هي 0.
ما أحاول القيام به:
لدي مجموعة من الإحداثيات ثلاثية الأبعاد في مشهد ، تمثل مربع AA مع هرم عليه. لدي أيضًا كاميرا ، ممثلة بإحداثيات ثلاثية الأبعاد أخرى. أقوم بطرح إحداثيات الكاميرا من المشهد تنسيقها وتطبيعها ، وإعادة متجه يشير إلى الكاميرا. ثم أقوم بتقاطع طائرة شعاع مع طائرة تقع خلف نقطة الكاميرا.
O + tD
عندما يكون O (Origin) هو موضع الكاميرا ، فإن D هو الاتجاه من المشهد إلى الكاميرا و T هو الوقت الذي يستغرقه الشعاع لتبادل الطائرة من نقطة الكاميرا.
إذا لم يكن ذلك منطقيًا ، فإليك رسم خام:
لقد بحثت بعيدًا وعريضًا ، وبقدر ما أستطيع أن أقول ، يسمى هذا باستخدام "كاميرا الثقب".
المشكلة ليست دوران الكاميرا الخاص بي ، لقد قضيت ذلك. تكمن المشكلة في ترجمة نقطة التقاطع إلى إحداثيات Barycentric (UV).
يبدو أن الترجمة على المحور السيني:
uaxis.x = -a_PlaneNormal.y;
uaxis.y = a_PlaneNormal.x;
uaxis.z = a_PlaneNormal.z;
point vaxis = uaxis.CopyCrossProduct(a_PlaneNormal);
point2d.x = intersection.DotProduct(uaxis);
point2d.y = intersection.DotProduct(vaxis);
return point2d;
في حين أن الترجمة على المحور z تبدو هكذا:
uaxis.x = -a_PlaneNormal.z;
uaxis.y = a_PlaneNormal.y;
uaxis.z = a_PlaneNormal.x;
point vaxis = uaxis.CopyCrossProduct(a_PlaneNormal);
point2d.x = intersection.DotProduct(uaxis);
point2d.y = intersection.DotProduct(vaxis);
return point2d;
سؤالي هو: كيف يمكنني تحويل نقطة تقاطع طائرة شعاع إلى إحداثيات Barycentric على كل من المحور X ومحور Z؟
المحلول
الصيغة المعتادة للنقاط (P) على خط ، بدءًا من (P0) مع اتجاه المتجه (V) هي:
p = p0 + t*v
معيار النقطة (P) على متن طائرة تحتوي على (P1) ومع العادي (N) هو:
(p - p1).n = 0
لذلك ، المكونات و chug:
(p0 + t*v - p1).n = (p0-p1).n + t*(v.n) = 0
-> t = (p1-p0).n / v.n
-> p = p0 + ((p1-p0).n / v.n)*v
للتأكد:
(p - p1).n = (p0-p1).n + ((p1-p0).n / v.n)*(v.n)
= (p0-p1).n + (p1-p0).n
= 0
إذا كنت ترغب في إصلاح إحداثيات Z بقيمة معينة ، فأنت بحاجة إلى اختيار عادي على طول محور Z (والذي سيحدد مستوى موازية لطائرة XY).
ثم لديك:
n = (0,0,1)
-> p = p0 + ((p1.z-p0.z)/v.z) * v
-> x and y offsets from p0 = ((p1.z-p0.z)/v.z) * (v.x,v.y)
أخيرًا ، إذا كنت تحاول إنشاء "كاميرا" افتراضية لرسومات الكمبيوتر ثلاثية الأبعاد ، فإن الطريقة القياسية للقيام بهذا النوع من الأشياء إحداثيات متجانسة. في النهاية ، يكون العمل مع الإحداثيات المتجانسة أبسط (وعادة ما يكون أسرع) من نوع الجبر المخصص ثلاثي الأبعاد المخصص الذي كتبته أعلاه.