ورود

View Full Version : گرفتن مختصات همانجا كه كاربر اشاره ميكند!!!!



saed2006
دوشنبه 08 شهریور 1389, 14:59 عصر
سلام
با دايركت ترسيم هايي انجام دادم
ميخوام وقتي كاربر با موس روي صفحه ترسيم رفت مختصات اون نقطه داخل صفحه مختصات بيرون بياد
روش كار چيست؟

ایمان مدائنی
دوشنبه 08 شهریور 1389, 15:05 عصر
دوست عزيز دقيقا من نمونه همين چيزي رو كه مي خواهي تو نمونه برنامه هاي كوچك و مفيد ديدم سرچ كن پيدا ميكني

mahdi1373
دوشنبه 08 شهریور 1389, 15:08 عصر
باید از direct input استفاده کنید.
directx sdk مثال های خوبی در این زمینه داره. به اون ها رجوع کنید.

SeganX
دوشنبه 08 شهریور 1389, 15:09 عصر
http://www.toymaker.info/Games/html/picking.html

saed2006
دوشنبه 08 شهریور 1389, 15:14 عصر
00000000000000000000

saed2006
سه شنبه 09 شهریور 1389, 10:08 صبح
http://www.toymaker.info/Games/html/picking.html

با توجه به مقاله من اينو نوشتم:


private Vector3 GetCurrentPosation()
{Vector3 v=new Vector3();
v.X = (((2.0f * Cursor.Position.X) /presentParams.BackBufferWidth) - 1) / Get2dMatrix().M11;
v.Y = -(((2.0f * Cursor.Position.Y) / presentParams.BackBufferHeight) - 1) / Get2dMatrix().M22;
v.Z = 1.0f;
Matrix m = Matrix.Invert(Get2dMatrix());
Vector3 rayDir;Vector3 rayOrigin;
rayDir.X = v.X * m.M11 + v.Y * m.M21 + v.Z* m.M31;
rayDir.Y = v.X * m.M12 + v.X * m.M22 + v.Z* m.M32;
rayDir.Z = v.X * m.M13 + v.Y * m.M23 + v.Z * m.M33;
rayOrigin.X = m.M41;
rayOrigin.Y= m.M42;
rayOrigin.Z = m.M43;
return rayDir;
}





مشكلش كجاست كه جواب نميده

kochol
سه شنبه 09 شهریور 1389, 12:41 عصر
مشکلت اینجاست که باید ماتریس view رو inverse کنی نه projection رو

saed2006
سه شنبه 09 شهریور 1389, 12:51 عصر
private Vector3 GetCurrentPosation()
{
Vector3 v = new Vector3();
v.X = (((2.0f * Cursor.Position.X) / presentParams.BackBufferWidth) - 1) / Get2dMatrix().M11;
v.Y = -(((2.0f * Cursor.Position.Y) / presentParams.BackBufferHeight) - 1) / Get2dMatrix().M22;
v.Z = 1.0f;
Matrix m = Matrix.Invert(device.Transform.View);
Vector3 rayDir; Vector3 rayOrigin;
rayDir.X = v.X * m.M11 + v.Y * m.M21 + v.Z * m.M31;
rayDir.Y = v.X * m.M12 + v.X * m.M22 + v.Z * m.M32;
rayDir.Z = v.X * m.M13 + v.Y * m.M23 + v.Z * m.M33;
rayOrigin.X = m.M41;
rayOrigin.Y = m.M42;
rayOrigin.Z = m.M43;
return rayDir;
}



اصلاحش كردم بهتر شد
اما باز بعضي نقاط رو اشتباه نشون ميده

kochol
سه شنبه 09 شهریور 1389, 13:37 عصر
یه چیزی هست به اسم دیباگ DEBUG
من اگه جای تو بودم برنامه نویسی رو کلا بی خیال می شدم

kochol
سه شنبه 09 شهریور 1389, 15:51 عصر
خیلی پور رویی

kochol
سه شنبه 16 شهریور 1389, 19:18 عصر
یه کد جدید که اجرا بشه بزار یه نگاه بهش بندازم

saed2006
چهارشنبه 24 شهریور 1389, 09:17 صبح
باید از direct input استفاده کنید.
directx sdk مثال های خوبی در این زمینه داره. به اون ها رجوع کنید.

ميشه بيشتر توضيح بدين
--------------------

یه کد جدید که اجرا بشه بزار یه نگاه بهش بندازم

كد توي كامپيوتر من اجرا ميشه چه خطايي ميده؟

kochol
چهارشنبه 24 شهریور 1389, 16:51 عصر
سلام
تو سیستمت 2D هست پیکینگت راحت تر از این حرف هاست
یه x و y داری برای پن و یه ضریب زوم داری
جایی که کاربر کلیک کرده
posx = (mouse.x - x) * zoom
posy = (mouse.y - y) * zoom
ببین کار می کنه

saed2006
جمعه 26 شهریور 1389, 13:54 عصر
سلام
تو سیستمت 2D هست پیکینگت راحت تر از این حرف هاست
یه x و y داری برای پن و یه ضریب زوم داری
جایی که کاربر کلیک کرده
posx = (mouse.x - x) * zoom
posy = (mouse.y - y) * zoom
ببین کار می کنه

نخير جواب نميده راه ديگه اي نداره؟

mahdi1373
جمعه 26 شهریور 1389, 19:06 عصر
اینا رو ببین:

saed2006
پنج شنبه 01 مهر 1389, 09:25 صبح
ممنون
حل شد/
ولي يه چيز جال اينكه فرم مينيمايز كه ميشه خطا ميده
نگاه كنيد به پرو‍‍زه دليلش چيه؟

syntiberium
پنج شنبه 01 مهر 1389, 10:21 صبح
وقتی فرم مینی مایز می شه حتما نباید رندر صورت بگیره و اگر بگیره ارور می ده .

saed2006
پنج شنبه 01 مهر 1389, 12:48 عصر
خب چجوري بفهمم كه فرم مينيمايز شده و جلوي رندرش رو بگيرم
اخه توي paint رندر انجام ميشه

syntiberium
پنج شنبه 01 مهر 1389, 13:35 عصر
یعنی چی توی paint رندر می شه ؟

saed2006
پنج شنبه 01 مهر 1389, 13:39 عصر
برنامه رو گذاشتم لطفا يك نگاهي بهش بياندازيد

syntiberium
پنج شنبه 01 مهر 1389, 14:18 عصر
ببین اینجوری می شه فهمید که فرم وضعیتش مینی مایزه یا نه ولی این دستور فقط توی فرم اجرا می شه پس توی ایونت paint باید یه جوری تابع زیر را فراخوانی کنی و در صورت 1 بودن متغیر mi از رندر کردن با دستور if جلوگیری کن .



public int mi;

public void mini()
{
if (this.WindowState == FormWindowState.Minimized)
{
mi = 1;
}
else
{
mi = 0;
}
}