إحداثيات ثلاثية الأبعاد من نقطة ثنائية الأبعاد معطى الكاميرا وعرض الطائرة
-
23-09-2019 - |
سؤال
أرغب في توليد أشعة من الكاميرا عبر مستوى المشاهدة. من أجل القيام بذلك ، أحتاج إلى موضع الكاميرا الخاص بي ("العين") ، والأعلى ، واليمين ، ونحو المتجهات (حيث يكون متجهًا من الكاميرا في اتجاه الكائن الذي تبحث عنه الكاميرا) و 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 <x <+1 و -1 <y <+1 حيث يكون +1 هو العلوي/اليمين و -1 هو القاع/اليسار
- مقياس التطبيع x ، y بواسطة حجم نافذة العرض
- التوسيع نطاقًا من ناقلات الكاميرا اليمنى والأعلى وتلخيص النتائج
- أضف نظرة على المتجه المقوس بمسافة مستوى القطع
في الواقع ، تحصل على:
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