PDA

View Full Version : چيزي شبيه اتوكد!!!



saed2006
یک شنبه 07 شهریور 1389, 10:26 صبح
سلام بر علماي اعلام و مراجع عظام بخش بازي
من يكسري ترسيم با استفده از دايركت انجام دادم و ميخوام پن و زوم رو براش بسازم
براي عمل پن:
پن يعني جابه جايي از يك نقطه به نقطه ديگر
يعني جابه جايي به اندازه نقطه اي كه ويل موس فشار داده شده تا نقطه اي كه ويل موس برداشته شده
ولي مشكل اينه كه حاصل تفريق ان دو نقطه بر يك دستگاه مختصات هست و ترسيم ها دستگاه مختصات ديگر
يعني چي؟
يعني اينكه اندازه خطي با طول 1 داخل محيطي كه ترسيم انجام شده با اندازه خطي با طول يك روي پنل فرم هم خواني ندارد
يعني تو ميزني يك ميليمتر جابه جا بشه اما 1 كيلومتر جابه جا ميشه
چگونه مشكل رو حل كنم؟
و مشكل ديگه اينكه وقتي زوم انجام ميدم يا بهتر بگم scale انجام ميدم اين scale نسبت به مركز مختصات انجام ميشه براي انكه نسبت به نقطه اي كه موس قرار داره scale انجام بشه چه كار بايد بكنم؟

saed2006
یک شنبه 07 شهریور 1389, 11:01 صبح
من كد برنامه رو ميزارم تا به كمك هم كاملش كنيم

khorzu
یک شنبه 07 شهریور 1389, 12:42 عصر
شما یه کلاس دوربین انعطاف پذیر بنویس همه مشکلات حل می شه :

http://www.gamedev.net/reference/articles/article2160.asp
http://www.gamedev.net/community/forums/topic.asp?topic_id=303090
http://www.gamedev.net/community/forums/topic.asp?topic_id=566508
http://www.gamedev.net/community/forums/topic.asp?topic_id=456102
http://www.gamedev.net/community/forums/topic.asp?topic_id=322299
http://www.riemers.net/eng/Tutorials/XNA/Csharp/Series4/Mouse_camera.php

kochol
یک شنبه 07 شهریور 1389, 12:48 عصر
اول بگو که می خوای سیستم مختصاتت 2 بعدی باشه یعنی هر پیکسل واقعا یه پیکسل باشه.

saed2006
یک شنبه 07 شهریور 1389, 12:52 عصر
اول بگو که می خوای سیستم مختصاتت 2 بعدی باشه یعنی هر پیکسل واقعا یه پیکسل باشه.

منظورت اينه كه اينو
device.Transform.Projection = device.Transform.World;
تغير بدم؟

kochol
یک شنبه 07 شهریور 1389, 12:56 عصر
اونو که باید تغییر بدی
منظورم اینه که بگی یه خط از پیکسل 100و100 بکش به 600و300 یعنی پیکسلی باشه یه چیزی که سر در بیاری البته باز هم می شه زوم و پن کرد

saed2006
یک شنبه 07 شهریور 1389, 12:58 عصر
اينو نگاه كنيد اخرين تغيرات روش اعمال شده

saed2006
یک شنبه 07 شهریور 1389, 12:59 عصر
اونو که باید تغییر بدی
منظورم اینه که بگی یه خط از پیکسل 100و100 بکش به 600و300 یعنی پیکسلی باشه یه چیزی که سر در بیاری البته باز هم می شه زوم و پن کرد

براي پيكسلي كردن دقيقا از چه دستوري استفاده كنم؟

kochol
یک شنبه 07 شهریور 1389, 14:33 عصر
دستور که نه ماتریس projection باید این طوری باشه


m_m2D._11 = (float)2/(m_iWidth);
m_m2D._22 = (float)2/(-m_iHeight);
m_m2D._12 = m_m2D._13 = m_m2D._14 = m_m2D._21 = m_m2D._23 = m_m2D._24 =
m_m2D._31 = m_m2D._32 = m_m2D._34 = m_m2D._43 = 0.0f;
m_m2D._41 = -1.0f;
m_m2D._44 = m_m2D._33 = m_m2D._42 = 1.0f;

SeganX
یک شنبه 07 شهریور 1389, 15:45 عصر
خوب خیلی بستگی به این داره که چه محیطی رو در ذهن داشته باشی. یعنی می خوای چطور زوم و پنی داشته باشی. برای این دو عمل چندین راه وجود داره:
برای زوم:
اگر ماتریس Projection که ساختی از نوع Perspective هستش می تونی به گفته آقای سید اف FOV رو تغییر بدی و یا خود دوربین رو عقب و جلو کنی.
آگر ماتریس Projection از نوع Ortho باشه برای زوم می تونی width و height رو با حفظ نسبتشون تغییر بدی.

برای پن دو تا راه به ذهن من میرسه که بسته به کاری که می خوای انجام بدی می تونی یکی رو انتخاب کنی:
اگر سیستمی همچون اتوکد می خوای بهتر که بعداز اینکه ماترسی View رو ساختی مولفه های
41 و 42 که رو به عنوان x و y جابجا کنی. این کار جابجایی perpixel بهت میده.
اگر سیستم پنی همچون مکس و مایا می خوای باید این کارا رو کنی:
فرض کن با جابجایی ماوس روی صفحه دو بعدی از (x1, y1) به (x2, y2) یه بردار سه بعدی بسازیم که مولفه z رو هم 0 در نظر بگیریم. اسم این بردار را V میذاریم.
حالا باید ماتریس View رو بگیری بعد معکوسش کنی. بعد بردار V رو در ماتریس معکوس view ضرب یا همون transform می کنی.
حالا بردار V که transform شده رو به مختصات دوربینت (خودش و تارگتش) در فضای سه بعدی اضافه کن و صحنه رو رسم کنی.

امیدوارم کارت راه بیافته.

saed2006
دوشنبه 08 شهریور 1389, 10:43 صبح
براي ضرب posation موس و معكوس ماتريس از چه متدي استفاده كنم؟