ورود

View Full Version : یک سوال در مورد حرکت سه بعدی اجسام با DX9



seyedVB
یک شنبه 31 شهریور 1387, 05:28 صبح
به نام خدا .
سلام
فرض کنید ما یک ماشین داریم ، من می خوام تو همون جهت که می چرخه حرکت کنه . من
یه کد نوشتم ولی موندم چرا کار نمیکنه ، چرا حول yz بردار
up می چرخه ؟

http://parkhidpage.googlepages.com/arrows.jpg


حالا به کد من یک نگاه بندازین لطفا :


Vector3 up = new Vector3(0,1,0)
if(keycode == 37) // left key
{
radian -=0.06f;
up.TransformCordinate(Matrix.Translation(car.posit ion)); //car position==CarX,Y,Z
matRot = Matrix.RotationAxis(up,radian);
}
if(keycode == 39) //right key
{
radian +=0.06f;
up.TransformCordinate(Matrix.Translation(car.posit ion)); //car position==CarX,Y,Z
matRot = Matrix.RotationAxis(up,radian);
}
if(keycode == 38) //up key
{
car.position.z +=2f;
wrlMat = Matrix.Translation(position);
device.Transform.World = wrlMat * matRot;
}
.
.
.

hserver
دوشنبه 01 مهر 1387, 18:29 عصر
Private Function UpdateMainCHRMatrix()
Dim matTEMP As D3DMATRIX
D3DXMatrixIdentity MyCharacterr.Matrix
D3DXMatrixIdentity matTEMP
If MyCharacterr.ViewAngle > 360 Then MyCharacterr.ViewAngle = MyCharacterr.ViewAngle - 360
If MyCharacterr.ViewAngle < 0 Then MyCharacterr.ViewAngle = MyCharacterr.ViewAngle + 360

D3DXMatrixRotationY matTEMP, MyCharacterr.ViewAngle * (pi / 180)
D3DXMatrixTranslation MyCharacterr.Matrix, MyCharacterr.x, -10, MyCharacterr.y
D3DXMatrixMultiply MyCharacterr.Matrix, matTEMP, MyCharacterr.Matrix

D3DXMatrixIdentity matTEMP
D3DXMatrixScaling matTEMP, 25, 25, 25
D3DXMatrixMultiply MyCharacterr.Matrix, matTEMP, MyCharacterr.Matrix
End Function





Public Type Characterr
x As Single
y As Single
ViewAngle As Single
Matrix As D3DMATRIX
DoCheckInput As Boolean
End Type

حله؟
خودت دیگه manage شدشو بنویس

seyedVB
دوشنبه 01 مهر 1387, 18:43 عصر
سلام .
این Viewangle با input کیبورد تغییر می کنه دیگه ؟ ....

seyedVB
دوشنبه 01 مهر 1387, 18:46 عصر
ولی انگار تو manage شدش ایراد داره .. منم همینو نوشتم

seyedVB
دوشنبه 01 مهر 1387, 18:50 عصر
اینم کد من :

Matrix rot = Matrix.RotationY(ang);
Matrix tra = Matrix.Translation(pos);
dev.Transform.World = rot * tra;

hserver
دوشنبه 01 مهر 1387, 21:38 عصر
آره دیگه از 0 تا 360 درجه
مشکلش چیه درست انتقال نمیده؟ یا اصلا نمیبینیش؟
راستی همه ی ماتریسات باید indentity قبلش باشن ها(آرایه های قطر اصلی 1 باشه بقیه 0)
dev.Transform.World = tra * rot;
اینجوریش هم امتحان کن
اگه نشد تجربه میگه مشکل تو دستوراتت نیست جای دیگست!

seyedVB
دوشنبه 01 مهر 1387, 23:32 عصر
مایکروسافت می خواسته directx رو به دایرکت ایکس Manage برای C شارپ تبدیل کنه . خرابکاری کرده ::

رفته برای سی شارپ یک چیزی به ایم xna درست کرده . فکر کنم این باشه . چون این باگه توی pixel shader ها هم وجود داره

hserver
سه شنبه 02 مهر 1387, 19:25 عصر
خرابکاری کرده
آره بابا اینکاره نیستن طفلی ها!!!
با اعتماد به نفست خیلی حال میکنم!
به جای مقصر دونستن platform و زمین و زمان انگشتتو بکون تو دماغت یه کم روش کار کن
اگه نشد بکون تو اون یکی سوراخ بینیت سورس کد زیاده تو ....


Private Sub SetupMatrices()
' For our world matrix, we will just leave it as the identity
Dim tmat As Matrix
'device.Transform.World = Matrix.RotationY(Environment.TickCount / 1000.0F)
tmat = Matrix.RotationY(Environment.TickCount / 1000.0F)
device.Transform.World = tmat * Matrix.Translation(New Vector3(0.0F, 0, -1.0F))


زد به سرم چک کنم
درست کار میکنه
sample واسه c# هم کم نیست

hserver
سه شنبه 02 مهر 1387, 19:41 عصر
دینگ!
فهمیدم مشکلت چیه من چقدر خنگ شدم!:بامزه:

به جای


car.position.z +=2f;بذار


car.position.z = car.position.z + (R * Sin((TargetAngle) / (180 / 3.1415926535)))
car.position.x = car.position.x + (R * Cos((TargetAngle) / (180 / 3.1415926535)))

seyedVB
چهارشنبه 03 مهر 1387, 17:28 عصر
ممنون ، ایول

seyedVB
پنج شنبه 04 مهر 1387, 15:47 عصر
شما در تجزیه بردار اشتباه کوچکی داشتید که من اصلاحش می کنم و کدو درست می کنم :
http://parkhidpage.googlepages.com/Vecs.jpg


z += 50 * (float)Math.Cos(ang) * (float)Math.PI / 180;
x += 50 * (float)Math.Sin(ang) * (float)Math.PI / 180;
pos = new Vector3(x, 0, z);