Работа с Axis/Angle

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

Модератор: Mikle

DODge
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 126
Зарегистрирован: 30.07.2006 (Вс) 0:25
Откуда: Нижний Новгород

Работа с Axis/Angle

Сообщение DODge » 15.04.2014 (Вт) 12:45

Добрый день!

Недавно к своему фреймворку (или как принято называть, движку) прикрутил самопальную физику, всё как положено - матрицы, кватернионы... Вследствие чего, углы Эйлера, которые раньше задавали ориентацию объектов, стали бесполезны ввиду своей несовершенности (Gimbal Lock). Теперь же за это отвечает дуэт из вектора направления Axis и угла вращения Angle. В теории вроде бы всё понятно, но на практике возникают трудности.

К примеру, если предположить что Axis = (0, 1, 0), т.е. вектор направления совпадает с вертикальной осью координат, то Angle представляет собой Yaw Rotating - объект вращается, грубо говоря, влево-вправо. Если же Axis совпадает с одной из горизонтальных осей, то вращение будет происходить вокруг них.

А теперь к самой проблеме, если выбрать произвольный вектор направления, то управление вращением становится затруднительным, т.к. по сути своей Axis - это как вес в вершине меша для анимации персонажа, т.е. чем выше значение в X, Y или Z, тем больше Angle влияет на вращение вокруг этих осей. Как вот с таким поведением ориентировать объекты в сцене?

Для бóльшего понимания представляю вам псевдокод:
Public Sub SetOrientation(ByVal Axis As Vector3, ByVal Angle As Single)
Dim quat As Quaternion = Quaternion.RotationAxis(Axis, Angle)
Weapon.matWorld = Matrix.RotationQuaternion(quat)
End Sub
Последний раз редактировалось DODge 17.04.2014 (Чт) 9:54, всего редактировалось 1 раз.
CPU = Intel Core i5 6500 @ 3.2 GHz
VGA = GeForce GTX 650Ti 2Gb
RAM = 8 ГБ DDR4 @ 2133 MHz
OS = Windows 10 Pro 64-bit
IDE = Microsoft Visual Studio Community 2017 (Visual Basic.NET)
GAPI = SharpDX 9 + 12

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

Re: Работа с Axis/Angle

Сообщение Mikle » 16.04.2014 (Ср) 18:21

Честно говоря, проблема непонятна. Каковы исходные данные, из которых нужно получить Axis и Angle?

DODge
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 126
Зарегистрирован: 30.07.2006 (Вс) 0:25
Откуда: Нижний Новгород

Re: Работа с Axis/Angle

Сообщение DODge » 16.04.2014 (Ср) 19:38

Ну вот представь вид от первого лица, держим в руках оружие. И вот захотелось посмотреть чуть левее и выше. С Эйлером всё понятно, а как быть с этими двумя? Т.е. какие конкретно значения нужно передать в выше указанную функцию чтобы "точно навести ствол на врага" ?
CPU = Intel Core i5 6500 @ 3.2 GHz
VGA = GeForce GTX 650Ti 2Gb
RAM = 8 ГБ DDR4 @ 2133 MHz
OS = Windows 10 Pro 64-bit
IDE = Microsoft Visual Studio Community 2017 (Visual Basic.NET)
GAPI = SharpDX 9 + 12

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

Re: Работа с Axis/Angle

Сообщение Mikle » 17.04.2014 (Чт) 9:05

Если вид от первого лица, то, чтобы сменить направление взгляда, нужно менять не matWorld , а matView. Кроме того, эта процедура задаёт ориентацию, но ещё нужна позиция.
Я храню для позиции игрока (камеры) это:
Код: Выделить всё
Public CamPos As D3DVECTOR
Public CamAngle As Single ' Угол поворота вправо-влево (вокруг оси Y)
Public CamDiff As Single ' Угол наклона вперёд-назад (вокруг локальной для игрока оси X)

Установка камеры:
Код: Выделить всё
  SinA = Sin(CamAngle)
  CosA = Cos(CamAngle)
  SinD = Sin(CamDiff)
  CosD = Cos(CamDiff)
  MatrixLookAtLH Mtrx, CamPos, Vec3(CamPos.x + SinA * CosD, CamPos.y + SinD, CamPos.z + CosA * CosD), Vec3(0, 1, 0)
  Dev.SetTransform D3DTS_VIEW, Mtrx

Для шутера от первого лица - вполне достаточно, Gimbal Lock не происходит.

DODge
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 126
Зарегистрирован: 30.07.2006 (Вс) 0:25
Откуда: Нижний Новгород

Re: Работа с Axis/Angle

Сообщение DODge » 17.04.2014 (Чт) 9:53

Я очень извиняюсь, но я действительно дал мало информации, и наверное даже неверно продемонстрировал код. Сейчас всё поправлю....

Поле "matWorld" в моём случае это мировая матрица объекта (в данном случае оружия), а не камеры. Твой пример абсолютно понятен, и взяв его к примеру за основу, тогда такой вопрос:
Имея значения от камеры, нужно повернуть на соответствующий угол модельку оружия, т.е. как раз получается CamAngle и CamDiff преобразовать в Axis и Angle.
CPU = Intel Core i5 6500 @ 3.2 GHz
VGA = GeForce GTX 650Ti 2Gb
RAM = 8 ГБ DDR4 @ 2133 MHz
OS = Windows 10 Pro 64-bit
IDE = Microsoft Visual Studio Community 2017 (Visual Basic.NET)
GAPI = SharpDX 9 + 12

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

Re: Работа с Axis/Angle

Сообщение Mikle » 17.04.2014 (Чт) 20:45

Axis и Angle мало для задания произвольного положения модели. Эти величины не содержат перемещения, ими можно задать только произвольный поворот вокруг произвольной оси, то есть, пока ГГ стоит в точке (0, 0, 0), вращение задать можно, но стоит переместиться - уже не выйдет, нужно ещё домножать на соответствующую матрицу перемещения. Но это всё не нужно, это делается проще из уже вычисленной матрицы MatView:
Код: Выделить всё
  Dim Mtrx As D3DMATRIX

  MatrixInverse Mtrx, 0, MatView
  Dev.SetTransform D3DTS_WORLD, Mtrx
  MatrixTranslation Mtrx, 1, -1, 3 ' Это позиция оружия относительно игрока, правее на 1, ниже на -1, вперёд на 3.
  Dev.MultiplyTransform D3DTS_WORLD, Mtrx

DODge
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 126
Зарегистрирован: 30.07.2006 (Вс) 0:25
Откуда: Нижний Новгород

Re: Работа с Axis/Angle

Сообщение DODge » 17.04.2014 (Чт) 21:10

Я, естественно, понимаю что они не содержат перемещения, мне оно и не нужно. Именно только произвольный поворот вокруг произвольной оси...

В общем, я разобрался с этой ситуацией благодаря сайту EuclideanSpace - Mathematics and Computing. Благо там есть абсолютно все конвертации из одной систем описания положений в другие.
Mikle, тебе отдельная благодарность за активную помощь в моей проблеме. Спасибо!
CPU = Intel Core i5 6500 @ 3.2 GHz
VGA = GeForce GTX 650Ti 2Gb
RAM = 8 ГБ DDR4 @ 2133 MHz
OS = Windows 10 Pro 64-bit
IDE = Microsoft Visual Studio Community 2017 (Visual Basic.NET)
GAPI = SharpDX 9 + 12


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

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

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

    TopList