كيف يمكنني معرفة ما إذا كان أحد وجوه اللعبة يمكن أن يرى آخر؟

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

سؤال

ولدي كائن، التي تواجه اتجاه معين مع (على سبيل المثال) حقل 45 درجة للعرض، وعرض مجموعة الحد. لقد فعلت كل الفحوص الأولية (Quadtree عقدة، والمسافة)، ولكن الان انا بحاجة لمعرفة ما اذا كان كائن معين ضمن هذا الرأي مخروط، (في هذه الحالة أن تقرر فقط لمتابعة هذا الكائن ما اذا كنا نستطيع رؤيته).

وبصرف النظر عن الصب شعاع لكل درجة من Direction - (FieldOfView / 2) إلى Direction + (FieldOfView / 2) (أنا أفعل ذلك في الوقت الحالي وإنه لأمر فظيع)، ما هي أفضل طريقة للقيام بذلك خيار الرؤية؟

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

المحلول

واحسب الزاوية بين اتجاهك عرض (يفهم على أنه ناقلات) وناقلات الذي يبدأ في لكم وينتهي عند الكائن. اذا ما وقعت تحت FieldOfView / 2، يمكنك عرض الكائن.

وهذا هو زاوية:

arccos(scalarProduct(viewDirection, (object - you)) / (norm(viewDirection)*norm(object - you))).

نصائح أخرى

ولقد عملت في صناعة ألعاب الفيديو، وأستطيع أن أقول أن تفعل وظائف علم حساب المثلثات مثل قوس جيب تمام الزاوية كل الإطار هو أقل من مثالية. بدلا من ذلك، precompute جيب تمام الزاوية للمخروط:

float cos_angle = cos(PI/4); // 45 degrees, for example

وبعد ذلك، كل إطار يمكنك التحقق بسرعة إذا نقطة تقع داخل هذا مخروط بمقارنة ذلك مع المنتج نقطة من المخروط و.

vector test_point_vector = normalize(test_point_loc - cone_origin);
float dot_product = dot(normalized_cone_vector, text_point_vector);
bool inside_code = dot_product > cos_angle;

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

وهذا يعمل بسبب هذه المعادلة:

A · B = |A| * |B| * cos(Θ)

إذا تطبيع ناقلات (A -> هناك)، يتم تبسيط المعادلة:

An · Bn = cos(Θ)

والحصول على الزاوية بين متجه عنوان المشاهد ومتجه من المشاهد لاستهداف. إذا هذه الزاوية أقل من (FieldOfView / 2)، ثم الهدف في الحقل المشاهد وجهة نظر.

إذا ناقلات الخاصة بك 2D أو 3D هذا العمل بنفس الطريقة. (في 3D، وإذا كان لديك المخروط الناقص عرض بدلا من مخروط، فإنك سوف تحتاج لفصل الزوايا إلى مكونين.) تحتاج فقط للعثور على الزاوية بين ناقلات البلدين.

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

إذا كنت تفعل 3D ويمكن تحديد نطاق عرض باعتبارها frustrum، ثم يمكنك استخدام شيء مشابه لهذا <وأ href = "http://www.flipcode.com/archives/Frustum_Culling.shtml" يختلط = "نوفولو noreferrer"> Frustrum الذبح التقنية.

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

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