الشبكة العربية لمطوري الألعاب

خبير مدير همام البهنسي مشاركة 1

أحاول حساب المماس لسطح (Tangent Vector) عند نقطة معينة منه بحيث يكون اتجاهه مطابق لتزايد احداثيات المحلية U للسطح.
 
المعطيات:
- الاحداثيات المحلية للنقطة (UV Coordinates).
- ناظم السطح (Normal Vector) عند هذه النقطة.

المطلوب:
حساب المماس؟

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

ماوجدته حول هذا الموضوع لا يحقق الملاحظات السابقة كما في هذا المقالة:
http://www.terathon.com/code/tangent.html

أي أفكار حول هذا الموضوع؟

محترف مشرف عبد اللطيف حاجي علي مشاركة 2

للتوضيح. ما فهمته منك أن لديك نقطة نقطة في الفراغ (X,Y,Z) و الناظم عند تلك النقطة وإحداثيات النقطة في الإكساء (UV) وتريد المماس لهذه النقطة في إتجاه إزدياد U.

إذا كان الأمر كذلك فمن المعطيات أظن أن كل ما يمكن حسابه هو السطح المماس عند تلك النقطة. إذا أردت متجهاً محدداً من هذا السطح (مطابقاً لتزايد U) فيجب أن يكون لديك معلومات أخرى عن النقاط المجاورة أو عن التابع الذي يحدد قيم U.

عبد اللطيف حاجي علي
مبرمج
In|Framez

موهوب  16mofed84 مشاركة 3

وكانك رأيتني قبل فتره و انا ابحث عن شيء مثيل☺ ..
وجدت هذا الكود و انا استخدمه حاليا ..
لكن لا اعلم في اتجاه U كيف سيكون الامر ..(لان U احداثيات نقطه و ليست اتجاه)

Vector3 c1 = Vector3.Cross(Normal, Vector3.UnitZ);
Vector3 c2 = Vector3.Cross(Normal, Vector3.UnitY);
if (c1.Length() > c2.Length())
{
    Tangent = c1;
}
else
{
    Tangent = c2;
}
//UnitZ = (0,0,1)
//UnitY = (0,1,0)

خبير مدير همام البهنسي مشاركة 4

نعم توضحيك قريب جداً من المسألة ولكن في حالتي قمت باختصار الاحداثيات الفراغية (X,Y,Z) لأنه يمكنني تحديد هذه الإحداثيات من خلال احداثيات الـ UV بالنسبة للسطح.
 
المهم في مثل هذه الحالة، ماهو الحد الأدنى من المعلومات الإضافية المطلوبة لحساب المماس باتجاه تزايد الـ U؟

خبير مدير همام البهنسي مشاركة 5

وفي 18 فبراير 2012 11:19 ص، قال 16mofed84 متحمساً:

وكانك رأيتني قبل فتره و انا ابحث عن شيء مثيل☺ ..
وجدت هذا الكود و انا استخدمه حاليا ..

هذا الكود يعطيك أي مماس للسطح ولكن ليس بالضرورة المماس المتجه مع تزايد الـ U. ما أبحث عنه هو مماس محدد الذي يشير لتزايد الـ U.

موهوب  16mofed84 مشاركة 6

اعتقد ان ما تتكلم عنه غريب بعض الشيء..UV هو احداثيات لTexture  و ليس متجه .. ما تحتاج الي هو اي احداث اخر لUV اخرى ثم تقوم بطرحهم فتحصل على متجه
UV = point
UVx - UV1 = vector

محترف مشرف عبد اللطيف حاجي علي مشاركة 7

أما في 18 شباط 2012 06:32 م، فقد تنهد همام البهنسي بارتياح وهو يرد:

نعم توضحيك قريب جداً من المسألة ولكن في حالتي قمت باختصار الاحداثيات الفراغية (X,Y,Z) لأنه يمكنني تحديد هذه الإحداثيات من خلال احداثيات الـ UV بالنسبة للسطح. المهم في مثل هذه الحالة، ماهو الحد الأدنى من المعلومات الإضافية المطلوبة لحساب المماس باتجاه تزايد الـ U؟
كما قلت تحتاج إلى معلومات عن تغير الـ UV بالنسبة للموقع (X,Y,Z) فإما أن تعطي قيم الـ UV المجاورة للموقع أو أن تستخدم التابع الذي يحول بينU,V و X,Y,Z 
طريقة استخدام هذا التابع تعتمد على مدى تعقيده

عبد اللطيف حاجي علي
مبرمج
In|Framez

مبتدئ  حسام زكريا مشاركة 8

السلام عليكم 
على ما يبدو أنك تستطيع استخلاص الـ (x,y,z) من خلال الـ UV وكأنك تتعامل مع Terrain من خلال خريطة ارتفاعات أو مساحات مائية كبيرة كالبحر أو ما شابه، أظن هنا لديك أحد الخيارين التالين:
1- حفظ خريطة أخرة بحيث تكون مطابقة لخريطة الارتفاعات (أو أية خريطة تقوم بتحصيل إحداثيات الفراغ منها) هذه الخريطة يتم تخزين المعلومة المطلوبة فيها ضمن كل بكسل فيها (مثل خريطة الـ Normals ولكن هنا قم بتخزين الـ Tangent Vector أو الـ binormals) 
2- استخدام خاصية texture fetch من الـ vertex shader (والذي يتطلب دعم خاص من كرت الشاشة) لتقوم بتحصيل احداثيات رؤوس مجاورة للرأس الحالي من خريطة الارتفاعات واستعمال هذه المعلومات في استخلاص المعلومة المطلوبة بطريقة ما

Husam Zakaria
Game Programmer