Contacts
صفحه اصلی پورتال | صفحه اصلی تالار | ثبت نام | اعضاء | گروه ها | جستجو | پرسش و پاسخ | فروشگاه الکترونیکی | خرید پستی بازی های کامپیوتری





صفحه اول انجمنها -> برنامه نويسي تخصصي DirectX و اصول برنامه نويسي تحت ويندوز -> چرخش محلی اشیا در دایرکت ایکس
 

ارسال يك موضوع جديد   پاسخ به يك موضوع ديدن موضوع قبلي :: ديدن موضوع بعدي

چرخش محلی اشیا در دایرکت ایکس
نويسنده
پيغام
khatarat
کاربر جدید
کاربر جدید


تاريخ عضويت: جمعه 11 بهمن 1387
تعداد ارسالها: 10


2 شنبه 14 بهمن 1387 - 14:39
پاسخ بصورت نقل قول
1-چطور می شه یک شی رو به صورت محلی چرخاند.مثل چرخش locall در نرم افزار های سه بعدی مانند 3d max
2-من می خوام یه تابع بنویسم که هر بار که اجرا شد به اندازه پارامترش شی رو بچرخونه چطور باید این رو بنویسم
device.transform.word=rot
mymesh.draw();
----------------------------------------------
public void Rotate(vector3 angle)a
rot=?)اینجا باید چه ماتریس هایی بنویسم؟)
مثلا یکبار وروری باشه )10و10و10( و دفعه بعد هم همین شی به اندازه 20و20و20 بچرخه
ارسال  بازگشت به بالا
ديدن مشخصات كاربر ارسال پيغام خصوصي
 

نويسنده
پيغام
lord_akinak
متخصص ساخت بازی
متخصص ساخت بازی


تاريخ عضويت: شنبه 15 ارديبهشت 1386
تعداد ارسالها: 349
محل سكونت: Hell


2 شنبه 14 بهمن 1387 - 20:05
پاسخ بصورت نقل قول
سلام

با transform های device نمیشه مختصات local رو عوض کرد، این رو توی تاپیک قبل هم گفتم.
برای local باید بافر lock بشه و خود vertex ها تبدیل بشن.

برای توضیحات کامل مراجعه شود به DX SDK یا
http://msdn.microsoft.com/en-us/library/bb206269(VS.85).aspx

نحوه تبدیلات هم مثل تبدیلات ماترسی هست فقط مد نظر داشته باشید DX چپ دسته

-------- خارج از بحث
برای DX از DX Managed استفاده نکنید/ DX Managed دیگه پشتیبانی نمیشه / برای .Net کار ها XNA توصیه میشود...

_________________
And hell was so cold
All the vases are so broken
And the roses tear our hands all open
Mother mary miscarry
But we pray just like insects
The world is so ugly now
ارسال  بازگشت به بالا
ديدن مشخصات كاربر ارسال پيغام خصوصي ديدن وب سايت كاربر نام كاربري در پيغامگير Yahoo
 

نويسنده
پيغام
khatarat
کاربر جدید
کاربر جدید


تاريخ عضويت: جمعه 11 بهمن 1387
تعداد ارسالها: 10


2 شنبه 14 بهمن 1387 - 20:48
پاسخ بصورت نقل قول
من هر چی هلپ دایرکت ایکس و خیلی کتاب های دیگه رو خوندم متوجه نشدم چطور باید یک شی رو به صورت محلی چرخاند.
اگر می شه به صورت خلاصه کد هاش رو بنویسید خیلی ممنون می شم
ارسال  بازگشت به بالا
ديدن مشخصات كاربر ارسال پيغام خصوصي
 

نويسنده
پيغام
lord_akinak
متخصص ساخت بازی
متخصص ساخت بازی


تاريخ عضويت: شنبه 15 ارديبهشت 1386
تعداد ارسالها: 349
محل سكونت: Hell


3 شنبه 15 بهمن 1387 - 00:52
پاسخ بصورت نقل قول
من Managed کار نمیکنم و کدهای من برات مفهومی نخواهند داشت!

رند کار اینه:

اگر از D3DXMESH استفاده میکنی ، در هنگام لود کردن mesh ، به Options ها دقت کنید ،
بهتره DYNAMIC و اگر فقط قصد نوشتن اطلاعات رو داید ( خودندن اطلاعات ممکن نخواهد بود ) WRITEONLY رو بدید.
برای مطالعه :
http://msdn.microsoft.com/en-us/library/bb147263(VS.85).aspx
http://msdn.microsoft.com/en-us/library/bb205370(VS.85).aspx

VertexBuffer رو برای اون شی که load کردی میگیری ( اگر از D3DXMESH استفاده میکنی یه چیزی مثل getVertexBuffer داره )

برای اینکه یک Buffer رو Lock کنید نیاز دارید که بدونید اون Buffer از چه Declaration ای استفاده کرده ، این که Vertex Declaration چیه در این بحث نمی گنجه ، باید خودت در موردش تحقیق کنی.
بدست آوردن Declaration از یک D3DXMESH :
http://msdn.microsoft.com/en-us/library/bb172818(VS.85).aspx
http://www.gamedev.net/community/forums/topic.asp?topic_id=86467

بعد از Lock کردن یک buffer میتونی اطلاعات رو تغییر بدی ، دوران رو به راحتی از توابع مثلثاتی و یک ماتریس 3x3 میشه انجام داد.

در نهایت buffer رو unlock میکنی و تمام ...
---------------------------------------------------------------
احتمالا متجه شدی کار ساده ای نیست ( البته مشکل هم نیست! ) ....
به دنیای DX خوش اومدی Very Happy Smile Surprised

_________________
And hell was so cold
All the vases are so broken
And the roses tear our hands all open
Mother mary miscarry
But we pray just like insects
The world is so ugly now
ارسال  بازگشت به بالا
ديدن مشخصات كاربر ارسال پيغام خصوصي ديدن وب سايت كاربر نام كاربري در پيغامگير Yahoo
 

نويسنده
پيغام
khatarat
کاربر جدید
کاربر جدید


تاريخ عضويت: جمعه 11 بهمن 1387
تعداد ارسالها: 10


3 شنبه 15 بهمن 1387 - 09:41
پاسخ بصورت نقل قول
برای اینکه ورتکس ها رو چرخش بدیم که لازم نیست مستقیما ورتکس ها رو چرخش بدیم که اگر قبلش هم مختصات device رو تغییر بدیم هم شی می چرخه مشکل من اینه که وقتی می خوام با استفاده از زاویه های اویلر شی رو بچرخونم شی به خوبی حول محور z می چرخه ولی حول محور x , y خودش نمی چرخه بلکه حول محور های x,y جهانی می چرخه نمی دونم چرا؟
ارسال  بازگشت به بالا
ديدن مشخصات كاربر ارسال پيغام خصوصي
 

نويسنده
پيغام
lord_akinak
متخصص ساخت بازی
متخصص ساخت بازی


تاريخ عضويت: شنبه 15 ارديبهشت 1386
تعداد ارسالها: 349
محل سكونت: Hell


3 شنبه 15 بهمن 1387 - 18:51
پاسخ بصورت نقل قول
آه خدای من !!!

عزیز من ، بگو می خوام جسمم رو حول محورش دوران بدم ، نه اینکه مختصات local رو عوض کنم Twisted Evil

ترتیب ضرب ماتریس هات اشتباهه / اول دوران بده ( جسم حول محور جهانی خودش میچرخه « که چون انتقال نداری با محور جسم یکیه » ) بعد انتقال بده ( جسم چرخیده جابه جا میشه )

كد:

TransformMatrix = RotationMatrix * TranslationMatrix


در هر صورت اگه لینک اول رو درست میخوندی خودت مشکلت رو می فهمیدی

_________________
And hell was so cold
All the vases are so broken
And the roses tear our hands all open
Mother mary miscarry
But we pray just like insects
The world is so ugly now
ارسال  بازگشت به بالا
ديدن مشخصات كاربر ارسال پيغام خصوصي ديدن وب سايت كاربر نام كاربري در پيغامگير Yahoo
 

نويسنده
پيغام
khatarat
کاربر جدید
کاربر جدید


تاريخ عضويت: جمعه 11 بهمن 1387
تعداد ارسالها: 10


3 شنبه 15 بهمن 1387 - 19:47
پاسخ بصورت نقل قول
این رو که خودم هم می دونم مشکل من ساختن این rotation matrix است.
من می خوام زاویه های اویلر استفاده کنم.
تنها راهی که به ذهنم رسید اینه که این هم عمل نمی کنه.
public void Rotate(Vector3 Rot)
{
xang += Rot.X;
yang += Rot.Y;
zang += Rot.Z;
if (xang >= 360)
xang -= 360;
if (yang >= 360)
yang -= 360;
if (zang >= 360)
zang -= 360;

//rot = Matrix.RotationX(Geometry.DegreeToRadian(xang)) * Matrix.RotationZ(Geometry.DegreeToRadian(zang)) *Matrix.RotationY(Geometry.DegreeToRadian(yang));
//xmat = ymat = zmat = Matrix.Zero;

xmat.M11 = 1;
ymat.M12 = 1;
zmat.M13 = 1;
rot = Matrix.RotationAxis(new Vector3(zmat.M11,zmat.M12,zmat.M13),Geometry.DegreeToRadian(zang));
xmat *= Matrix.RotationAxis(new Vector3(zmat.M11, zmat.M12, zmat.M13), Geometry.DegreeToRadian(zang));
ymat *= Matrix.RotationAxis(new Vector3(zmat.M11, zmat.M12, zmat.M13), Geometry.DegreeToRadian(zang));
rot *= Matrix.RotationAxis(new Vector3(xmat.M11, xmat.M12, xmat.M13),Geometry.DegreeToRadian(xang));
//rotx = Matrix.RotationAxis(new Vector3(xmat.M11, xmat.M12, xmat.M13), Geometry.DegreeToRadian(xang));
xmat *= Matrix.RotationAxis(new Vector3(xmat.M11, xmat.M12, xmat.M13), Geometry.DegreeToRadian(xang));
ymat *= Matrix.RotationAxis(new Vector3(xmat.M11, xmat.M12, xmat.M13), Geometry.DegreeToRadian(xang));

rot *= Matrix.RotationAxis(new Vector3(ymat.M11, ymat.M12, ymat.M13), Geometry.DegreeToRadian(yang));
//roty = Matrix.RotationAxis(new Vector3(ymat.M11, ymat.M12, ymat.M13), Geometry.DegreeToRadian(yang));

اگر می خوای بدونی منظور من از محلی چیه یه سر به نرم افزار های سه بعدی بزن و نوع چرخش رو local انتخاب کن می بینی که وقتی شی رو حول یک محور دوران می دیم دو محور دیگه هم به همون اندازه می چرخند.و وقتی می خوایم شی رو حول محور های دیگه دوران بدیم حول محور های جدید می چرخند.
ارسال  بازگشت به بالا
ديدن مشخصات كاربر ارسال پيغام خصوصي
 

نويسنده
پيغام
lord_akinak
متخصص ساخت بازی
متخصص ساخت بازی


تاريخ عضويت: شنبه 15 ارديبهشت 1386
تعداد ارسالها: 349
محل سكونت: Hell


4 شنبه 23 بهمن 1387 - 21:59
پاسخ بصورت نقل قول
سلام

پستت رو خونده بودم ولی فرصت نشد جواب بدم/ انشالا که تا حالا حلش کردی ، اما ...

تازه منظورت رو از محلی فهمیدم /
در واقع شما Yaw / Pitch / Roll رو میخواید. برای این کار به سه vector احتیاج داری که سه جهت شیت رو مشخص میکنه ( Front , Up , Right )
باید، هر وقت لازم داری جسمت حول محور بالای خودش بچرخه ، Front و Right رو دوران بدی / برای چرخش حول محور روبه رو ( Front ) ، بردار های Right و Up رو دوران میدی و به همین ترتیب برای اون یکی /
از Vec3TransformCoord برای دوران بردارها استفاده کن.

نکات این کار:
این سه بردار بر هم عمودند ، پس اگه جهت 2 رو داشته باشی ، سومی میشه ضرب خارجی 2 تای دیگه ( در هر مرحله بعد از دوران 2 تایی ها باید Cross رو حساب کنی برای این که خود محور جدید بدست بیاد )
در هر مرحله ، باید مطمئن شی بردار ها نرمالیزه هستن.
هر وقت نیاز به رسم شکل شد ، ماتریس local برای دوران از طریق سه بردار بدست میاد ( باید با ترتیب خاصی توی یه ماترسی 3x3 بچینیشون ) ، نتیجه رو میشه برای دوران های بعدی ( حول محور جهان ) استفاده کرد ....

توضیحات من خیلی کلی هستن ، توی google سرچ کن : Roll Yaw Pitch تا Sample code پیدا کنی ،
اگر جایی رو مشکل داشتی همینجا مطرح کن ...

موفق و پیروز!

_________________
And hell was so cold
All the vases are so broken
And the roses tear our hands all open
Mother mary miscarry
But we pray just like insects
The world is so ugly now
ارسال  بازگشت به بالا
ديدن مشخصات كاربر ارسال پيغام خصوصي ديدن وب سايت كاربر نام كاربري در پيغامگير Yahoo
 

نمايش نامه هاي ارسال شده قبلي:   
ارسال يك موضوع جديد   پاسخ به يك موضوع    صفحه 1 از 1 تمام ساعات و تاريخها بر حسب 3.5+ ساعت گرينويچ مي باشد


 
پرش به:  


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


unity3d

بازگردانی به فارسی : علی کسایی @ توسعه مجازی کادوس 2004-2011
Powered by phpBB © 2001, 2011 phpBB Group
| Home | عضويت | ليست اعضا | گروه هاي كاربران | جستجو | راهنماي اين انجمن | Log In |