سؤال

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

أريد أن أجعله حتى يبقى حجم هندسة الخط كما هو. حاولت أن أتجول مع الإسقاط الهجائي ولكنني لم أتناول شيئًا. أيه أفكار؟

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

المحلول

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

على الرغم من ذلك ، يمكن أن تكون الأسطوانة بمثابة مبالغ فيها ، حيث يمكنك الحصول على تأثير مماثل من خلال رسم خط بيلابيراب وتطبيق نسيج عليه.

كتبت تظليلًا في DX8 منذ عدة سنوات للقيام بذلك (ضع في اعتبارك أن هذا مع منظور). في الأساس ، حددت بيانات Vertex على النحو التالي:

struct BillboardLineVertex
{
    D3DXVECTOR3  position;
    D3DXVECTOR3  otherPosition;
    DWORD        colour;
    D3DXVECTOR2  UV;
};

على افتراض أن الخط ينتقل من A إلى B ، فإن الموضع هو A والموضع الآخر B للأولى القمة. علاوة على ذلك ، قمت بتشفير في V (أو Y) من UV إما A -1 أو 1. هذا أخبرني ما إذا كنت سأخرج من الخط لأعلى أو لأسفل على الشاشة. أخيرًا ، كان الإحداثي الثالث للمثلث لديه A&B في موضعه والموضوع الآخر في الاتجاه الآخر (سأتركك لمعرفة كيفية بناء المثلث الآخر. لتكرار الملمس على طول الخط.

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

asm
{
    vs.1.1

// Create line vector.
    mov r1, v0
    sub r3, r1, v4

// Get eye to line vector
    sub r6, v0, c20

// Get Tangent to line vector lieing on screen plane.
    mul r5, r6.yzxw, r3.zxyw
    mad r5, -r3.yzxw, r6.zxyw, r5

// Normalise tangent
    dp3 r4.w, r5.xyz, r5.xyz
    rsq r4.w, r4.w
    mul r5.xyz, r5.xyz, r4.w

// Multiply by 1 or -1 (y part of UV)
    mul r5.xyz, r5.xyz, -v9.y

// Push tangent out by "thickness"
    mul r5.xyz, r5.xyz, c16.x
    add r1.xyz, r1.xyz, r5.xyz

// Transform position
    m4x4 oPos, r1, c0

// Work out UV (c16.y is assumed to contain 0.5, c16.z is assumed to contain 1)
    mov r2.xy, v9.xy
    mul r2.y, v9.y, v9.x
    add r2.xy, r2.xy, c16.z
    mul oT0.xy, r2.xy, c16.y

// Move colour into diffuse output channel.
    mov oD0, v3
};

سيكون من السهل تعديل هذا الإعداد ليمنحك نفس الحجم بغض النظر عن المسافة من الكاميرا.

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