Модератор: Mikle
Yurich писал(а):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
Function ViewportPickEx
RADIST(vb2ar23) писал(а):отлично! но вот маленький воросик. Она значит мне вектор говорит, координаты U и V. Так? А что дальше мне с ними делать, что-то до меня не сильно доходит. Подскажите plzzzz
Device.GetTransform PROJECTION, ProjMatrix
Device.GetTransform VIEW, CameraMatrix
D3DDevice.GetTransform D3DTS_VIEW, CameraMatrix
Dim px As Single
Dim py As Single
Dim ProjMatrix As D3DMATRIX
Dim Cursor As D3DVECTOR, vNear As D3DVECTOR, vFar As D3DVECTOR, vDir As D3DVECTOR
Dim Mtemp As D3DMATRIX
Dim Viewport As D3DVIEWPORT8
Dim T As Single, rx As Single, rz As Single
D3DDevice.GetTransform D3DTS_PROJECTION, ProjMatrix
D3DDevice.GetTransform D3DTS_WORLD, Mtemp
px = Int(x / Screen.TwipsPerPixelX)
py = Int(y / Screen.TwipsPerPixelY)
D3DDevice.GetViewport Viewport
Cursor.x = px: Cursor.y = py: Cursor.z = 0
' Вычислить вектор точки в плоскости курсора
D3DXVec3Unproject vNear, Cursor, Viewport, ProjMatrix, CameraMatrix, Mtemp
' Вычислить вектор точки в глубине
Cursor.z = 1
D3DXVec3Unproject vFar, Cursor, Viewport, ProjMatrix, CameraMatrix, Mtemp
' Вычислить вектор направления луча
D3DXVec3Subtract vDir, vNear, vFar
T = (-(vFar.y) / vDir.y)
' результирующие координаты
rx = vFar.x + T * vDir.x
rz = vFar.z + T * vDir.z
Сейчас этот форум просматривают: Google-бот и гости: 11