إحداثيات ثلاثية الأبعاد من نقطة ثنائية الأبعاد معطى الكاميرا وعرض الطائرة

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

سؤال

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

ray = camera_eye + t*(P-camera_eye);

حيث t هي المسافة على طول الشعاع (افترض t = 1 في الوقت الحالي).

سؤالي هو ، كيف يمكنني الحصول على الإحداثيات ثلاثية الأبعاد للنقطة P نظرًا لأنه يقع في الموضع (I ، J) على طائرة المشاهدة؟ افترض أنه يتم إعطاء الزوايا اليمنى العلوية اليمنى والسفلية لطائرة المشاهدة.

ملاحظة: إن طائرة المشاهدة ليست في الواقع طائرة بمعنى أنها لا تمتد إلى حد ما في جميع الاتجاهات. بدلا من ذلك ، قد يفكر المرء في هذه الطائرة كصورة widthxheight. في الاتجاه x ، يكون النطاق 0-> العرض وفي الاتجاه y ، يكون النطاق 0-> الارتفاع. أرغب في العثور على الإحداثيات ثلاثية الأبعاد للعنصر (i ، j) th ، 0

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

المحلول 3

عندما قمت بتوصيل الصيغ المقترحة مباشرة في برنامجي ، لم أحصل على نتائج صحيحة (ربما يجب القيام ببعض التصحيح). يبدو أن مشكلتي الأولية في سوء فهم الإحداثيات (X ، Y ، Z) لنقاط الزاوية المتداخلة. كنت أتعامل مع X و y و z-coordinates بشكل منفصل ، حيث لا ينبغي أن يكون (وقد يكون هذا خاصًا بالتطبيق ، حيث يمكن توجيه الكاميرا في أي اتجاه). بدلاً من ذلك ، اتضح أن الحل يكون بمثابة استيفاء بسيط لنقاط زاوية طائرة المشاهدة:

  • يدور حول نقاط الزاوية السفلية في اتجاه i للحصول على p1
  • يدور حول نقاط الزاوية العلوية في اتجاه i للحصول على p2
  • interpulate p1 و p2 في اتجاه J للحصول على إحداثيات العالم للنقطة النهائية

نصائح أخرى

الحل العام للترايدة لخط وطائرة انظر http://local.wasp.uwa.edu.au/~pbourke/geometry/planeline/

قد يكون ليب الرسومات الخاصة بك (OpenGL/DirectCX وما إلى ذلك) طريقة قياسية للقيام بذلك

تحرير: أنت تحاول العثور على التقاطع ثلاثي الأبعاد لنقطة الشاشة (مثل مؤشر الماوس) مع كائن ثلاثي الأبعاد في مشهدك؟

للعمل في P ، تحتاج إلى المسافة من الكاميرا إلى مستوى القطع القريب (الشاشة) ، وحجم النافذة على مستوى القطع القريب (أو زاوية العرض ، يمكنك حل حجم النافذة من زاوية العرض) وحجم النافذة المقدمة.

  1. قم بتوسيع نطاق موضع الشاشة إلى النطاق -1 <x <+1 و -1 <y <+1 حيث يكون +1 هو العلوي/اليمين و -1 هو القاع/اليسار
  2. مقياس التطبيع x ، y بواسطة حجم نافذة العرض
  3. التوسيع نطاقًا من ناقلات الكاميرا اليمنى والأعلى وتلخيص النتائج
  4. أضف نظرة على المتجه المقوس بمسافة مستوى القطع

في الواقع ، تحصل على:

p = at * near_clip_dist + x * right + y * up

أين x و y:

x = (screen_x - screen_centre_x) / (width / 2) * view_width
y = (screen_y - screen_centre_y) / (height / 2) * view_height
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top