حساب مدى رؤية الكائن في مشهد ثلاثي الأبعاد لاستخدامه في منطق اللعبة/الذكاء الاصطناعي

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

سؤال

لقد بدأت مشروع لعبة سيسمح للشخصيات بالاختباء في المناطق المظلمة.الاختباء في زاوية مظلمة من شأنه أن يجعل من الصعب على الشخصيات الأخرى رؤيتك.

ما أحتاجه هو طريقة لحساب كيفية ظروف الإضاءة في المكان الذي توجد فيه الشخصية.

المثالي هو أن يكون لديك

double getLightFactor(GameCharacter observer, GameCharacter target)

لأنني أفترض أنه قد تكون هناك ظروف إضاءة حيث يسقط الضوء بحيث تتعرض جوانب مختلفة من الهدف لكميات مختلفة من الأضواء.لكنني سأقبل بكل سرور

double getLightFactor(GameCharacter target)

للحصول على الضوء لشخصية معينة بغض النظر عن المكان الذي تشاهد منه أو حتى

double getLightFactor(int x, int z)

للحصول على الضوء عند نقطة محددة على الخريطة في التضاريس.

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

سأستخدم Ogre3d للتعامل مع المشهد الخاص بي، ولكنني سأقبل بكل سرور الحلول العامة أو حتى الحلول للمحركات الأخرى (اختياري للمحرك ليس منحوتًا على الحجر).

الأفكار والأوراق أو أي شيء ذي صلة هو موضع ترحيب كبير!

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

المحلول

يمكنك فقط عرض المشهد من وجهة نظر المراقب إلى مخزن مؤقت خارج الشاشة (حتى بدقة منخفضة إلى حد ما) مع مراعاة إعدادات الإضاءة الحالية.ثم يمكنك حساب متوسط ​​قيمة اللمعان حول منتصف الحرف المستهدف.

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

نصائح أخرى

يا ولد.هذا يعتمد كثيرا على المحرك.أستطيع أن أخبرك الآن أنك تريد الخيار الثاني.

كيف تعمل الإضاءة؟هل هي ديناميكية أم ثابتة؟لنفترض أنه مزيج من الاثنين معا.

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

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

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

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

قد تضطر إلى "ختم" الأشكال عليها باستخدام خوارزميات مربعة أو دائرية بسيطة اعتمادًا على نوع الأضواء لديك.

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