Unity3D: كيف تعرف درجة إضاءة نقطة في مشهد؟

تحياتي!

أعرف ، وفي صميم الأمر ، تعرف ما هي ألعاب بطاقتك أو ألعاب ثلاثة في واحد مفقودة. أنظمة التخفي!

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

اليوم لن نقوم بتطوير نظام شبح متكامل للاعب ، سننظر في التفاعلات البحتة مع الإضاءة.

الطريقة الأولى: المصادمات


طريقة بسيطة وغير كثيفة الاستخدام للموارد.

نضيف مصادم كروي لكل مصدر للضوء. نجعلها زناد. نضع أبعادًا تساوي تقريبًا نصف قطر الضوء.

والباقي واضح مثل الظل. نكتب نصًا بسيطًا ، حيث في OnTriggerEnter () نضع تنشيط حساب الضوء (بحيث لا تعمل مصادر الضوء "خاملة" عندما لا يكون المشغل قريبًا).

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

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

مثال

عند النقطة 1 ، تكون الإضاءة قريبة من الحد الأقصى. عند النقطة 2 ، تكون الإضاءة ضئيلة - هناك عقبة بين الضوء والنقطة. عند النقطة 3 ، تكون الإضاءة متوسطة.

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

المزايا:


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

العيوب:


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

الطريقة 2: RenderTexture


ماذا نفعل هنا؟ في الواقع ، نحصل على "لقطة شاشة" من الكاميرا ، وليس بالضرورة من الكاميرا الرئيسية. ثم نقوم بتحليل لون لقطة الشاشة لمعرفة كيف يسقط الضوء الساطع على الموضوع.

بادئ ذي بدء ، نحتاج إلى كائن "سنقرأ" الضوء منه. اصنع كرة أو كرة عادية ، اجعلها صغيرة (مقياس 0.1) ، ضعها بالقرب من الأرض ، اجعلها بيضاء ، قم بإزالة المصادم:

نص مخفي


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

في النهاية ، نضعه بحيث ينظر إلى هدفنا وفقط عليه.

نص مخفي


في النهاية ، قم بتكوين قناع Culling للكاميرات الأساسية والثانوية بحيث لا تعرض الكاميرا الأولية الأشياء "الخفيفة" الخاصة بنا ، بينما ترى الكاميرات الثانوية فقط ، دون أن تشوش أي شيء آخر.

وهنا يبدأ المرح. نرفق النص بالكاميرا:

public Camera cam; //   RenderTexture tex; Texture2D _tex; void Start () { //    "". // ,       -   . // Depth   0   -   . tex = new RenderTexture (1, 1, 8); // RenderTexture "" , //   ,    . _tex = new Texture2D (1, 1, TextureFormat.RGB24, false); } void Update () { //   ""  cam.targetTexture = tex; cam.Render (); //     RenderTexture.active = tex; //   Texture2D _tex.ReadPixels (new Rect (0, 0, 1, 1), 0, 0); _tex.Apply (); Color col = _tex.GetPixel (0, 0); float vis = (col.r + col.g + col.b) / 3; } 

عند الإخراج ، نحصل على تعويم ، وهو ، في جوهره ، تمثيل رقمي لمستوى حادث الإضاءة على جسمنا. إذا كان المصدر قريبًا - الكائن أبيض - فيس هو 1. إذا كان مظلمًا - الكائن أسود - فيس ~ 0.

لا نحتاج إلى القيام بالعملية المذكورة أعلاه في كل إطار ، لذلك نقوم بتضمين مؤقت ثاني صغير:

 float interval = 0; void Update () { interval += Time.deltaTime; if (interval < 1) return; interval = 0; //   } 

بعد ذلك ، نربط نظامنا بالكامل باللاعب بحيث يتحرك معه. ومتغير فيس يعيد الضوء تلقائيًا حول اللاعب!

يمكن استخدام هذا النظام ليس فقط بالاشتراك مع اللاعب. يمكنك وضعها في أي مكان وكما تريد ، وإنشاء نوع من أجهزة استشعار الضوء. كقاعدة عامة ، هناك طرق أكثر فعالية لتطبيقها ، ولكن هل من الجميل دائمًا أن يكون لديك بدائل؟

المزايا واضحة ، فلنتحدث عن العيوب.

المساوئ


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

Source: https://habr.com/ru/post/ar417135/


All Articles