Перемещение в пространстве

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

Модератор: Mikle

krobab
Новичок
Новичок
 
Сообщения: 30
Зарегистрирован: 08.06.2003 (Вс) 5:34

Перемещение в пространстве

Сообщение krobab » 22.07.2006 (Сб) 22:37

Здравствуйте.
Столкнулся с проблемой, есть координаты x, y и z, есть углы x, y, z, надо переместить камеру(объект) в том направлени куда она смотрит. В основом встречал код только на перемещение в плоских координатах x и y, это мне не нужно. Знаю только то, что надо использовать преобразования с векторами, так как Я раньше выделил код отвечающий за передвижение в примере PointSprites в ДХ сдк ( он лежит в функции FrameMove ), но щас, после поломки диска и отсутсвия времени на программирования, не могу воспроизвести его. Вот и прошу помощи, может тот кто занимался подобным и поможет.

Bonesnapper
Постоялец
Постоялец
 
Сообщения: 434
Зарегистрирован: 12.09.2004 (Вс) 15:39

Сообщение Bonesnapper » 23.07.2006 (Вс) 0:54

что то типа такого



Код: Выделить всё
Public Sub UpdateCam()
    Dim t As Single
    t1 = Timer
    t = (t1 - t2) * CamSpeed
    t2 = t1
    CosA = Cos(Angle)
    SinA = Sin(Angle)
    Cosd = Cos(Diff)
    Sind = Sin(Diff)
    GetCursorPos MousePos

    If KeyDown(203) Then'right
        CamPos.x = CamPos.x - CosA * t
        CamPos.z = CamPos.z - SinA * t
        SetCam
    End If

    If KeyDown(205) Then 'left
        CamPos.x = CamPos.x + CosA * t
        CamPos.z = CamPos.z + SinA * t
         SetCam
    End If

    If KeyDown(208) Then 'down
        CamPos.x = CamPos.x - SinA * t * Cosd
        CamPos.z = CamPos.z + CosA * t * Cosd
        CamPos.y = CamPos.y + Sind * t
        SetCam
    End If

    If KeyDown(200) Then 'up
        CamPos.x = CamPos.x + SinA * t * Cosd
        CamPos.z = CamPos.z - CosA * t * Cosd
        CamPos.y = CamPos.y - Sind * t
       SetCam
    End If

SetCam
   
    GetCursorPos MousePos
    If (MousePos.x <> CenterX) Or (MousePos.y <> CenterY) Then
        Angle = Angle + (MousePos.x - CenterX) * Sens
        Diff = Diff + (MousePos.y - CenterY) * Sens
        If Diff > 1.6 Then Diff = 1.6       'предел
        If Diff < -1.6 Then Diff = -1.6     'наклона
        SetCursorPos CenterX, CenterY
        SetCam
    End If
End Sub

Private Sub SetCam()
  Dim Mtrx As D3DMATRIX
  D3DXMatrixRotationX Mtrx, Diff
  d3dDevice.SetTransform D3DTS_VIEW, Mtrx
  D3DXMatrixRotationY Mtrx, Angle
  d3dDevice.MultiplyTransform D3DTS_VIEW, Mtrx
  D3DXMatrixTranslation Mtrx, -CamPos.x, -CamPos.y, -CamPos.z
  d3dDevice.MultiplyTransform D3DTS_VIEW, Mtrx
 
  D3DXMatrixPerspectiveFovRH Mtrx, PI / 4, 1!, 6!, 63000!
  d3dDevice.SetTransform D3DTS_PROJECTION, Mtrx
End Sub

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 23.07.2006 (Вс) 10:22

И не забудь, что переменные t2 и t1 нужно объявлять на уровне модуля, либо, если в процедуре - делать их Static.
Bonesnapper
А зачем нужен лишний SetCam после KeyDown(200) ?

Bonesnapper
Постоялец
Постоялец
 
Сообщения: 434
Зарегистрирован: 12.09.2004 (Вс) 15:39

Сообщение Bonesnapper » 23.07.2006 (Вс) 11:03

Mikle

да вообщето не нужен
просто я копировал это из проекта
и там до этого этого еще кнопки шли

DirectXManiac
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1543
Зарегистрирован: 03.11.2005 (Чт) 13:32
Откуда: из DirectX SDK

Сообщение DirectXManiac » 23.07.2006 (Вс) 11:40

Bonesnapper, Mikle Не проще сделать просто класс для работы с камерой один раз и юзать его...?
#define ROFL 0xDDDD

Bonesnapper
Постоялец
Постоялец
 
Сообщения: 434
Зарегистрирован: 12.09.2004 (Вс) 15:39

Сообщение Bonesnapper » 23.07.2006 (Вс) 11:51

вообщето он не просил сделать ему класс для работы с камерой :wink:

krobab
Новичок
Новичок
 
Сообщения: 30
Зарегистрирован: 08.06.2003 (Вс) 5:34

Сообщение krobab » 23.07.2006 (Вс) 12:33

to Bonesnapper,DirectXManiac
Я какраз использую класс для камеры, очень даже удобно.
to Bonesnapper
Спасибо завтра пороверю код, но всё таки меня больше интересует перемещение с помощью векторов. У меня к Вам вопрос, а зачем использовать при каждом SetCam
D3DXMatrixPerspectiveFovRH Mtrx, PI / 4, 1!, 6!, 63000!
  d3dDevice.SetTransform D3DTS_PROJECTION, Mtrx?
Ведь можно просто вызвать эту функцию после создания д3д объектов.
И во всех примерах, кроме туториала, эти функции вызываются только один раз в функции RestoreDevice.

DirectXManiac
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1543
Зарегистрирован: 03.11.2005 (Чт) 13:32
Откуда: из DirectX SDK

Сообщение DirectXManiac » 23.07.2006 (Вс) 12:56

krobab
Что значит перемещение с помощью векторов? Там и так всё с помощью векторов... У меня в классе камеры SetPosition,SetRotation задаються вектора и потом при каждом обновлении камеры обновляю матрицы используя эти вектора... Если я не понял правильно объясни что конкретно ты имеешь ввиду с помощью векторов?
ЗЫ Почему 2 сообщение?
#define ROFL 0xDDDD

DirectXManiac
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1543
Зарегистрирован: 03.11.2005 (Чт) 13:32
Откуда: из DirectX SDK

Сообщение DirectXManiac » 23.07.2006 (Вс) 12:58

Bonesnapper
:shock: :shock: :shock: как это можно так извращаться?
D3DXMatrixPerspectiveFovLH Pi/4, 1!,6!,63000!

Зачем тебе сабж? Не проще поставить
D3DXMatrixPerspectiveFovLH Pi/4, 1!,0.1!,10000!
Зачем тебе near plane = 6?
#define ROFL 0xDDDD

krobab
Новичок
Новичок
 
Сообщения: 30
Зарегистрирован: 08.06.2003 (Вс) 5:34

Сообщение krobab » 23.07.2006 (Вс) 13:50

to DirectXManiac
Извеняюсь за 2 поста, то-ли ИЕ покета глючнул, то-ли Я куда-то не туда нажал.
А про перемещение векторами Я имею ввиду операции над ними приводящие к перемещению, vectorAdd и т.д.. Впримере PointSprites, это пример по исользованию частиц, используются эти операции.Один раз Я выделил код от туда, но после поломки диска всё потерялось и теперь никак не могу восстановить этот код. Там вроде ещё использовались квантерионы, но точно сказать не могу.

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 23.07.2006 (Вс) 16:33

krobab
Согласен, этот момент:
Код: Выделить всё
D3DXMatrixPerspectiveFovRH Mtrx, PI / 4, 1!, 6!, 63000!
  d3dDevice.SetTransform D3DTS_PROJECTION, Mtrx?

не нужен здесь.
DirectXManiac
Не пойму, что ты нашел криминального в near plane = 6? Все зависит от размера применяемой геометрии.

DirectXManiac
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1543
Зарегистрирован: 03.11.2005 (Чт) 13:32
Откуда: из DirectX SDK

Сообщение DirectXManiac » 23.07.2006 (Вс) 19:50

krobab
Перемещения камеры и объектов в пространстве осуществляеться с помощью матриц, а векторные преобразования в примере POINTSPRITES испоьзуеться для вычесления направления полёта и гравитации частиц!
Mikle
Какие жеэто должны быть объекты? Вообще nearplane это точки которые видны, должны находиться минимум на этом расстоянии... Я правильно понимаю?
#define ROFL 0xDDDD

DirectXManiac
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1543
Зарегистрирован: 03.11.2005 (Чт) 13:32
Откуда: из DirectX SDK

Сообщение DirectXManiac » 23.07.2006 (Вс) 23:30

krobab
Могу показать свой класс камеры... Если надо...???
УРА!!!! 700 постов
#define ROFL 0xDDDD

Bonesnapper
Постоялец
Постоялец
 
Сообщения: 434
Зарегистрирован: 12.09.2004 (Вс) 15:39

Сообщение Bonesnapper » 24.07.2006 (Пн) 0:39

обькты гдето 30х30х30
с растояния 800 даже при 6 некоторые задние части умудряются вылазить вперед

насчет векторов все функции с ними имеют такой вид так что можешь посмотреть - D3DXvec3....
хотя я заметил что
х.y=х.y+m.y
х.x=х.x+m.x
х.z=х.z+m.z
работает быстрее чем
D3DXvec3add x,x,m

DirectXManiac
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1543
Зарегистрирован: 03.11.2005 (Чт) 13:32
Откуда: из DirectX SDK

Сообщение DirectXManiac » 24.07.2006 (Пн) 0:46

Bonesnapper
Ага... Функцию же надо вызвать из библы, а так напрямую...
#define ROFL 0xDDDD

krobab
Новичок
Новичок
 
Сообщения: 30
Зарегистрирован: 08.06.2003 (Вс) 5:34

Сообщение krobab » 24.07.2006 (Пн) 10:22

DirectXManiac
С удовольствием посмотрелбы на некоторые функции в Вашем классе.

Вы чуть-чуть ошибаетесь, вот Sub`а

Код: Выделить всё
Sub SetCam()
    Dim fSpeed As Single
    Dim fAngularSpeed
   
    fSpeed = 5 * 0.05
    fAngularSpeed = 1 * 0.05

    ' Slowdown the camera movement
    D3DXVec3Scale m_vVelocity, m_vVelocity, 0.9
    m_fYawVelocity = m_fYawVelocity * 0.9
    m_fPitchVelocity = m_fPitchVelocity * 0.9

    ' Process keyboard input
    If (m_bKey(vbKeyRight)) Then m_vVelocity.X = m_vVelocity.X + fSpeed        '  Slide Right
    If (m_bKey(vbKeyLeft)) Then m_vVelocity.X = m_vVelocity.X - fSpeed         '  Slide Left
    If (m_bKey(vbKeyUp)) Then m_vVelocity.Y = m_vVelocity.Y + fSpeed           '  Move up
    If (m_bKey(vbKeyDown)) Then m_vVelocity.Y = m_vVelocity.Y - fSpeed         '  Move down
   
    If (m_bKey(vbKeyW)) Then m_vVelocity.Z = m_vVelocity.Z + fSpeed            '  Move Forward
    If (m_bKey(vbKeyS)) Then m_vVelocity.Z = m_vVelocity.Z - fSpeed            '  Move Backward
   
    If (m_bKey(vbKeyE)) Then
        m_fYawVelocity = m_fYawVelocity + fSpeed          '  Yaw right
    End If
    If (m_bKey(vbKeyQ)) Then
        m_fYawVelocity = m_fYawVelocity - fSpeed          '  Yaw left
    End If
   
    If (m_bKey(vbKeyZ)) Then
        m_fPitchVelocity = m_fPitchVelocity + fSpeed      '  turn down
    End If
    If (m_bKey(vbKeyA)) Then
        m_fPitchVelocity = m_fPitchVelocity - fSpeed      '  turn up
    End If
   
    ' Update the position vector
    Dim vT As D3DVECTOR, vTemp As D3DVECTOR
    D3DXVec3Scale vTemp, m_vVelocity, fSpeed
    D3DXVec3Add vT, vT, vTemp
    D3DXVec3TransformNormal vT, vT, matRoll
    D3DXVec3Add vPos, vPos, vT

    ' Update the yaw-pitch-rotation vector
    AngleY = AngleY + fAngularSpeed * m_fYawVelocity
    AngleX = AngleX + fAngularSpeed * m_fPitchVelocity
    If (AngleX < 0) Then AngleX = 0
    If (AngleX > g_pi / 2) Then AngleX = g_pi / 2

    Dim qR As D3DQUATERNION, det As Single
    D3DXQuaternionRotationYawPitchRoll qR, AngleY, AngleX, 0
    D3DXMatrixAffineTransformation matRoll, 1.25, vec3(0, 0, 0), qR, vPos
    D3DXMatrixInverse matView, det, matRoll
        'set new view matrix
    g_D3DDevice.SetTransform D3DTS_VIEW, matView
End Sub

вставьте его вместо своего сетапа камеры и увидете что этот код даёт полное перемещение в пространстве, если выделить нужный код , тот который после ' Update the position vector, выделить нужные фрагменты кода и сделать отдельную функцию вида MoveCamera( byval Value as single), то можно получить ту функцию которая перемещала-бы камеру в направлении взгляда( куда она смотрит), она также подходит и для объектов. Да кстати есть ещё похожий пример в ДХ СДК с этим кодом, это ScatterGraph, там уже нет частиц.

DirectXManiac
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1543
Зарегистрирован: 03.11.2005 (Чт) 13:32
Откуда: из DirectX SDK

Сообщение DirectXManiac » 24.07.2006 (Пн) 10:30

krobab
Советую посмотреть мой движок! Ты скажи я тебе кину его на мыло! Посмотришь как организован класс камеры... MoveForward и MoveSide это функции двигающие камеру =)
#define ROFL 0xDDDD

Bonesnapper
Постоялец
Постоялец
 
Сообщения: 434
Зарегистрирован: 12.09.2004 (Вс) 15:39

Сообщение Bonesnapper » 24.07.2006 (Пн) 11:42

что то я не пойму зачем перемещать камеру в направлени куда она смотрит
все равно нужно будет указывать ей куда смотреть

да и разве мой код не перемещает камеру в направлении взгляда ?
(принажатии UP)

да и куда ты хочешь двигать объкты то?

krobab
Новичок
Новичок
 
Сообщения: 30
Зарегистрирован: 08.06.2003 (Вс) 5:34

Сообщение krobab » 24.07.2006 (Пн) 12:39

Bonesnapper
да и разве мой код не перемещает камеру в направлении взгляда ?
(принажатии UP)

Ваш пример работает, но например если угол поворота равен 90,180 и270 градусов, то изменяются координаты X и Z вместе, это не то что надо и Я раньше тоже написал примено такойже код после чего отказался от него, да и немного глючит t и t1,t2.

что то я не пойму зачем перемещать камеру в направлени куда она смотрит
все равно нужно будет указывать ей куда смотреть


если прямо указывать координаты надо тогда выщитывать и угол камеры по X и Y, в том примере всё выщитывается векторами и квантерионами и довольно быстро.

да и куда ты хочешь двигать объкты то?


Прямо в том направлении куда она смотрит (камера или предмет), например камера в космосе, летишь так как направлены углы поворота камеры, изменил угол Х на +5 камера изменила направление полёта так как изменился этот угол.

DirectXManiac
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1543
Зарегистрирован: 03.11.2005 (Чт) 13:32
Откуда: из DirectX SDK

Сообщение DirectXManiac » 24.07.2006 (Пн) 13:41

krobab
:lol: :lol: :lol: МЕГАЛОЛ!!!!
Ваш пример работает, но например если угол поворота равен 90,180 и270 градусов, то изменяются координаты X и Z вместе, это не то что надо и Я раньше тоже написал примено такойже код после чего отказался от него, да и немного глючит t и t1,t2.

Вдумайся что ты написал... Как ты сделаешь чтобы объкт перемещался только по одной из осей и двигался в том напрвлении куда смотрит(отновительно угла поворота). Открой учебник геометрии и посмотри систему координат
-------------X
|\
| \
| \
| \
Y Z
#define ROFL 0xDDDD

krobab
Новичок
Новичок
 
Сообщения: 30
Зарегистрирован: 08.06.2003 (Вс) 5:34

Сообщение krobab » 24.07.2006 (Пн) 14:06

Уряяяя :D всё-таки разобрался, но с небольшим изменением.
Вот код. обновлён
Код: Выделить всё

' Установка камеры
Sub CamSetUp()
   Dim qR As D3DQUATERNION, det As Single
   D3DXQuaternionRotationYawPitchRoll qR, vAng.y, vAng.x, vAng.Z
   D3DXMatrixAffineTransformation matOrientation, 1!, vec3(0!, 0!, 0!), qR, vPos
   D3DXMatrixInverse matView, det, matOrientation
   g_D3DDevice.SetTransform D3DTS_VIEW, matView
End Sub
' Перемещение камеры
Sub MoveCamera(ByVal value As Single)
   D3DXVec3Scale m_vVelocity, m_vVelocity, 0!
   m_vVelocity.Z = m_vVelocity.Z + value
    Dim vT As D3DVECTOR, vTemp As D3DVECTOR
    D3DXVec3Add vT, m_vVelocity, vT
    D3DXVec3TransformNormal vT, vT, matOrientation
    D3DXVec3Add vPos, vPos, vT
End Sub

Перемещение работает отлично, на 90-180-270 градусах изменяются только X или Z при соответствующих углах, при изменении угла Z на положение это не влияет. Так-же можно устанавливать координаты напрямую.
Возникает один вопрос к местным ГУРУ, как это всё работает? Возможно-ли оптимизировать код?

DirectXManiac
Я просто неправильно выразился. Например при угле Y=90 (180,270) и X=0 перемещение просиходит как по коодинате Z так и по координате X, чего вообще-то не должно быть.
Последний раз редактировалось krobab 25.07.2006 (Вт) 2:34, всего редактировалось 1 раз.

Bonesnapper
Постоялец
Постоялец
 
Сообщения: 434
Зарегистрирован: 12.09.2004 (Вс) 15:39

Сообщение Bonesnapper » 24.07.2006 (Пн) 15:55

я че та так и не понял что там не так двигается при угле 90 180 270
что камера начинает двигатся не туда куда смотрит ?

как я понял человеку просто нужен был код который
бы управлял камерой не спомощью мыши а с помощьюклавы

и насчет движения обьектов
для того чтобы его двигвть совершенно не надо знать углы
надо просто иметь точку куда его сдвинуть

Прямо в том направлении куда она смотрит (камера или предмет), например камера в космосе, летишь так как направлены углы поворота камеры, изменил угол Х на +5 камера изменила направление полёта так как изменился этот угол.


ну не знаю я за представленным мной кодом ни разу не замечал
сто она летит не туда

зы еще вот что
сначало были известны углы поворота
потом оказалось что их нужно расчитывать

krobab
Новичок
Новичок
 
Сообщения: 30
Зарегистрирован: 08.06.2003 (Вс) 5:34

Сообщение krobab » 24.07.2006 (Пн) 22:10

Bonesnapper
Мне безразлично чем управлять, мне нужен был код перемещения камеры, Ваш пример больше подходит если перемещение происходит по осям Х и Z, Я от него давно отказался. Возможно просто Я опять что-то напутал +), попробуйте отследить значение переменных при перемещении с Y=90(180,270), X=0 и Z=0. Я не отрицаю, что для перемещения надо просто изменить его координаты, но если это, например, человек и за его спиной стена, Вы просто измените его координаты чтоб он оказался рядом с ней, он всё равно будет спиной к стене, тогда Вам придётся его поворачивать. Мне нужна была функция, которая, зная угол поворота, переместил оъект(камеру) в том направлении в которое она смотрит. И углы поворота не надо расчитывать Я их сам задаю.
П.С. тут недавно заметил, что изменение происходит и в моей функции относительно к объекту, но на очень немного на -5 - -7 степень, так что я мог заметить эти изменения, но вроде они были больше 1-2 знака после запятой. Если был не прав зарание извеняюсь.

krobab
Новичок
Новичок
 
Сообщения: 30
Зарегистрирован: 08.06.2003 (Вс) 5:34

Сообщение krobab » 25.07.2006 (Вт) 2:41

Всё доделал код для перемещения объекта.
Вот

Код: Выделить всё

Public Function Render()
    Dim qR As D3DQUATERNION, det As Single
    D3DXMatrixIdentity matMesh
    D3DXQuaternionRotationYawPitchRoll qR, vAng.y, vAng.x, vAng.z
    D3DXMatrixAffineTransformation matOrientation, 1!, vec3(0!, 0!, 0!), qR, vPos
    D3DXMatrixMultiply matMesh, matMesh, matOrientation
    g_D3DDevice.SetTransform D3DTS_WORLD, matMesh
Dim i As Long
    For i = 0 To NumMaterials - 1
        g_D3DDevice.SetMaterial Materials(i)
        g_D3DDevice.SetTexture 0, Textures(i)
        Mesh.DrawSubset i
    Next
End Function
Sub MoveMesh(ByVal value As Single)
   D3DXVec3Scale m_vVelocity, m_vVelocity, 0!
   vVelocity.z = vVelocity.z - value
    Dim vT As D3DVECTOR, vTemp As D3DVECTOR
    D3DXVec3Add vT, vVelocity, vT
    D3DXVec3TransformNormal vT, vT, matOrientation
    D3DXVec3Add vPos, vPos, vT
End Sub

Всем спасибо за помощь.

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 25.07.2006 (Вт) 9:11

krobab
Наконец-то стало понятно, что тебе было нужно - чтобы при движении вперед, наклоняясь, мы начинали двигаться вниз. Я верно понял?

Учитесь правильно задавать вопросы!

krobab
Новичок
Новичок
 
Сообщения: 30
Зарегистрирован: 08.06.2003 (Вс) 5:34

Сообщение krobab » 25.07.2006 (Вт) 12:20

Mikle
Да Вы верно поняли.

Sneaks
Обычный пользователь
Обычный пользователь
 
Сообщения: 67
Зарегистрирован: 29.07.2006 (Сб) 12:08

Сообщение Sneaks » 04.12.2006 (Пн) 0:10

У меня вопрос может не много не по теме но все же:
как сделать свободное врашение (камеры)
Я делая тупо : беру угол и изменяю его значение ,а потом с помошью синуса и косинуса ставлю setOrientation, но 2 координатам все ок а по третей (z) фигня получается
Кто как это делает?


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

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

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

    TopList