كيف يمكنني تحويل نقطة تقاطع الطائرة إلى إحداثيات barycentric؟

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

  •  21-09-2019
  •  | 
  •  

سؤال

مشكلتي:

كيف يمكنني أخذ نقطتين ثلاثي الأبعاد وقفلهما على محور واحد؟ على سبيل المثال ، بحيث يكون كل من z-ass هي 0.

ما أحاول القيام به:

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

O + tD

عندما يكون O (Origin) هو موضع الكاميرا ، فإن D هو الاتجاه من المشهد إلى الكاميرا و T هو الوقت الذي يستغرقه الشعاع لتبادل الطائرة من نقطة الكاميرا.

إذا لم يكن ذلك منطقيًا ، فإليك رسم خام:

Crude drawing

لقد بحثت بعيدًا وعريضًا ، وبقدر ما أستطيع أن أقول ، يسمى هذا باستخدام "كاميرا الثقب".

المشكلة ليست دوران الكاميرا الخاص بي ، لقد قضيت ذلك. تكمن المشكلة في ترجمة نقطة التقاطع إلى إحداثيات 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)

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

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