mouse pick...التقاط مجسم في الفضاء الثلاثي الابعاد .. من الشاشه بواسطه الفاره
صفحة 1 من اصل 1 • شاطر
mouse pick...التقاط مجسم في الفضاء الثلاثي الابعاد .. من الشاشه بواسطه الفاره
السلام عليكم وررحمه الله واللصلاه والسلام على سيد االخلق
التقاط المجسمات للتعديل عليها او تحجيمها وتحريكها داخل الفضاء نمر بمرحلتين
المرحله 1 ايجاد احداثيات الفاره او موقعها على الشاشه.......الاحداثيات للفاره التي نحصل عليها باجرائئات الفورم ...ليست هي المطلوبه ....مثلا لديك عرض الشاشه في جهازك 1024...768.....فان احداثيات الفاره على الفورم الذي يمثل نافذه الفضاء ..على محور اكس لا تتجاوز 1024 وعلى محور يا لا تتجاوز 768
يوجد طريقتتين للحصول على احداثيات الفاره ..بالاستعمال كائن المدخلات DirectInput8 لدايركت اكس........او استعمال دوال الابي
المرحله 2 الاحداثيات الفاره التي تحصلنا عليها نحولها الى احداثيات في الفضاء الثلاثي الابعاد وبذالك نعرف متى تكون فوق اللمجسم المراد اللعب عليه
لنبدا اللعب
سنستعمل داله ابي لايجاد احداثيات الفاره على الشاشه''لانها ابسط من كائن DirectInput8
هذه هي الداله
''' ''''''
Private Type POINTAPI
x As Long
y As Long
End Type
Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
Private Declare Function ScreenToClient Lib "user32" (ByVal hWnd As Long, _
lpPoint As POINTAPI) As Long
''''''''
Function Mouse_X_Y(Optional ByVal screen_or_hWnd As Long) As D3DVECTOR2
'If kDirect3DDevice8 Is Nothing Then Exit Function
'Function MouseY(Optional ByVal hWnd As Long) As Long
Dim lpPoint As POINTAPI
GetCursorPos lpPoint
If screen_or_hWnd Then ScreenToClient kD3DPRESENT_PARAMETERS.hDeviceWindow, lpPoint
Mouse_X_Y.x = lpPoint.x
Mouse_X_Y.y = lpPoint.y
End Function
هكذا تقوم باستدعاء الداله 1 Mouse_X_Y
حيث 1 تعني ان الداله ترجع لنا موقع الفاره على شاشه الفضاء الثلاثي الابعاد في حالتي هو kD3DPRESENT_PARAMETERS.hDeviceWindow
اما اذا استدعيت الداله هكذا --0 Mouse_X_Y فانها ترجع موقع الفاره على شاشه الكمبيوتر ولييس نافذه الفضاء الثلاثي الابعاد
غدا سنكمل الشرح وكيف تحول موقع مجسم في الفضاء الى احداثيات في الشاشه ....والعكس صحيح كيف تحول موقع الفاره الى احداثيات في الفضاء الثلاثي الابعاد
عدنا...................
اولا تستدعي داله D3DXVec3Unproject تقوم باعطائنا موقع الفاره في الفضاء الثلاثي الابعاد بالاعتماد على موقها في الشاشه
اذا اردت موقع مجسم ما على الشاشه تستعمل داله عكسيه D3DXVec3project
ثانيا استدعاء داله D3DX8.Intersect للمجسم لمعرفه اي وجه واي نقطه الفاره فوقها
لتحويل موقع الفاره على الشاشه الى احداثيات في الفضاء الثلاثي الابعاد نقوم بالتالي
حيث vIn هي احداثيات الفاره في الفضاء الثلاثي التي نبحث عنها..وهي قيمه ترجعها الداله
vNear هي احداثيات الفاره على الشاشه(نعطيها للداله وليس قيمه ترجعها) لكن vNear.z=0
vFar هي احداثيات الفاره على الشاشه(نعطيها للداله وليس قيمه ترجعها) لكن vNear.z=1
vDir هي اتجاه او direction
bHit قيمه ترجعها الداله (1 اذا كانت الفاره فوق المجسم)
Viewport الفيو الحالي المعتمد
Dim vIn As D3DVECTOR, vNear As D3DVECTOR, vFar As D3DVECTOR
Dim vDir As D3DVECTOR ', bHit As Boolean, i As Long
Dim Viewport As D3DVIEWPORT8
kDirect3DDevice8.GetViewport Viewport
kDirect3DDevice8.GetTransform D3DTS_PROJECTION, matProj
kDirect3DDevice8.GetTransform D3DTS_VIEW, Matview
kDirect3DDevice8.GetTransform D3DTS_WORLD, MatWorld
vIn.X = X موقع الفاره على الشاشه
vIn.Y = Y
'Compute point on Near Clip plane at cursor
vIn.z = 0
داله تحويل احداثيات الفاره في الشاشه..الى احداثيات في العالم الثلاثي ..للحصول على قيمه vNear
D3DXVec3Unproject vNear, vIn, Viewport, matProj, Matview, MatWorld
'compute point on far clip plane at cursor
vIn.z = 1
داله تحويل احداثيات الفاره في الشاشه..الى احداثيات في العالم الثلاثي...للحصول على قيمه vFar
D3DXVec3Unproject vFar, vIn, Viewport, matProj, Matview, MatWorld
'Comput direction vector
الحصول على قيمه vDir او الاتجاه
D3DXVec3Subtract vDir, vFar, vNear
بعض الاعلانات عن متغيرت يرجعها لنا داله Intersect
Dim retHit As Long, retFaceIndex As Long, retU As Single, retV As Single, retDist As Single
اخيراا اذا كانت الفاره فوق المجسم retHit=1...حيث D3DX هو كائن المجسم
D3DX.Intersect mesh, vNear, vDir, retHit, retFaceIndex, retU, retV, retDist, 0
المثال هنا.........
https://ahl-dz.yoo7.com/t167-topic#205
التقاط المجسمات للتعديل عليها او تحجيمها وتحريكها داخل الفضاء نمر بمرحلتين
المرحله 1 ايجاد احداثيات الفاره او موقعها على الشاشه.......الاحداثيات للفاره التي نحصل عليها باجرائئات الفورم ...ليست هي المطلوبه ....مثلا لديك عرض الشاشه في جهازك 1024...768.....فان احداثيات الفاره على الفورم الذي يمثل نافذه الفضاء ..على محور اكس لا تتجاوز 1024 وعلى محور يا لا تتجاوز 768
يوجد طريقتتين للحصول على احداثيات الفاره ..بالاستعمال كائن المدخلات DirectInput8 لدايركت اكس........او استعمال دوال الابي
المرحله 2 الاحداثيات الفاره التي تحصلنا عليها نحولها الى احداثيات في الفضاء الثلاثي الابعاد وبذالك نعرف متى تكون فوق اللمجسم المراد اللعب عليه
لنبدا اللعب
سنستعمل داله ابي لايجاد احداثيات الفاره على الشاشه''لانها ابسط من كائن DirectInput8
هذه هي الداله
''' ''''''
Private Type POINTAPI
x As Long
y As Long
End Type
Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
Private Declare Function ScreenToClient Lib "user32" (ByVal hWnd As Long, _
lpPoint As POINTAPI) As Long
''''''''
Function Mouse_X_Y(Optional ByVal screen_or_hWnd As Long) As D3DVECTOR2
'If kDirect3DDevice8 Is Nothing Then Exit Function
'Function MouseY(Optional ByVal hWnd As Long) As Long
Dim lpPoint As POINTAPI
GetCursorPos lpPoint
If screen_or_hWnd Then ScreenToClient kD3DPRESENT_PARAMETERS.hDeviceWindow, lpPoint
Mouse_X_Y.x = lpPoint.x
Mouse_X_Y.y = lpPoint.y
End Function
هكذا تقوم باستدعاء الداله 1 Mouse_X_Y
حيث 1 تعني ان الداله ترجع لنا موقع الفاره على شاشه الفضاء الثلاثي الابعاد في حالتي هو kD3DPRESENT_PARAMETERS.hDeviceWindow
اما اذا استدعيت الداله هكذا --0 Mouse_X_Y فانها ترجع موقع الفاره على شاشه الكمبيوتر ولييس نافذه الفضاء الثلاثي الابعاد
غدا سنكمل الشرح وكيف تحول موقع مجسم في الفضاء الى احداثيات في الشاشه ....والعكس صحيح كيف تحول موقع الفاره الى احداثيات في الفضاء الثلاثي الابعاد
عدنا...................
اولا تستدعي داله D3DXVec3Unproject تقوم باعطائنا موقع الفاره في الفضاء الثلاثي الابعاد بالاعتماد على موقها في الشاشه
اذا اردت موقع مجسم ما على الشاشه تستعمل داله عكسيه D3DXVec3project
ثانيا استدعاء داله D3DX8.Intersect للمجسم لمعرفه اي وجه واي نقطه الفاره فوقها
لتحويل موقع الفاره على الشاشه الى احداثيات في الفضاء الثلاثي الابعاد نقوم بالتالي
حيث vIn هي احداثيات الفاره في الفضاء الثلاثي التي نبحث عنها..وهي قيمه ترجعها الداله
vNear هي احداثيات الفاره على الشاشه(نعطيها للداله وليس قيمه ترجعها) لكن vNear.z=0
vFar هي احداثيات الفاره على الشاشه(نعطيها للداله وليس قيمه ترجعها) لكن vNear.z=1
vDir هي اتجاه او direction
bHit قيمه ترجعها الداله (1 اذا كانت الفاره فوق المجسم)
Viewport الفيو الحالي المعتمد
Dim vIn As D3DVECTOR, vNear As D3DVECTOR, vFar As D3DVECTOR
Dim vDir As D3DVECTOR ', bHit As Boolean, i As Long
Dim Viewport As D3DVIEWPORT8
kDirect3DDevice8.GetViewport Viewport
kDirect3DDevice8.GetTransform D3DTS_PROJECTION, matProj
kDirect3DDevice8.GetTransform D3DTS_VIEW, Matview
kDirect3DDevice8.GetTransform D3DTS_WORLD, MatWorld
vIn.X = X موقع الفاره على الشاشه
vIn.Y = Y
'Compute point on Near Clip plane at cursor
vIn.z = 0
داله تحويل احداثيات الفاره في الشاشه..الى احداثيات في العالم الثلاثي ..للحصول على قيمه vNear
D3DXVec3Unproject vNear, vIn, Viewport, matProj, Matview, MatWorld
'compute point on far clip plane at cursor
vIn.z = 1
داله تحويل احداثيات الفاره في الشاشه..الى احداثيات في العالم الثلاثي...للحصول على قيمه vFar
D3DXVec3Unproject vFar, vIn, Viewport, matProj, Matview, MatWorld
'Comput direction vector
الحصول على قيمه vDir او الاتجاه
D3DXVec3Subtract vDir, vFar, vNear
بعض الاعلانات عن متغيرت يرجعها لنا داله Intersect
Dim retHit As Long, retFaceIndex As Long, retU As Single, retV As Single, retDist As Single
اخيراا اذا كانت الفاره فوق المجسم retHit=1...حيث D3DX هو كائن المجسم
D3DX.Intersect mesh, vNear, vDir, retHit, retFaceIndex, retU, retV, retDist, 0
المثال هنا.........
https://ahl-dz.yoo7.com/t167-topic#205
vb6 الى vb20- عضو
- عدد المساهمات : 10
نقاط : 32
تاريخ التسجيل : 11/10/2016
الموقع : ahl-dz.yoo7.com/f28-montada
صفحة 1 من اصل 1
صلاحيات هذا المنتدى:
لاتستطيع الرد على المواضيع في هذا المنتدى