هل هناك فعال\طريقة سهلة لرسم المضلع المقعر في Direct3d

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

  •  01-07-2019
  •  | 
  •  

سؤال

أحاول رسم المضلع باستخدام c# و directx

كل ما أحصل عليه هو قائمة مرتبة من النقاط من ملف و أريد أن ألفت شقة المضلع في عالم 3d.

أنا يمكن تحميل النقاط ورسم شكل محدب باستخدام trianglefan و drawuserprimitives.

ومن الواضح أن هذا يؤدي إلى نتائج غير صحيحة عند المضلع جدا مقعر (قد يكون).

لا أستطيع أن أتخيل أنا الشخص الوحيد للتعامل مع هذه المشكلة (tho أنا gfx/directx المبتدىء - خلفيتي في واجهة المستخدم الرسومية\windows تطوير التطبيقات).

يمكن لأي شخص أن لي نقطة نحو بسيطة لمتابعة الموارد\دروس\الخوارزمية التي قد تساعد علي ؟

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

المحلول

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

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

بعض الخوارزميات تثليث بسيطة (محدبة أو مقعرة ، ولكن دون النفس التقاطعات أو ثقوب) المضلعات في VTerrain الموقع.

لقد استخدمت راتكليف مدونة في الماضي ؛ بسيطة جدا و يعمل بشكل جيد.VTerrain لديه الميت الارتباط به ، رمز يمكن العثور عليها هنا.إنها C++, ولكن ترقية إلى C# يجب أن تكون واضحة.

لا استخدام المثلث المشجعين.هم من استخدام محدود للغاية وغير فعالة و هي الذهاب بعيدا في وقت قريب (مثلا ، Direct3D 10 لا دعم لهم بعد الآن).مجرد استخدام المثلث القوائم.

نصائح أخرى

التثليث هو الجواب واضح, ولكن من الصعب أن تكتب الصلبة triangulator.إلا إذا كان لديك اثنين من الشهر لتضييع الوقت لا تحاول حتى.

وهناك زوجين من الرموز التي قد تساعدك:

المؤتمر الشعبي العام المكتبة.من السهل جدا للاستخدام, ولكن قد لا ترغب في ذلك رخصة:

http://www.cs.man.ac.uk/~toby/alan/software/gpc.html

هناك أيضا المثلث:

http://www.cs.cmu.edu/~quake/triangle.html

والقبضة:

http://www.cosy.sbg.ac.at/~held/projects/triang/triang.html

آخر (و يفضل) خيار استخدام غلو tesselator.يمكنك تحميل واستخدام غلو من مكتبة DirectX البرامج على ما يرام.أنها لا تحتاج إلى برنامج OpenGL السياق إلى استخدام وانها مثبتة مسبقا على أجهزة ويندوز.إذا كنت تريد المصدر يمكنك رفع التثليث رمز من SGI إشارة التنفيذ.لقد فعلت ذلك مرة استغرقت بضع ساعات.

حتى الآن على التثليث.هناك طريقة مختلفة وكذلك:يمكنك استخدام الاستنسل الحيل.

الخوارزمية العامة وغني عن مثل هذا:

  1. تعطيل اللون والعمق يكتب.تمكين الاستنسل يكتب الإعداد الخاص بك الاستنسل العازلة أنه سيتم عكس التيار الاستنسل القيمة.بت واحد من الاستنسل غير كافية.يا الاستنسل الخاص بك العازلة يجب أن يتم مسح كذلك.

  2. اختيار نقطة عشوائية على الشاشة.أي سوف تفعل.نسمي هذه النقطة الربط الخاص بك.

  3. لكل حافة المضلع بناء مثلث من اثنين من القمم التي تبنى على حافة الربط الخاص بك.رسم هذا المثلث.

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

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

راجع للشغل - الاستنسل التقنية تعمل الذاتي المتقاطعة المضلعات كذلك.

نأمل أن يساعد ، نيلز

إذا كنت قادرا على استخدام الاستنسل العازلة ، فإنه لا ينبغي أن يكون من الصعب القيام به.وهنا العامة الخوارزمية:

Clear the stencil buffer to 1.
Pick an arbitrary vertex v0, probably somewhere near the polygon to reduce floating-point errors.
For each vertex v[i] of the polygon in clockwise order:
    let s be the segment v[i]->v[i+1] (where i+1 will wrap to 0 when the last vertex is reached)
    if v0 is to the "right" of s:
        draw a triangle defined by s, v[i], v[i+1] that adds 1 to the stencil buffer
    else
        draw a triangle defined by s, v[i], v[i+1] that subtracts 1 from the stencil buffer
end for
fill the screen with the desired color/texture, testing for stencil buffer values >= 2.

من خلال "حق s" يعني من وجهة نظر شخص يقف على v[أنا] و تواجه v[i+1].هذا يمكن اختبارها باستخدام المنتج عبر:

عبر(v0 - v[أنا], v[i+1] - v[i]) > 0

أود فقط أن تفعل هذا المشروع.أبسط خوارزمية وجدت يسمى "الأذن لقطة".ورقة رائعة على ذلك هنا: TriangulationByEarClipping.pdf

أخذت مني حوالي 250 خطوط من رمز c++ و 4 ساعات لتنفيذ القوة الغاشمة نسخة منه.خوارزميات أخرى يكون الأداء أفضل ، لكن هذه كانت بسيطة لتنفيذ وفهم.

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