KDima писал(а):Yurich писал(а):D3DX8.Intersect
И что?
Как это должно помочь?
Dim Mesh As D3DXMesh
Dim ProjMatrix As D3DMATRIX
Dim CameraMatrix As D3DMATRIX
Private Sub Form1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
Dim px As Single
Dim py As Single
D3DDevice.GetTransform D3DTS_PROJECTION, ProjMatrix
px = Int(X / Screen.TwipsPerPixelX)
py = Int(Y / Screen.TwipsPerPixelY)
ViewportPickEx ProjMatrix, CameraMatrix, px, py
End Sub
Function ViewportPickEx(ProjMatrix As D3DMATRIX, CameraMatrix As D3DMATRIX, X As Single, Y As Single) As Boolean
Dim Cursor As D3DVECTOR, vNear As D3DVECTOR
Dim vFar As D3DVECTOR, vDir As D3DVECTOR
Dim Mtemp As D3DMATRIX
Dim Viewport As D3DVIEWPORT8
D3Ddevice. GetTransform D3DTS_WORLD, Mtemp
D3DDevice.GetViewport Viewport
'!!! Здесь можно попробовать использовать к-ты камеры
Cursor.X = X: Cursor.Y = Y: Cursor.z = 0
' Вычислить вектор точки в плоскости курсора
D3DXVec3Unproject vNear, Cursor, Viewport, ProjMatrix, CameraMatrix, Mtemp
' Вычислить вектор точки в глубине
Cursor.z = 1
D3DXVec3Unproject vFar, Cursor, Viewport, ProjMatrix, CameraMatrix, Mtemp
' Вычислить вектор направления луча
D3DXVec3Subtract vDir, vFar, vNear
ViewportPickEx=Mesh_Intersect(vNear, vDir)
Function Mesh_Intersect(RayPos As D3DVECTOR, RayDir As D3DVECTOR) As Boolean
Dim RetHit As Long ' устанавливается в 1 если луч пересекает полигон меша
Dim RetU As Single ' U - координата попадания
Dim RetV As Single ' V - координата попадания
Dim RetDist As Single ' расстояние от источника луча до точки пересечения с
' ближайшим полигоном меша
Dim RetFaceIndex as Long ' индекс пересекаемого полигона
Dim CountHits As Long ' количество пересечений полигонов
If Mesh Is Nothing Then Exit Function
' проверка пересечения
Call D3DX.Intersect(Mesh, RayPos, RayDir, RetHit, RetFaceIndex, RetU, RetV, RetDist, CountHits)
If RetHit Then Mesh_Intersect = True
End Function