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





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

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

مشکل با DirectX 9
نويسنده
پيغام
mahdi13
در حال رشد
در حال رشد


تاريخ عضويت: 2 شنبه 4 آبان 1388
تعداد ارسالها: 37


2 شنبه 15 شهريور 1389 - 14:47
پاسخ بصورت نقل قول
سلام دوستان،
یک برانامه نوشتم که توش یه مکعب می چرخه. ولی وقتی رندرش می کنم وجه هاش شبیه مستطیل در می آد. ولی وقتی صفحه رو می کشم و صفحه برنامه رو مربع می کنم شکل من هم درست میشه(مربع میشه). من برنامه ام رو با رزولوشن 600*800 رندر می کنم و می خواهم برنامه ام با همون رزولوشن هم درست کار کنه.
امیدوارم منظورم رو فهمیده باشین!

این هم ماتیس projection منه:

كد:
   D3DXMATRIX proj;

   D3DXMatrixPerspectiveFovLH(&proj, D3DX_PI*0.5, width / height, 1, 1000);
   device->SetTransform(D3DTS_PROJECTION, &proj);


DirectX9 و C++

عکسش در حالت معمولی(ببینید مستطیله!):
ارسال  بازگشت به بالا
ديدن مشخصات كاربر ارسال پيغام خصوصي نام كاربري در پيغامگير Yahoo
 

نويسنده
پيغام
Xhizors
مدیر انجمن
مدیر انجمن


تاريخ عضويت: 1 شنبه 19 ارديبهشت 1389
تعداد ارسالها: 251
محل سكونت: 127.0.0.1


2 شنبه 15 شهريور 1389 - 14:59
پاسخ بصورت نقل قول
با int winMain تابع اصلی برنامه رو شروع کردی؟ باید پنجره رو رجیستر کنی. اگه از visual cpp استفاده می‌کنی کدهای رجیستر تو فایل win test هست.
اما پیش‌نهاد می‌کنم تابع اصلی برنامه رو با void main یا int main شروع کن.

نقل قول:
عکسش در حالت معمولی(ببینید مستطیله!):

ثابت کن این شکل مستطیله. اصلن چرا دایره نباشه؟
ارسال  بازگشت به بالا
ديدن مشخصات كاربر ارسال پيغام خصوصي ارسال ايميل ديدن وب سايت كاربر
 

نويسنده
پيغام
mahdi13
در حال رشد
در حال رشد


تاريخ عضويت: 2 شنبه 4 آبان 1388
تعداد ارسالها: 37


2 شنبه 15 شهريور 1389 - 15:30
پاسخ بصورت نقل قول
Xhizors نوشته:
با int winMain تابع اصلی برنامه رو شروع کردی؟ باید پنجره رو رجیستر کنی. اگه از visual cpp استفاده می‌کنی کدهای رجیستر تو فایل win test هست.
اما پیش‌نهاد می‌کنم تابع اصلی برنامه رو با void main یا int main شروع کن.


شروع کردم، تازه رجیستر هم کردم.

نقل قول:

ثابت کن این شکل مستطیله. اصلن چرا دایره نباشه؟

اصلا هرچی شما بگی! مشکل من اینه که چرا وقلی در حال اجرا ابعاد صفحه رو عوض می کنم، ابعاد شکل من هم عوض میشه؟

_________________
ارسال  بازگشت به بالا
ديدن مشخصات كاربر ارسال پيغام خصوصي نام كاربري در پيغامگير Yahoo
 

نويسنده
پيغام
Xhizors
مدیر انجمن
مدیر انجمن


تاريخ عضويت: 1 شنبه 19 ارديبهشت 1389
تعداد ارسالها: 251
محل سكونت: 127.0.0.1


2 شنبه 15 شهريور 1389 - 15:57
پاسخ بصورت نقل قول
نمی‌دونم . اگه ویندوز رو رجیستر کردی دیگه مشکلی نباید باشه. شاید به خاطر ویندوز ویستاست.
ارسال  بازگشت به بالا
ديدن مشخصات كاربر ارسال پيغام خصوصي ارسال ايميل ديدن وب سايت كاربر
 

نويسنده
پيغام
mahdi13
در حال رشد
در حال رشد


تاريخ عضويت: 2 شنبه 4 آبان 1388
تعداد ارسالها: 37


3 شنبه 16 شهريور 1389 - 01:32
پاسخ بصورت نقل قول
فکر کنم Lاتریس projection ام ایراد داره...

_________________
ارسال  بازگشت به بالا
ديدن مشخصات كاربر ارسال پيغام خصوصي نام كاربري در پيغامگير Yahoo
 

نويسنده
پيغام
كنجكاو
مدیر پروژه
مدیر پروژه


تاريخ عضويت: 1 شنبه 29 شهريور 1383
تعداد ارسالها: 174
محل سكونت: نپتون-زمين


3 شنبه 16 شهريور 1389 - 03:46
پاسخ بصورت نقل قول
mahdi13,
من این تاپیک رو بصورت اتفاقی دیدم... راستش سوالتون رو واضح نپرسیدید و کدی که گذاشتید کمک چندانی به حل مشکلتون نمی کنه چون کدی که گذاشتید عملا در Compile time خطایی رو نشون نداده، پس حدس من بر اینه که شما مرتکب یک Logical error در برنامه تون شدید... سعی می کنم با توجه به همون سه خط کد، گفتگویی که رد و بدل شد و حدس های تجربی بهتون کمک کنم... امیدارم مشکلتون حل بشه Surprised

فکر نمی کنم ایراد از Projection Matrix باشه

حدس اول: اینکه مقادیری که وارد height و width کردید اشتباها جابجا گرفته و set شده باشن...
احتمال وقوع: 10% اما از یه برنامه نویس خسته بعید نیست
دلیل: Aspect ratio بر حسب تقسیم طول افقی viewport (یا window) بر طول عمودی اون بدست میاد و کد شما هم بظاهر درسته پس یکی از حدس ها اینه که مقادیر height و width اشتباها بالعکس set شده باشن!
راه حل: چک کردن و تصحیح دستورات مربوطه... Mad


حدس دوم: یکی از خطاهای منطقی (Logical error) بسیار متداول در برنامه نویسی... تقسیم عدد صحیح بر عدد صحیح مقدار صحیحی را باز می گرداند! int/int -> int
احتمال وقوع: 90-80% اما ممکن اشتباه کرده باشم!
دلیل 1: حدس تجربی اینکه احتمالا height و width متغیرهایی از نوع int هستن و اینکه نتیجه تقسیم int بر int یه مقدار از جنس int میشه! و اینکه شما توی کد مستقیم width رو تقسیم بر height کردید.
دلیل 2: از تصویر و فرمایش خود شما اینطور بر میاد که اگه پنجره مربع باشه تصویر به درستی render میشه و نسبت ها هم درست هستند... پس aspect ratio شما یه احتمال قوی باید 1 بوده باشه که تصویر اینطور stretch شده!
نتیجه: اگه فرضیه های بالا درست باشن و برای مثال صفحه شما 800 در 600 باشه پس aspect ratio شما میشه 4:3 یعنی نتیجه تقسیم width بر height باید عدد 1.33333 رو برگردونه و اگه این عدد در یک متغیر int بجای یک متغیر اعشاری مثل float قرار بگیره کامپایلر سی در Visual Studio اون رو از 1.3333 به 1 که یک عدد صحیحه تبدیل می کنه و در نتیجه شما بجای اینکه aspect ratio رو برابر 1.3333 در تابع D3DXMatrixPerspectiveFovLH قرار بدید اون رو برابر 1 قرار دادید! و نتیجه این شده که در تصویر می بینید... Wink
راه حل: اگه میخواید سریع تست کنید عدد 1.3333 رو در تابع D3DXMatrixPerspectiveFovLH بنویسید... اگه خواستید به همون روش ادامه بدید یه f بعد از متغیرتون در تقسیم قرار بدید... اینکار باعث میشه یه عدد اعشاری برگردونده بشه... Arrow

اگر هم می خواید تصویر با تغییر اندازه صفحه نسبت viewport تون هم عوض شه دو راه دارید یا device رو reset کنید (توصیه نمیشه... مخصوصا اگه resource هاتون unmanaged هستد و با D3DPOOL_MANAGED ساخته نشدن) راه دوم اینه که از دستور SetViewport استفاده کنید.

كد:
RECT windowRect;
GetWindowRect( window,  &windowRect );

D3DVIEWPORT9 viewport;

viewport.X      = 0;
viewport.Y      = 0;
viewport.Width  = windowRect.right;
viewport.Height = windowRect.bottom;
viewport.MinZ   = 0.0f;
viewport.MaxZ   = 1.0f;

g_pd3dDevice->SetViewport(&viewport);


در کل توصیه نمیشه به کاربر اجازه داده بشه که بتونه سایز پنجره رو خارج از نسبت های متعارف (4:3، 16:9 یا 16:10) تغییر بده مگر اینکه دارید یه ادیتور مینویسید یا کلا برنامه خارج از این نسبت هاست... توصیه میشه size پنجره fix و غیر قابل تغییر باشه...


- موفق باشید.

_________________
!Sometimes it is difficult to recognize the difference between worthless glass and priceless diamonds, specially about human beings
None of you humans seem to understand! I'm not logged in here with you! YOU'RE LOGGED IN HERE WITH ME
ارسال  بازگشت به بالا
ديدن مشخصات كاربر ارسال پيغام خصوصي ارسال ايميل نام كاربري در پيغامگير Yahoo
 

حل شد!
نويسنده
پيغام
mahdi13
در حال رشد
در حال رشد


تاريخ عضويت: 2 شنبه 4 آبان 1388
تعداد ارسالها: 37


3 شنبه 16 شهريور 1389 - 15:43
پاسخ بصورت نقل قول
ممنونم، مورد دوم صحیح بود! تقسیم دو int بر هم. Smile
من تازه C++ یاد گرفتم، این چیزاش رو نمی دونستم! ولی اگه آخرش f میزاشتم درست نمیشد. اینطوری اش کردم درست شد:

كد:


D3DXMatrixPerspectiveFovLH(&proj, D3DX_PI*0.5, float(width) / float(height), 1, 1000);


_________________
ارسال  بازگشت به بالا
ديدن مشخصات كاربر ارسال پيغام خصوصي نام كاربري در پيغامگير Yahoo
 

نويسنده
پيغام
كنجكاو
مدیر پروژه
مدیر پروژه


تاريخ عضويت: 1 شنبه 29 شهريور 1383
تعداد ارسالها: 174
محل سكونت: نپتون-زمين


4 شنبه 17 شهريور 1389 - 01:53
پاسخ بصورت نقل قول
اوه، بله، type casting، بهتر این بود...

دم صبح بود دیگه!

- موفق باشید.

_________________
!Sometimes it is difficult to recognize the difference between worthless glass and priceless diamonds, specially about human beings
None of you humans seem to understand! I'm not logged in here with you! YOU'RE LOGGED IN HERE WITH ME
ارسال  بازگشت به بالا
ديدن مشخصات كاربر ارسال پيغام خصوصي ارسال ايميل نام كاربري در پيغامگير Yahoo
 

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


 
پرش به:  


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


unity3d

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