منتديات أهل الجزائر
هل تريد التفاعل مع هذه المساهمة؟ كل ما عليك هو إنشاء حساب جديد ببضع خطوات أو تسجيل الدخول للمتابعة.

mouse pick...التقاط مجسم في الفضاء الثلاثي الابعاد .. من الشاشه بواسطه الفاره

استعرض الموضوع التالي استعرض الموضوع السابق اذهب الى الأسفل

mouse pick...التقاط مجسم في الفضاء الثلاثي الابعاد .. من الشاشه بواسطه الفاره Empty mouse pick...التقاط مجسم في الفضاء الثلاثي الابعاد .. من الشاشه بواسطه الفاره

مُساهمة  vb6 الى vb20 الثلاثاء نوفمبر 22, 2016 5:30 am

السلام عليكم وررحمه الله واللصلاه والسلام على سيد االخلق

التقاط المجسمات للتعديل عليها او تحجيمها وتحريكها داخل الفضاء  نمر بمرحلتين
المرحله   1 Arrow Arrow  ايجاد احداثيات  الفاره او موقعها على الشاشه.......الاحداثيات للفاره التي نحصل عليها باجرائئات الفورم  ...ليست هي المطلوبه ....مثلا لديك عرض الشاشه في جهازك  1024...768.....فان احداثيات الفاره على الفورم الذي يمثل نافذه الفضاء ..على محور اكس لا تتجاوز 1024 وعلى محور يا لا تتجاوز 768
يوجد طريقتتين للحصول على احداثيات الفاره  ..بالاستعمال كائن المدخلات  DirectInput8  لدايركت اكس........او استعمال دوال الابي
المرحله  2 What a Face  Like a Star @ heaven  الاحداثيات الفاره  التي تحصلنا عليها نحولها الى احداثيات في الفضاء الثلاثي الابعاد وبذالك نعرف متى تكون فوق اللمجسم المراد اللعب عليه

لنبدا اللعب affraid affraid 
سنستعمل داله ابي لايجاد احداثيات الفاره على الشاشه''لانها ابسط من كائن 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   للمجسم لمعرفه اي وجه واي نقطه الفاره فوقها

لتحويل موقع الفاره على الشاشه الى احداثيات في الفضاء الثلاثي الابعاد  نقوم بالتالي cyclops
حيث 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
vb6 الى vb20
عضو
عضو

عدد المساهمات : 10
نقاط : 32
تاريخ التسجيل : 11/10/2016
الموقع : ahl-dz.yoo7.com/f28-montada

الرجوع الى أعلى الصفحة اذهب الى الأسفل

استعرض الموضوع التالي استعرض الموضوع السابق الرجوع الى أعلى الصفحة

- مواضيع مماثلة

صلاحيات هذا المنتدى:
لاتستطيع الرد على المواضيع في هذا المنتدى