Перемещение в точку, где был клик

Работа с 2D и 3D графикой, видео, звуком.

Модератор: Mikle

RADIST(vb2ar23)
Новичок
Новичок
Аватара пользователя
 
Сообщения: 46
Зарегистрирован: 28.04.2005 (Чт) 14:06

Перемещение в точку, где был клик

Сообщение RADIST(vb2ar23) » 04.05.2005 (Ср) 18:51

А давайте поговорим как реализовать перемещение объекта в ту точку, где был клик сделан. У меня были соображения, но если только оси x и y перпендикулярны осям манитора. Но у меня камера урутится по оси Х. Как быть не знаю. У кого какие идеи будут???

Yurich
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 675
Зарегистрирован: 05.03.2003 (Ср) 3:43
Откуда: DONBASS/Gorlovka

Сообщение Yurich » 05.05.2005 (Чт) 1:08

Лёгко
http://bbs.vbstreets.ru/viewtopic.php?t=12302
Function ViewportPickEx
- Какой треугольник не подвластен законам геометрии?
- У которого все углы тупые!

RADIST(vb2ar23)
Новичок
Новичок
Аватара пользователя
 
Сообщения: 46
Зарегистрирован: 28.04.2005 (Чт) 14:06

Сообщение RADIST(vb2ar23) » 05.05.2005 (Чт) 16:42

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


отлично! но вот маленький воросик. Она значит мне вектор говорит, координаты U и V. Так? А что дальше мне с ними делать, что-то до меня не сильно доходит. Подскажите plzzzz :roll:

Yurich
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 675
Зарегистрирован: 05.03.2003 (Ср) 3:43
Откуда: DONBASS/Gorlovka

Сообщение Yurich » 06.05.2005 (Пт) 1:14

RADIST(vb2ar23) писал(а):отлично! но вот маленький воросик. Она значит мне вектор говорит, координаты U и V. Так? А что дальше мне с ними делать, что-то до меня не сильно доходит. Подскажите plzzzz :roll:

Нет, в данной ситуации тебя должен интересовать только vDir - вектор (x,y,z) луча. Он тебе даст точку перемещения модели.
Mesh_Intersect используется для проверки пересечения этого луча с мешем - на этой основе можно реализовать проверку столкновений.
- Какой треугольник не подвластен законам геометрии?
- У которого все углы тупые!

RADIST(vb2ar23)
Новичок
Новичок
Аватара пользователя
 
Сообщения: 46
Зарегистрирован: 28.04.2005 (Чт) 14:06

Сообщение RADIST(vb2ar23) » 06.05.2005 (Пт) 12:15

Ай... Спасибо в любом случае, но что-то я еще больше с этим запутался. Yurich, помоги еще немного пожалуйста. Я так понял вектор уже в чистом виде получается, и ничего там ненадо преобразовывать. Но никак не могу совладать со всем. Я так понял(а понимал я это незнаю как):
ViewportPickEx ProjMatrix, CameraMatrix, px, py
CameraMatrix - это то, что именуется матрица вида,которая определяет то, откуда и под каким углом мы смотрим на мир. И мне нужно вместо нее свою дописать (иначе вообще одни нули получаются). Но цифри в таком случае просто дикие какие-то(к примеру 800,-900,100-вообщем не то). Так вот, Yurich, отец и советник всех directX-еров VB, помоги пожалуйста. Я понимаю что это элементарно, но не для меня, запутался я в этих матрицах. plzzzz!!!

d3drm
Астролог
Астролог
Аватара пользователя
 
Сообщения: 2873
Зарегистрирован: 29.05.2002 (Ср) 23:34
Откуда: МаСКвА

Сообщение d3drm » 06.05.2005 (Пт) 14:58

RADIST(vb2ar23), по-моему все проще чем ты думаешь:

ProjMatrix - это
Код: Выделить всё
Device.GetTransform PROJECTION,  ProjMatrix


а CameraMatrix- это
Код: Выделить всё
Device.GetTransform VIEW,  CameraMatrix
ХЎ

RADIST(vb2ar23)
Новичок
Новичок
Аватара пользователя
 
Сообщения: 46
Зарегистрирован: 28.04.2005 (Чт) 14:06

Сообщение RADIST(vb2ar23) » 06.05.2005 (Пт) 18:25

d3drm, как ты говоришь
D3DDevice.GetTransform D3DTS_VIEW, CameraMatrix

я так уже делал. Но это впрочем тоже, что и я там присваивал. Не помагает. Дело такое: координаты даются за сотню, когда у меня мешь, по которому кликаю вообще 50, находится на Y=0, а показывается что-то около -800!!!! . :roll: . ДА и ко всему, когда я камеру поворачиваю, и кликаю в то место, где кликал в прежнем положении камеры, координаты совсем другие,абсолютно нет связи. Вообщем я не знаю. Подмогите а? Я уж и не знаю что там еще поизменять.Тупик!!!!!

d3drm
Астролог
Астролог
Аватара пользователя
 
Сообщения: 2873
Зарегистрирован: 29.05.2002 (Ср) 23:34
Откуда: МаСКвА

Сообщение d3drm » 06.05.2005 (Пт) 18:36

повесь свою программу сюда
ХЎ

RADIST(vb2ar23)
Новичок
Новичок
Аватара пользователя
 
Сообщения: 46
Зарегистрирован: 28.04.2005 (Чт) 14:06

Сообщение RADIST(vb2ar23) » 06.05.2005 (Пт) 22:05

Значит ничего менять особо не стал в названиях моделей. Ставте свои. Там где "plan.x" соответственно просто плоскость. Файл с анимацией тоже любой. Много лишнего кода, но это так. Вообщем все просто. Но я в тупике. :!:
У вас нет доступа для просмотра вложений в этом сообщении.

d3drm
Астролог
Астролог
Аватара пользователя
 
Сообщения: 2873
Зарегистрирован: 29.05.2002 (Ср) 23:34
Откуда: МаСКвА

Сообщение d3drm » 06.05.2005 (Пт) 22:25

я бы посмотрел, но так как нет медиа файлов этого делать не буду. свое искать сейчас - только время тратить.
ХЎ

Yurich
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 675
Зарегистрирован: 05.03.2003 (Ср) 3:43
Откуда: DONBASS/Gorlovka

Сообщение Yurich » 07.05.2005 (Сб) 2:06

Это похоже на правду
Код: Выделить всё
  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

источник:
http://www.visualbasicforum.com/t40966.html
- Какой треугольник не подвластен законам геометрии?
- У которого все углы тупые!

RADIST(vb2ar23)
Новичок
Новичок
Аватара пользователя
 
Сообщения: 46
Зарегистрирован: 28.04.2005 (Чт) 14:06

Сообщение RADIST(vb2ar23) » 07.05.2005 (Сб) 20:36

Yurich! Очередной раз респект. Спасибо огромное. Все кул. Я рад. Спасибо всем. Особенно Yurich. Так заканчивать надо, а то уж флуд начинается.
ЗЫ Еще раз спасибо Yurich!Респо


Вернуться в Мультимедиа

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 31

    TopList