ورود

View Full Version : 3D FILE LOADING



Hamid_VB
دوشنبه 16 شهریور 1388, 06:30 صبح
من یه فرمت جدید برای فایل های 3 بعدی به نام Z3D درست کردم که می تونه انیمیشن هم داشته باشه. برای اینکار یه برنامه با Max Script نوشتم.

ولی نمی دونم چرا توی OpenGL وقتی از دستور :
glBegin(GL_*);استفاده می کنم ، اون شکل نور پردازی نمی شه و Matrial هم نمی گیره ، در نتیجه بدون Texture اصلا قابل تشخیص نیست..؟!
وقتی هم می خوام Shadow Volume بذارم ، fps موتورم خیلی میاد پایین. چون برای هر ضلع مثلث یه مربع باید رسم بشه ولی نمی دونم چه جوری میتونم سرعتشو بیشتر کنم...؟
اگه می شد نقاطedges شکل که روبروی نورند رو تشخیص داد خیلی عالی می شد...

با Texture:

http://img2.tinypic.info/files/cytbb2xop86kjfqi15zc.jpg

بدون Texture:
http://img2.tinypic.info/files/5ui6s87d4whugpjiopey.jpg

دانلود برنامه (http://www.persianupload.com/2460012)

pswin.pooya
دوشنبه 16 شهریور 1388, 17:22 عصر
میتونی در مورد این قالب فایلی اطلاعات کاملتر رو بدی و اینکه بگی چه نوع انیمیشی رو ساپورت میکنه ( keyframe، skeletal و ... )

pswin.pooya
دوشنبه 16 شهریور 1388, 17:30 عصر
ولی نمی دونم چرا توی OpenGL وقتی از دستور :
glBegin(GL_*);استفاده می کنم ، اون شکل نور پردازی نمی شه و Matrial هم نمی گیره ، در نتیجه بدون Texture اصلا قابل تشخیص نیست..؟!




سلام در مورد دستور glBegin چند تا مورد هستش:
زمانی که داری ورتکسها رو میدی و قبل از glEnd نمی تونی تغییر وضعیتهای رو مثل عوض کردن تکسچر، عوض کردن شیدر و ... داشته باشی. اگه چند تا مش داخل فایلت با تکسچرهای مختلف داری اونها رو به صورت جداگانه رسمشون کن.

اما تکسچرها رو چه جوری توی فایلت دخیره میکنی ( با آدرس و یا با متن) در هر صورت. شکل بالا که گذاشتی بیشتر از هر چیز دیگه گویای این مطلب هستش که تکسچرینگت کار نمی کنه و یا تکسکوردهات اشتباه هستن.




وقتی هم می خوام Shadow Volume بذارم ، fps موتورم خیلی میاد پایین. چون برای هر ضلع مثلث یه مربع باید رسم بشه ولی نمی دونم چه جوری میتونم سرعتشو بیشتر کنم...؟
اگه می شد نقاطedges شکل که روبروی نورند رو تشخیص داد خیلی عالی می شد...


موتور Ogre زمان ساخت فایل مش اینکار رو انجام میده یعنی edage های شکل رو ذخیره میکنه.

Hamid_VB
سه شنبه 17 شهریور 1388, 13:45 عصر
میتونی در مورد این قالب فایلی اطلاعات کاملتر رو بدی و اینکه بگی چه نوع انیمیشی رو ساپورت میکنه ( keyframe، skeletal و ... )

سلام...
من مختصات مشهای هر شئ رو در هر فریم جداگانه توی فایل خروجی قرار میدم. و چون فریم به فریم مختصات هر شئ ذخیره میشه ، حجم فایل هایی که انیمیشن دارند خیلی زیاد میشه.
راستش راه دیگه ای بلد نبودم ، خوشحال میشم اگه کمکم کنید...

این فرمت مثل فرمت obj می مونه..با این تفاوت که به جای نوشتن اعداد ، مقدار کارکتری اعداد نوشته میشه. اسکریپتی که توی مکس اسکریپت نوشتم ، هر دو عدد رو (از 0 تا 99) به یه کارکتر تبدیل میکنه(یعنی داده ها از دو بایت به یک بایت تبدیل میشند).اینجوری حجم فایل تقریباً نصف حجم فایل obj میشه.البته چون توی مکس اسکریپت نمی دونستم چه جوری میشه مقدار کارکتری یک بایت رو بدست اورد ، یه متغییر Array تعریف کردم و توی این متغییر 100 کارکتر رو قرار دادم(کارکتر های کد های اسکی بین 95 تا 196). برای تشخیص محل شروع داده های مربوط به مختصات مش ها(Verts) در هر فریم ، مختصات Texture ها (MapVerts) ، ترتیب قرار گرفتن مختصات مش ها و مختصات Texture ها(Face و MapFace) و... از کارکترهایی که کد اسکی اونها بین 95 تا 196 نباشه استفاده می کنم(مثل فایل های Obj که از V Vn Vt و... استفاده می کنه) و چون مقدار مختصات ها Float است و ممیز دارند به جای . از یه کارکتر دیگه استفاده کردم و از یه کارکتر دیگه هم برای جدا کردن اعداد X Y Z استفاده کردم.
درسته که این قالب فایلی حجم زیادی داره ولی فایده هایی داره ، مثلاً براحتی نمیشه Decode کردش و اگه یه موتور بازی باهاش نوشته بشه کسی نمی تونه مدل های سه بعدی بازی رو تغییر بده (ولی فرمت های مشهوری مثل 3ds و obj و md3 و... رو میشه تغییر داد).

Hamid_VB
سه شنبه 17 شهریور 1388, 13:54 عصر
زمانی که داری ورتکسها رو میدی و قبل از glEnd نمی تونی تغییر وضعیتهای رو مثل عوض کردن تکسچر، عوض کردن شیدر و ... داشته باشی. اگه چند تا مش داخل فایلت با تکسچرهای مختلف داری اونها رو به صورت جداگانه رسمشون کن.
اما تکسچرها رو چه جوری توی فایلت دخیره میکنی ( با آدرس و یا با متن) در هر صورت. شکل بالا که گذاشتی بیشتر از هر چیز دیگه گویای این مطلب هستش که تکسچرینگت کار نمی کنه و یا تکسکوردهات اشتباه هستن.

من همین کارو کردم ، داده های مربوط به هر شئ رو جداگانه داخل فایل قرار دادم(که با یه کارکتر از هم جدا میشند).
توی شکل دوم خودم Texture ها رو Load نکردم که بگم شکلهای رسم شده با glBegin بدون Texture واضح نیستند.
وقتی یکی از شکل های کتابخانه ی glut (مثل قوری چای ، مکعب و ....) رو رسم میکنم واضح دیده میشند ، چون نورپردازی میشند و میشه روی اونا متریال گذاشت ولی وقتی با دستور glBegin می خوام یه شکل رسم کنم ، واضح نیست چون همه ی قسمت های اون شکل به یه رنگ دیده میشند که این نشون میده شکل رسم شده نور پردازی نشده البته اگه Texture داشته باشه واضحه ولی شکلای آماده ی glut بدون Texture هم واضح اند...چرا؟

http://img2.tinypic.info/files/fmjjq5gbsn1s6ji78tjf.jpg
Ogre کجا میتونم پیدا کنم؟
راه دیگه ای برای پیدا کردن edge ها وجود نداره؟
کارت گرافیک من شیدر ساپرت نمکنه و تا حالا با شیدرها کار نکرم.

Hamid_VB
سه شنبه 17 شهریور 1388, 14:04 عصر
یه مشکل دیگه هم هست...
اگه بخوام تشخیص بدم که هر دونه ی برف روی چه شئ با چه ارتفاعی میفته ، یا جلوی رد شدن اشیاء از هم دیگه رو بگیرم باید مختصات مثلث های هر شئ رسم شده و بردار نرمال هر مثلث رو توی یه متغییر داشته باشم.
مشکل اینجاست که حافظه ی کامپیوتر جای چنین متغییر بزرگی رو نداره...
نمی دونم باید چه کار کنم؟؟؟

pswin.pooya
سه شنبه 17 شهریور 1388, 15:24 عصر
یه فایل مش باید مشخصات زیادی داشته باشه. یکی از اونها اینه که به غیر از مشخصات ورتکسها باید نرمال و تکسکورد رو نگهداری کنه. مورد دوم اینه که اگر مواردی رو مثل انیمیشن میخواد پیاده سازی کنه باید از حالت اندیس شده ورتکسها استفاده کنه. و اگر انیمیشن کی فریم استفاده میکنی بهتره که به جای ذخبره موقهیتها توی هر فریم اندیسها رو توی هر فریم ذخیره کنی. پردازش حالت اندیسی هم برای gpu سریعتر وبهتر هستش به غیر از اینکه میشه گفت توی اکثر مشهای بزرگ حجم داده هم کمتر میشه.

برای فیزیک هم باید از یه موتور فیزیک استفاده کنی و یا اینکه یکی خودت دستی طراحی کنی یه گزینه خوب موتور ode هستش

فیزیک برای سیستمهای ذره ای خیلی مشکل هستش و تعداد ذرات باید کم باشه همینوطور هم برای فیزیک و هم برای مدیریت صحنه باید دو تا مدیر صحنه جداگانه داشته باشی که تا حد امکان culling رو انجام بدن. توی کتاب MOGL پردازش فیزیک رو در سطح حجم پردازشی گرافیک و یا حتی بالاتر از اون معرفی میکنه. و در رده آخر پردازش هوش مصنوعی رو معرفی میکنه.

kochol
سه شنبه 17 شهریور 1388, 22:30 عصر
سلام

ایول خیلی باحال شده (به ما هم MaxScript یاد میدی :D)



استفاده می کنم ، اون شکل نور پردازی نمی شه و Matrial هم نمی گیره ، در نتیجه بدون Texture اصلا قابل تشخیص نیست..؟!


فکر کنم بردار های نرمال رو برای مدل هات تعریف نکردی بدون بردار نرمال که نورپردازی حساب نمی شه.



من مختصات مشهای هر شئ رو در هر فریم جداگانه توی فایل خروجی قرار میدم. و چون فریم به فریم مختصات هر شئ ذخیره میشه ، حجم فایل هایی که انیمیشن دارند خیلی زیاد میشه.
راستش راه دیگه ای بلد نبودم


اگر بخواهی برای این تانک انیمیشن درست کنی مثل حرکت به جلو و چرخش لوله و اینها بهتره که این کارها با کد انجام بشه.

روش انیمیشن دیگه ای که هم سریع است و هم حجم کمتری می گیره و هم نرمتر است انیمیشن اسکلتی است که می تونی برای یادگیری اون دنبال لود فایل های ms3d باشی تو همین فروم هم قبلا یه پست در این رابطه بود که می تونه بهت کمک کنه.



Ogre کجا میتونم پیدا کنم؟
کارت گرافیک من شیدر ساپرت نمکنه و تا حالا با شیدرها کار نکرم.


http://ogre3d.org

می شه بگی مدل کارت گرافیکت چیه؟



ه مشکل دیگه هم هست...
اگه بخوام تشخیص بدم که هر دونه ی برف روی چه شئ با چه ارتفاعی میفته ، یا جلوی رد شدن اشیاء از هم دیگه رو بگیرم باید مختصات مثلث های هر شئ رسم شده و بردار نرمال هر مثلث رو توی یه متغییر داشته باشم.
مشکل اینجاست که حافظه ی کامپیوتر جای چنین متغییر بزرگی رو نداره...
نمی دونم باید چه کار کنم؟؟؟


باید از bounding box استفاده کنی می تونی یه سرچ در باره physx بکنی یا همون ode هم خوبه ولی physx توسط nvidia ساپورت می شه.

Hamid_VB
شنبه 21 شهریور 1388, 21:59 عصر
از کمکتون خیلی ممنونم...
برای نورپردازی باید بردارهای نرمال را میدادم...
مدل کارت گرافیک من ATI RADON 7000 که خیلی قدیمی.
احتمالاً تا چند روز دیگه مطالبی در مورد MaxScript میذارم.

pswin.pooya
یک شنبه 22 شهریور 1388, 11:54 صبح
مدل کارت گرافیک من ATI RADON 7000 که خیلی قدیمی.

این مدل متاسفانه از شیدرها پشتیبانی نمیکنه.


احتمالاً تا چند روز دیگه مطالبی در مورد MaxScript میذارم.

خیلی خوب میشه

jack
یک شنبه 22 شهریور 1388, 12:23 عصر
سلام امیدوارم که با max script مشکلتون حل بشه و من پیشنهاد می کنم که در کنار max script که قابلیت بسیار ارزشمند در 3dsmax هستش به exporter مکس هم دقت کنید که فرمتهای خیلی خوبی داره مثلا ascii scene exporter از صحنه ساخته شده یک فایل text می سازه که خیلی از خصوصیات فایل مکس رو در خودش داره مثلا تمام material ها رو در خودش ذخیره می کنه البته معایبی هم داره که مثلا از انیمیشن به خوبی پشتیبانی نمی کنه . ولی برای اشیا ثابت و متحرکی که انیمیشن ندارن مثل خانه ماشین و خیلی چیزهای دیگه استفاده می شه . من خودم در حال حاضر رو این مقوله کار می کنم و فایل ASE رو به یک فایل باینری تبدیل کرده و در محیط 3 بعدی استفاده می کنم مخصوصا دارم تلاش می کنم اگه بشه یک terrain رو در مکس بسازم و بعد وارد محیط real time کنم .به این صورت میشه محیط های مقعر رو که توسط هایت مپ قابل شبیه سازی نیست شبیه سازی کرد مخصوصا که 3dsmax 9 به بعد در material ED از shader ها پشتیبانی می کنه . به این صورت می شه در مکس شیدر ها رو به اشیا متصل کرد و خیلی کارهای دیگه . ببخشید خیلی از ase تعریف کردم . امیدوارم از بحث اصلی خارج نشیم .

ممنون

pswin.pooya
یک شنبه 22 شهریور 1388, 13:33 عصر
سلام امیدوارم که با max script مشکلتون حل بشه و من پیشنهاد می کنم که در کنار max script که قابلیت بسیار ارزشمند در 3dsmax هستش به exporter مکس هم دقت کنید که فرمتهای خیلی خوبی داره مثلا ascii scene exporter از صحنه ساخته شده یک فایل text می سازه که خیلی از خصوصیات فایل مکس رو در خودش داره مثلا تمام material ها رو در خودش ذخیره می کنه البته معایبی هم داره که مثلا از انیمیشن به خوبی پشتیبانی نمی کنه . ولی برای اشیا ثابت و متحرکی که انیمیشن ندارن مثل خانه ماشین و خیلی چیزهای دیگه استفاده می شه . من خودم در حال حاضر رو این مقوله کار می کنم و فایل ASE رو به یک فایل باینری تبدیل کرده و در محیط 3 بعدی استفاده می کنم مخصوصا دارم تلاش می کنم اگه بشه یک terrain رو در مکس بسازم و بعد وارد محیط real time کنم .به این صورت میشه محیط های مقعر رو که توسط هایت مپ قابل شبیه سازی نیست شبیه سازی کرد مخصوصا که 3dsmax 9 به بعد در material ED از shader ها پشتیبانی می کنه . به این صورت می شه در مکس شیدر ها رو به اشیا متصل کرد و خیلی کارهای دیگه . ببخشید خیلی از ase تعریف کردم . امیدوارم از بحث اصلی خارج نشیم .

شما ساختار این قالب فایلی رو دارید. اگر براتون ممکن باشه میتونید این ساختار رو به اشتراک بگذارین تا بقیه هم استفاده کنن. من رئ ساختارهای 3ds مطالعه کردم. این ساختار هم اکثر اطلاعات صحنه رو مثل نورها، مشها و ... رو داخل خودش جا میده و یه ساختار باینری داره. البته این قالب هم با انیمیشن مشکل داره وبیشتر به درد موارد استاتیک میخوره.

کلا کار با مکس اسکریپت و ساختن اکسپورتر برای مکس و مایا میتونه خیلی مفید باشه و میتونه توی ساختن مواردی مثل ادیتور مرحله و یا قالب فایلی خودتون کمک زیادی بکنه. به عنوان مثال من میخوام که قالب فایلی خودم رو طراحی کنم که محدودیت ها قالبهای فایلی دیگه مثل 3ds و ms3d رو نداشته باشه و در عین حال لود کردنش آسون باشه.

jack
دوشنبه 23 شهریور 1388, 15:53 عصر
سلام

به این دلیل که فایلهای ase با فرمت تکست هستش و با یک نگاه اجمالی به فایل زیر که نمونه ای از فایل ase است متوجه می شوید که نوشتن برنامه لود فایل ase کار سختی نیست . در واقع این فایل کلیدی دارای یک سری کلمات کلیدی مثل MATERIAL_LIST,MATERIAL_COUNT,GEOMOBJECT,MESH_VERTE X_LIST,... است

*3DSMAX_ASCIIEXPORT 200
*COMMENT "AsciiExport Version 2.00 - Mon Sep 14 14:26:39 2009"
*SCENE {
*SCENE_FILENAME ""
*SCENE_FIRSTFRAME 0
*SCENE_LASTFRAME 100
*SCENE_FRAMESPEED 30
*SCENE_TICKSPERFRAME 160
*SCENE_BACKGROUND_STATIC 0.0000 0.0000 0.0000
*SCENE_AMBIENT_STATIC 0.0000 0.0000 0.0000
}
*MATERIAL_LIST {
*MATERIAL_COUNT 1
*MATERIAL 0 {
*MATERIAL_NAME "Material #28"
*MATERIAL_CLASS "DirectX Shader"
*MATERIAL_AMBIENT 0.5880 0.5880 0.5880
*MATERIAL_DIFFUSE 0.5880 0.5880 0.5880
*MATERIAL_SPECULAR 0.9000 0.9000 0.9000
*MATERIAL_SHINE 0.1000
*MATERIAL_SHINESTRENGTH 0.0000
*MATERIAL_TRANSPARENCY 0.0000
*MATERIAL_WIRESIZE 1.0000
*NUMSUBMTLS 1
*SUBMATERIAL 0 {
*MATERIAL_NAME "Material #28"
*MATERIAL_CLASS "DirectX Shader"
*MATERIAL_AMBIENT 0.5880 0.5880 0.5880
*MATERIAL_DIFFUSE 0.5880 0.5880 0.5880
*MATERIAL_SPECULAR 0.9000 0.9000 0.9000
*MATERIAL_SHINE 0.1000
*MATERIAL_SHINESTRENGTH 0.0000
*MATERIAL_TRANSPARENCY 0.0000
*MATERIAL_WIRESIZE 1.0000
*NUMSUBMTLS 1
*SUBMATERIAL 0 {
*MATERIAL_NAME "fur_renderstyle"
*MATERIAL_CLASS "DirectX Shader"
*MATERIAL_AMBIENT 0.5880 0.5880 0.5880
*MATERIAL_DIFFUSE 0.5880 0.5880 0.5880
*MATERIAL_SPECULAR 0.9000 0.9000 0.9000
*MATERIAL_SHINE 0.1000
*MATERIAL_SHINESTRENGTH 0.0000
*MATERIAL_TRANSPARENCY 0.0000
*MATERIAL_WIRESIZE 1.0000
*NUMSUBMTLS 1
*SUBMATERIAL 0 {
*MATERIAL_NAME "vertexcolor_renderstyle"
*MATERIAL_CLASS "Standard"
*MATERIAL_AMBIENT 0.5880 0.5880 0.5880
*MATERIAL_DIFFUSE 0.5880 0.5880 0.5880
*MATERIAL_SPECULAR 0.9000 0.9000 0.9000
*MATERIAL_SHINE 0.1000
*MATERIAL_SHINESTRENGTH 0.0000
*MATERIAL_TRANSPARENCY 0.0000
*MATERIAL_WIRESIZE 1.0000
*MATERIAL_SHADING Blinn
*MATERIAL_XP_FALLOFF 0.0000
*MATERIAL_SELFILLUM 0.0000
*MATERIAL_FALLOFF In
*MATERIAL_XP_TYPE Filter
}
}
}
}
}
*GEOMOBJECT {
*NODE_NAME "Box01"
*NODE_TM {
*NODE_NAME "Box01"
*INHERIT_POS 0 0 0
*INHERIT_ROT 0 0 0
*INHERIT_SCL 0 0 0
*TM_ROW0 1.0000 0.0000 0.0000
*TM_ROW1 0.0000 1.0000 0.0000
*TM_ROW2 0.0000 0.0000 1.0000
*TM_ROW3 18.6913 0.7117 0.0000
*TM_POS 18.6913 0.7117 0.0000
*TM_ROTAXIS 0.0000 0.0000 0.0000
*TM_ROTANGLE 0.0000
*TM_SCALE 1.0000 1.0000 1.0000
*TM_SCALEAXIS 0.0000 0.0000 0.0000
*TM_SCALEAXISANG 0.0000
}
*MESH {
*TIMEVALUE 0
*MESH_NUMVERTEX 8
*MESH_NUMFACES 12
*MESH_VERTEX_LIST {
*MESH_VERTEX 0 -11.7615 -62.1582 0.0000
*MESH_VERTEX 1 49.1441 -62.1582 0.0000
*MESH_VERTEX 2 -11.7615 63.5816 0.0000
*MESH_VERTEX 3 49.1441 63.5816 0.0000
*MESH_VERTEX 4 -11.7615 -62.1582 31.0067
*MESH_VERTEX 5 49.1441 -62.1582 31.0067
*MESH_VERTEX 6 -11.7615 63.5816 31.0067
*MESH_VERTEX 7 49.1441 63.5816 31.0067
}
*MESH_FACE_LIST {
*MESH_FACE 0: A: 0 B: 2 C: 3 AB: 1 BC: 1 CA: 0 *MESH_SMOOTHING 2 *MESH_MTLID 1
*MESH_FACE 1: A: 3 B: 1 C: 0 AB: 1 BC: 1 CA: 0 *MESH_SMOOTHING 2 *MESH_MTLID 1
*MESH_FACE 2: A: 4 B: 5 C: 7 AB: 1 BC: 1 CA: 0 *MESH_SMOOTHING 3 *MESH_MTLID 0
*MESH_FACE 3: A: 7 B: 6 C: 4 AB: 1 BC: 1 CA: 0 *MESH_SMOOTHING 3 *MESH_MTLID 0
*MESH_FACE 4: A: 0 B: 1 C: 5 AB: 1 BC: 1 CA: 0 *MESH_SMOOTHING 4 *MESH_MTLID 4
*MESH_FACE 5: A: 5 B: 4 C: 0 AB: 1 BC: 1 CA: 0 *MESH_SMOOTHING 4 *MESH_MTLID 4
*MESH_FACE 6: A: 1 B: 3 C: 7 AB: 1 BC: 1 CA: 0 *MESH_SMOOTHING 5 *MESH_MTLID 3
*MESH_FACE 7: A: 7 B: 5 C: 1 AB: 1 BC: 1 CA: 0 *MESH_SMOOTHING 5 *MESH_MTLID 3
*MESH_FACE 8: A: 3 B: 2 C: 6 AB: 1 BC: 1 CA: 0 *MESH_SMOOTHING 6 *MESH_MTLID 5
*MESH_FACE 9: A: 6 B: 7 C: 3 AB: 1 BC: 1 CA: 0 *MESH_SMOOTHING 6 *MESH_MTLID 5
*MESH_FACE 10: A: 2 B: 0 C: 4 AB: 1 BC: 1 CA: 0 *MESH_SMOOTHING 7 *MESH_MTLID 2
*MESH_FACE 11: A: 4 B: 6 C: 2 AB: 1 BC: 1 CA: 0 *MESH_SMOOTHING 7 *MESH_MTLID 2
}
}
*PROP_MOTIONBLUR 0
*PROP_CASTSHADOW 1
*PROP_RECVSHADOW 1
*MATERIAL_REF 0
}