الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

تعال نبدأ مع Irrlicht على Net

رائج
بدأه DreamNet في 23 أغسطس 2007 · 109 رد · 19,552 مشاهدة · في قسم برمجة الألعاب و الرسوميات العام
مشاركة: واتساب X فيسبوك تيليجرام
#26

السلام عليكم ورحمة الله وبركاته

crazy Programm2007er هل أنت مستعجل :lol:

في البدأ كما وعدتكم المرة السابقة اليوم سنتحدث عن الأحداث وحتى لا يعاتبني أحد الأكواد بالفيبي والسي شارب معا :rolleyes:

وقبل أم أبدأ كنت قد تكلمت عن كيفية إنشاء قالب لمشاريعنا وأردت إضافة القالب هنا الملف المرفق هنا يتم وضعه مباشرة كماهو في مجلد templates تحت projectitem

AT2000_T.zip

بالنسبة لتطبيق اليوم نبدأ على بركة الله

لو فتحنا على المرجع Irrlicht.NET لاستعراض الفئات التي يحويها سنجد أنه يوفر لنا interface إسمه IeventReceiver يحوي على الحدث OnEvent لإدارة كافة الأحداث من داخل المحرك

post-23361-1188570181_thumb.jpg

لادراج هذا الحدث علينا عمل إشتقاق للكائن IeventReceiver المذكور فقط ويجب المحافظة على كتابة الحدث داخل الكلاس الذي سننشئ بنفس الطريقة التي عرف بها في المحرك

كما هو مبين في الصورة فالحدث من النوع boolean واسمه onevent

أول خطوة نضيف كلاس ولنسميها MyEventReceiver مثلا

Public Class MyEventReceiver
	Implements IEventReceiver

 Function OnEvent(ByVal e As [Event]) As Boolean Implements  IEventReceiver.OnEvent


 End Function
End Class

e يعبر عن الحدث الذي سنقوم بمراقبته ويمكننا التفريق بين الأحداث عن طريق نوع الحدث e.Type وهو يتضمن أربعة أنواع منها النوع الذي يهمنا الآن وهو EventType.KeyInput الذي يمثل حدث الضغط على لوحة المفاتيح

كما أن المحرك يسهل لنا الوصول مباشرة إلى إسم المفتاح المضغوط عن طريق قراءة القيمة e.Key

الآن بعدما رأينا تقريبا كيفية الوصول إلى الأحداث نحاول الاستفادة منها لتحريك عنصر داخل المشهد

نرجع إلى المثال السابق ونحاول تحريك المكعب

طبعا لكل scenenode خاصية إسمها position نحدد فيها موقع الnode على المحاور الثلاثة وإذا أردنا تحريكه يجب تغيير موقعه طبعا لذلك نحاول تغيير هذه الخاصية عند الضغط على الأسهم طبعا نغير فقط الاحداثيات x و z فقط

لذلك نضيف الكود التالي إلى الحدث

'vb code
Public Class MyEventReceiver
	Implements IEventReceiver

 Function OnEvent(ByVal e As [Event]) As Boolean Implements IEventReceiver.OnEvent

		If e.Type = EventType.KeyInput Then
			'قراءة الموقع الحالي للمكعب
			Dim v As Vector3D = Module1.box.Position

			Select Case e.Key
				Case KeyCode.KEY_LEFT  'مفتاح السهم لليسار
					v.X -= 2
				Case KeyCode.KEY_RIGHT 'مفتاح السهم لليمين
					v.X += 2
				Case KeyCode.KEY_UP	'مفتاح سهم للأسفل
					v.Z += 2
				Case KeyCode.KEY_DOWN  'مفتاح سهم للأعلى 
					v.Z -= 2
			End Select
			'تحديث موقع المكعب
			Module1.box.Position = v
			Return True
		End If
		Return False
	End Function
End Class

//C# code

class myEventReveiver:IEventReceiver  
	{
		public bool OnEvent(Event p_e)
		{
			if (p_e.Type == EventType.KeyInput) 
			{
				Vector3D v =Program.box.Position;
				switch (p_e.Key) 
				{
					case KeyCode.KEY_LEFT:
						v.X -= 2;
						break; 
					case KeyCode.KEY_RIGHT :
						v.X += 2;
						break; 
					case KeyCode.KEY_UP:
						v.Z += 2;
						break; 
					case KeyCode.KEY_DOWN:
						v.Z -= 2;
						break; 
			  case KeyCode.KEY_ESCAPE:
				Program.device.CloseDevice();
				break;
				}
				  Program.box.Position = v;
				  return true;
				}
				return false;
		}

	}

الآن نقوم بربط أحداث المحرك بالكلاس المنشئة

'vb code
Dim receiver As New MyEventReceiver
device.EventReceiver = receiver

//C# code
IEventReceiver receiver= new myEventReveiver();
device.EventReceiver = receiver;

إضافة :

بماأننا نتكلم على الأحداث نضيف حدث لإغلاق التطبيق عند الضغط على المفتاح escape (KeyCode.KEY_ESCAPE) لذلك نضيف السطر

device.CloseDevice()

مرفق الكود للتطبيق بالvb و C#

code.zip

بالتوفيق للجميع

المرة القادمة إن شاء الله سنتحدث عن التصادم لكن ليس بالشكل الفيزيائي

تم تعديل هذه المشاركة بواسطة DreamNet في 31 أغسطس 2007 في 17:32

#28

السلام عليكم ورحمة الله وبركاته

اليوم سنرى إن شاء الله كيف نكتشف التماس أو التصادم بين عنصريين لكن ليس التصادم الفيزيائي الذي يمثل الفعل ورد الفعل الحقيقي فهناك مكتبة خاصة لذلك تسمى Newton وكذلك ODE مانراه هو بسيط جدا

لكي نستطيع الكشف عن التصادم داخل المشهد علينا أن ننشئ كائن يتحسس هذا التصادم بإستعمال CreateCollisionResponseAnimator لذلك يجب تحديد :

- كائن يقوم بتحديد العنصر الذي يتم معه التصادم من النوع ITriangleSelector محدد داخل المشهد وهناك عدة أنواع للتحديد حسب نوع المشهد

- العنصر الذي يتم التصادم معه في أغلب الأحيان تكون هي الكاميرا (ليس دائما)

- البرامتر الثالث يحدد كيف هو الشكل أي حدوده تقريبا وكلما كان أصغر أصبح بمقدورنا الإقتراب أكثر من الشكل الذي يتم التصادم معه

- الجاذبية على المحاور الثلاثة وعادة ما نحدد قيمتها على المحور Y و بالسالب طبعا لتكون واقعية

- موقع الجسم المتصادم داخل شكل إهليجي تقريبا وفي غالب الأحيان لو كان الجسم المتصادم هو الكاميرا فمن الأحسن عدم وضعه في المنتصف لأن أعيننا لا تكون في منتصف الجسم البشري لذلك نحاول رفعها على محور Y دائما لتكون واقعية أكثر

الآن نمر للتطبيق الذي أنشأنه سابقا ونحاول ربط الكاميرا بالأرضية المنشئة

أولا ننشئ كائن للتحديد

Dim planeSelector As ITriangleSelector = smgr.CreateTriangleSelectorFromBoundingBox(floor)

ثم نعمل حركة لتحسس التصادم مربوطة بكائن التحديد الذي حدد لنا الأرضية floor باستعمال CreateTriangleSelectorFromBoundingBox

Dim anim1 As ISceneNodeAnimator = smgr.CreateCollisionResponseAnimator(planeSelector, cam, _
			 New Vector3D(5, 5, 5), New Vector3D(0, 0, 0), New Vector3D(0, 20, 0), 0)

طبعا يجب أن نكون قد أنشأنا كاميرا قبل

هنا لم نحدد الجاذبية لذلك ستكون قادرا على الطيران :lol:

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

cam.AddAnimator(anim1)

ملاحظة : يمكن تحديد جسم آخر يتم التصادم معه والأرضية

هذا كل شئ اليوم

تطبيق الدرس مرفق هنا

Module1.zip

ولفهم التطبيق أكثر إليكم هذا الواجب :rolleyes:

المطلوب تحديد التصادم بين المكعب والأرضية مع تحديد الجاذبية يعني نريد مشهد سقوط المكعب على الأرضية طبعا يجب رفع المكعب عن المحور Y لكي يسقط

بالتوفيق للجميع

تم تعديل هذه المشاركة بواسطة DreamNet في 1 سبتمبر 2007 في 13:04

#29

شكرا جزيلا أخي :lol:

ولكن لدي ملاحظة بسيطة وهي أن دالة التصادم تعمل في كل إتجاهات :blink: الشكل إلا أن الناحية السفلى من الشكل لا يطبق عليها التصادم

أرجو أن لا أكون قد أزعجتك

#30

إذا كنت تتكلم على الأرضية فلا يوجد شكل في الأسفل :rolleyes:

هناك عدة طرق لتحديد المشهد الهدف لمراقبة التصادم معه حسب طريقة إنشائه وهنا تكلمت عن CreateTriangleSelectorFromBoundingBox

لبساطة شكل الأرضية المنشئ فلو حملنا مثلا مشهد متحرك باستعمال AddOctTreeSceneNode كما في مشهد Quake 3 Map الذي رأيناه من قبل سنحتاج إلى عمل تحديد باستعمال CreateOctTreeTriangleSelector لكي يتم عمل التصادم مع جميع أجزاء الشكل المحمل داخل المشهد

الشئ الأساسي هنا هو عمل عنصر التحديد

#33

السلام عليكم

أرجو أن لا أكون قد أتعبتك معي

-----------------------------------------------------------

عندما طبقت التصادم على أرض مع الكاميرا

تبقى الكاميرا ملتصقه بالأرض إلى أن أخرج من حدود الأرض.

أرجو معرفة السبب

أنا أسف إذا كان الكود غير منظم

الكود هو:



Imports Irrlicht
Imports Irrlicht.Core
Imports Irrlicht.Scene
Imports Irrlicht.Video
Module Module1

Sub Main()
Dim d As New IrrlichtDevice(DriverType.OPENGL)
Dim cam As ICameraSceneNode = d.SceneManager.AddCameraSceneNodeFPS '(Nothing, New Vector3D, New Vector3D(10, 10, 10), 0)
Dim f As ISceneNode = d.SceneManager.AddCubeSceneNode(10, Nothing, 0, New Vector3D(10, 1000, 10))
f.SetMaterialTexture(0, d.VideoDriver.GetTexture("1.jpg"))
f.SetMaterialFlag(MaterialFlag.LIGHTING, False)
f.SetMaterialType(MaterialType.DETAIL_MAP)
f.Scale = New Vector3D(10, 10, 10)
Dim mat As New Material
mat.Texture1 = d.VideoDriver.GetTexture("rockwall.bmp")
Dim p As IAnimatedMesh = d.SceneManager.AddHillPlaneMesh("a", New Dimension2Df(20, 20), New Dimension2D(20, 20), mat, 10, New Dimension2Df(20, 20), New Dimension2Df(20, 20))
Dim op As ISceneNode = d.SceneManager.AddMeshSceneNode(p.GetMesh(0), Nothing, 0, cam.Position, cam.Rotation, New Vector3D(10, 10, 10))
op.SetMaterialFlag(MaterialFlag.LIGHTING, False)
Dim e As ITriangleSelector = d.SceneManager.CreateTriangleSelectorFromBoundingBox(op)
Dim o As ISceneNodeAnimator = d.SceneManager.CreateCollisionResponseAnimator(e, cam, New Vector3D(5, 5, 5), New Vector3D(0, 0, 0), New Vector3D(0, 20, 0), 0)
cam.AddAnimator(o)
Dim i As Single = f.Position.Y - 100
cam.Position = New Vector3D(549.1829, 1281.754, -778.4343)
cam.Rotation = New Vector3D(53.12547, -57.03121, 0)
f.Position = New Vector3D(-246.6674, 1100.881, -12.55928)
While d.Run = True
d.VideoDriver.BeginScene(True, True, New Color(255, 255, 255, 255))
d.SceneManager.DrawAll()
d.VideoDriver.EndScene()
End While
End Sub
End Module

Game.zip

Game.rar

Module1.rar

تم تعديل هذه المشاركة بواسطة crazy Programm2007er في 1 سبتمبر 2007 في 19:34

#34

الخطأ أخي في إنشاء الأرضية

لو لاحظت للأرضية التي أنشأتها فلن تراها مستوية وانشاء عنصر التحديد بهذه الطريقة لن ينفع حاول أن تسوي الأرضية التي أنشأتها وسيعمل المثال

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

وبالتوفيق للجميع

#35

أرجو أن تشرح ذلك بالكود و شكرا على ردك السريع :lol:

وأرجو أن تسرع في تقديم درس اليوم

تم تعديل هذه المشاركة بواسطة crazy Programm2007er في 2 سبتمبر 2007 في 10:34

#37
DreamNet كتب:
المشكل يكمن في أنك حددت مكان الكاميرا بعد عمل الحركة بعد إضافة الanimation لها

حدد مكانها قبل السطر cam.addanimator

شكرا جزيلا لقد حلت المشكلة

وأنا متشوق جدا للدرس التالي :P

#38

هذا الواجب وآسف على التأخير ,,

اكتشاف التصادم سهل جدا ... ويفتح النفس لعمل لعبة الان :D

Collision_Detection.zip

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#39

السلام عليكم ورحمة الله وبركاته

ممتاز مشرفنا العزيز

أظن أن الأخ الشمري هو الوحيد المشارك في حل الواجب دائما(يعني لازم أصعب الواجب المرة القادمة :lol: )

اقتباس
اكتشاف التصادم سهل جدا ... ويفتح النفس لعمل لعبة الان

ليس قبل التصادم الفيزيائي أكيد

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

المهم مسألة التصادم بإستعمال المحرك شئ سهل لكن فقط علينا أن نفهمها جيدا

كنت أنتظر أن يسألني أحد كيف يتم كشف التصادم مع أجزاء مختلفة أي مشاهد منفصلة عن بعضها ؟

هل سنعمل على إنشاء تحديد لكل مشهد واكتشاف التصادم مع كل جزء على حدى؟

لو فكرنا في هذا الحل سنجد أنه صعب التطبيق لان أضافة أكثر من حركة للكاميرا مثلا لذلك فالمحرك يوفر محدد من النوع Meta نضيف إليه جميع المحددا المنشئة ومن ثم نستعمله في إكتشاف التصادم

سنعود لهذه النقطة في المرات القادمة إن شاء الله

أردت اليوم طرح درس سهل جدا يتمثل في إنشاء مكعب سماء

وشكل التطبيق سيكون كما ترون

post-23361-1188805228_thumb.jpg

نحتاج فقط دالة وحيدة هنا وهي AddSkyBoxSceneNode وبما أنه مكعب يعني له 6 أوجه لذلك نحتاج إلى 6 صور في متلف الاتجاهات لكساء السماء

أعجبني جدا منظر السماء في أمثلة Ogre فأدرجتها لكم لتطبقو معي المشهد السابق

skybox.zip

يعني فقط بقي لنا تحديد الكساء الصحيح في المنطقة الصحيحة لكي تظهر السماء حقيقة ومحيطة بنا

smgr.AddSkyBoxSceneNode(driver.GetTexture("cloudy_noon_UP.jpg"), _
		 driver.GetTexture("cloudy_noon_dn.jpg"), _
		 driver.GetTexture("cloudy_noon_bk.jpg"), _
		 driver.GetTexture("cloudy_noon_fr.jpg"), _
		 driver.GetTexture("cloudy_noon_rt.jpg"), _
		 driver.GetTexture("cloudy_noon_lf.jpg"), Nothing, 0)

لا تنسو الصور موجودة في الملف المرفق السابق

#41
اقتباس
كنت أنتظر أن يسألني أحد كيف يتم كشف التصادم مع أجزاء مختلفة أي مشاهد منفصلة عن بعضها ؟

لماذا تضيف أكثر من مشهد ,,؟

المشهد الواحد أتوقع يكفي ..

ننشئ مشهد واحد يحتوي على ما نريده .. واذا انتقلنا لمرحلة نم اللعبة نمسح المشهد السابق وندخل في مشهد جديد ,,

فيه أمر آخر مش متأكد منه ,, هل IVideoDriver تعيد لنا كائن مشهد واحد .. يعني ترجع لنا المؤشر .. أو في كل مرة ترجع لنا Object جديد ..

سأنظر للسورس كود وأرى ,

اقتباس
شكرا جزيلا

ولي طلب صغير أريد دالة تعلمني بملامسة شكل بأخر(True,False)

أرجو منك الإسراع

بعد اذن اصاحب الموضوع ... سأجيب :

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

أما اذا أردت أن تكتشف التصادم فقط .. دون أن يتوقف الشكل عن الحركة فالطريقة التي أعرفها هي :

- يوجد كائن اسمه bbox : ستجد فيه عدة method , منها اكتشاف تصادم " صندوق - صندوق " أو " نقطة وصندوق" ,, الخ .

يعني تحصل على bbox للمجسم عن طريق getBBox ..

ثم تختبرها مع ال Box للمجسم الثاني .. عن طريق الكلاس bbox ؟

لا اشتغل على جهازي حاليا بالتالي .. لا اتذكر أسماء الدوال ... عموما .. راجع bbox وستجد كل الدوال التي تريدها ..

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#43

أهلا مجددا

لم أجرب ماقلته أخي الشمري لكن مافائدة IMetaTriangleSelector إذا ؟

بالنسبة لاكتشاف التصادم يمكنك مراجعة المثال الموجود في الsdk رقم 7

توجد فئة اسمها ISceneCollisionManager تقوم بتسيير مختلف أنواع التصادم

لا أعرف ما نتوي فعله بالتحديد

لكن هناك عدة دوال موجودة في الفئة منها GetSceneNodeFromCameraBB التي ترجع لنا الscenenode الذي تم التصادم معه والكاميرا يعني الموجود في مجال الرؤية يمكنك مقارنته بالscene node الذي تريد التحقق من التصادم معه (إذا كانو متساويين)

الكود موجود في sdk بالسي شارب يمكنك مراجعته

#44
DreamNet كتب:
أهلا مجددا

لم أجرب ماقلته أخي الشمري لكن مافائدة IMetaTriangleSelector إذا ؟

بالنسبة لاكتشاف التصادم يمكنك مراجعة المثال الموجود في الsdk رقم 7

توجد فئة اسمها ISceneCollisionManager تقوم بتسيير مختلف أنواع التصادم

لا أعرف ما نتوي فعله بالتحديد

لكن هناك عدة دوال موجودة في الفئة منها GetSceneNodeFromCameraBB التي ترجع لنا الscenenode الذي تم التصادم معه والكاميرا يعني الموجود في مجال الرؤية يمكنك مقارنته بالscene node الذي تريد التحقق من التصادم معه (إذا كانو متساويين)

الكود موجود في sdk بالسي شارب يمكنك مراجعته

(True,False)أنا أريد بالتحديد أن تكون هناك دالة تصادم معينة أقم بتعبئة بارمتراتها ثم تخرج قيمة

#45
اقتباس
لماذا تضيف أكثر من مشهد ,,؟

المشهد الواحد أتوقع يكفي ..

ننشئ مشهد واحد يحتوي على ما نريده .. واذا انتقلنا لمرحلة نم اللعبة نمسح المشهد السابق وندخل في مشهد جديد ,,

أظنني لم أكن واضحا

كنت أقصد بالمشهد بالscenenode يعني لو كان عندنا عده أشكال في المشهد فلعمل تحديد لكل الأشكال فعلينا انشاء

كائن IMetaTriangleSelector يقوم باحتواء المحددات المنشئة وهو الذي يتم عمل به الكشف عن التصادم مع كل الأشكال المحددة

#46
DreamNet كتب:
أظنني لم أكن واضحا

كنت أقصد بالمشهد بالscenenode يعني لو كان عندنا عده أشكال في المشهد فلعمل تحديد لكل الأشكال فعلينا انشاء

كائن IMetaTriangleSelector يقوم باحتواء المحددات المنشئة وهو الذي يتم عمل به الكشف عن التصادم مع كل الأشكال المحددة

السلام عليكم

أخي DreamNet

أرجو عدم إزعاجك

ولكن لدي سؤالين

السؤال الأول:

لدي ملف DirectX (.x)

وهو على سبيل المثال:مدينة تحتوي على بيوت وسيارات وغيرها هل يمكن معرفة تصادم جميع أجزائه من بيوت وسيارات وأشخاص.

السؤال الثاني:

لدي مكعب وأريده إذا تصادم مع الأرض يقوم بتشغيل صوت معين

هل يمكن ذلك؟

--------------------------------------------------------------------------------------------------------

أرجو منك أخي الإسراع في الرد

#48

بالنسبة لسؤالك الأول:

فقد أجبت عليه

لقد رأينا كيف نقوم بتحميل mesh فاذا كان عندك أكثر من شكل مثلا scenenode1 وscenenode2 فلعمل التصادم قلنا يجب تحديد الشكل أولا باشاء selector يعني نعمل selector1 وselector2 للشكلين السابقين

ثم نخزن التحديدات التي انشأناها داخل كائن IMetaTriangleSelector

Dim meta As IMetaTriangleSelector=smgr.CreateMetaTriangleSelector()

نضيف التحديدات المنشئة

meta.AddTriangleSelector(selector1)
meta.AddTriangleSelector(selector2)

ثم نعمل الحركة لاكتشاف التصادم باستعمال المحدد الكلي meta

السؤال الثاني :

هناك مكتبة للتعامل مع الصوت إسمها irrKlang

كما يمكن استعمال مكتبات أخرى مثل الopenAl

بالنسبة للظل كنت أحضر في درس عنه ان شاء الله سيكون جاهز غدا صباحا

بالتوفيق للجميع

#49

السلام عليكم ماشاء الله موضوع مميز بارك الله فيك والى الأمام

تم تعديل هذه المشاركة بواسطة sayedf1 في 7 سبتمبر 2007 في 17:56

163374357.gif

#50

السلام عليكم ورحمة الله وبركاته

إنشاء الظل

post-23361-1189233905_thumb.jpg

أولا وقبل البدأ لتفعيل الظل يجب عند تجهيز المحرك للعمل تفعيل خاصية الظل وجعل stencilbuffer مفعلة

Dim device As IrrlichtDevice = New IrrlichtDevice(DriverType.DIRECT3D8, _
 New Dimension2D(640, 480), 16, False, True, False)

يجدر الذكر هنا أن الأجسام التي نستطيع عمل لها ظل تكون من النوع IAnimatedMeshSceneNode

طبعا هنا يجب تفعيل الإضاءة على الشكل المنشئ

في الصورة نرى أننا استعملنا شخصية متحركة dwarf وعرفنا قبل كيف نحمل mesh

Dim perso As IAnimatedMeshSceneNode = smgr.AddAnimatedMeshSceneNode( _
smgr.GetMesh(path + "dwarf.x"), Nothing, -1)

نفعل خاصية التأثر بالإضاءة على الشكل

perso.SetMaterialFlag(MaterialFlag.LIGHTING, True)

الآن نحدد لون الظل (أسود)

smgr.ShadowColor = New Color(255, 0, 0, 0)

الآن نضيف الظل للشكل

perso.AddShadowVolumeSceneNode()

ظهور الظل مقرون طبعا بوجود مصدر للإضاءة وقد رأينا قبل كيف ننشئ مصدر للضوء

Dim light As ILightSceneNode = smgr.AddLightSceneNode(Nothing, New Vector3D(0, 0, 0), _
			 New Colorf(20, 255.0F, 255.0F, 255.0F), 600.0F, 0)

Dim sun As ISceneNode = smgr.AddBillboardSceneNode(light, New Dimension2Df(60, 60) _
		, New Vector3D(0, 70, -100), 1)
sun.SetMaterialTexture(0, driver.GetTexture(path + "particlewhite.bmp"))
sun.SetMaterialFlag(MaterialFlag.LIGHTING, False)
sun.SetMaterialType(MaterialType.TRANSPARENT_ADD_COLOR)

طبعا لكي نرى الظل يتحرك نحرك مصدر الضوء

Dim anim As ISceneNodeAnimator = smgr.CreateFlyCircleAnimator( _
	New Vector3D(0, 80, 0), 190, 0.0005)
light.AddAnimator(anim)

التطبيق

Module1.zip

بالتوفيق إن شاء الله للجميع

تم تعديل هذه المشاركة بواسطة DreamNet في 8 سبتمبر 2007 في 09:52

مواضيع مشابهة