Программирование игр, создание игрового движка, OpenGL, DirectX, физика, форум
GameDev.ru / Программирование / Форум / Углы Эйлера -> QUATERNION -> Углы Эйлера

Углы Эйлера -> QUATERNION -> Углы Эйлера

Поделиться
spion_007Постоялецwww26 сен. 200810:15#0
Всем добрый день.

В сцене использую для расчета вращения объектов кватернионы. Для сохранения сцены в файл необходимо преобразовать кватернион в углы эйлера, а при загрузке сцены из файла получить тот же кватернион. В сети нахожу различные алгоритмы преобразования, вот только кватернионы до и после преобразований получаются разными. Вернее для получения углов из кватерниона использую D3DXQuaternionRotationYawPitchRoll, а вот для обратного преобразования ищу адекватный алгоритм.

Заранее спасибо

0r@ngEПостоялецwww26 сен. 200811:12#1
spion_007
смотрим в DooM3 SDK и видим:
idQuat idAngles::ToQuat( void ) const {
  float sx, cx, sy, cy, sz, cz;
  float sxcy, cxcy, sxsy, cxsy;

  idMath::SinCos( DEG2RAD( yaw ) * 0.5f, sz, cz );
  idMath::SinCos( DEG2RAD( pitch ) * 0.5f, sy, cy );
  idMath::SinCos( DEG2RAD( roll ) * 0.5f, sx, cx );

  sxcy = sx * cy;
  cxcy = cx * cy;
  sxsy = sx * sy;
  cxsy = cx * sy;

  return idQuat( cxsy*sz - sxcy*cz, -cxsy*cz - sxcy*sz, sxsy*cz - cxcy*sz, cxcy*cz + sxsy*sz );
}

а обратно через матрицу

idAngles idQuat::ToAngles( void ) const {
  return ToMat3().ToAngles();
}

HolyDelПостоялецwww26 сен. 200813:15#2
0r@ngE
>смотрим в DooM3 SDK и видим:
а оно разве есть в открытом доступе?

и еще - зачем нужен const после обявления ф-ии?
idAngles idQuat::ToAngles( void ) const

Правка: 26 сен. 2008 13:15

Удалёнwww26 сен. 200813:23#3
HolyDel
> а оно разве есть в открытом доступе?
Да.

> и еще - зачем нужен const после обявления ф-ии?
> idAngles idQuat::ToAngles( void ) const
Внутри функции, объявленной как const, this будет указателем на константу.

Alex_MIPTПостоялецwww26 сен. 200813:43#4
Nighthunter
>>Внутри функции, объявленной как const, this будет указателем на константу.

Говори проще :)
Внутри функции, объявленной как const, нельзя изменять поля класса.

Удалёнwww26 сен. 200813:50#5
alex19921992
> Внутри функции, объявленной как const, нельзя изменять поля класса.
:)
Контрпример:
class SuperMegaArchiClass
{
public:
  SuperMegaArchiClass();

  void Increase() const;

private:
  mutable int value;
};

SuperMegaArchiClass::SuperMegaArchiClass()
{
  value = 0;
}

void SuperMegaArchiClass::Increase() const
{
  value++;
}
Alex_MIPTПостоялецwww26 сен. 200813:57#6
о_о просвяти что такое mutable
Удалёнwww26 сен. 200814:04#7
alex19921992
mutable переменная может быть изменена в любой функции класса (т. е. не зависит от const).

Правка: 26 сен. 2008 14:04

HolyDelПостоялецwww26 сен. 200814:10#8
Nighthunter, пасип


alex19921992, для меня
>Внутри функции, объявленной как const, this будет указателем на константу.
понятней и однозначней.

Lion007Постоялецwww26 сен. 200815:18#9
HolyDel
если понятней - то внутри ф-ии объявленой как const нельзя (то есть компилятор ругаецца) менять поля объекта без извращений.
mutable - это стандартное извращение, которое объявляет поле, как "это поле можно менять для const-объектов".
нестандартное изврашение -
TheClass * pThis = (TheClass*)this;
pThis->m_someData = ...

> праффко
нестандартное извращение не гарантирует правильного результата. дело в том, что когда метод объявлен как const, компилятор все non-mutable поля счиатет константой. и имеет полное право их кэшировать - например в регистре. изменение поля через нестандартное извращение он может и не отследить. и при последующем использовании значения этого поля нет никакой гарантии, что будет использовано именно *измененное* значение, а не то, что было закэшировно на регистре

Правка: 26 сен. 2008 15:23

MousПостоялецwww27 сен. 20081:04#10
Психи :)

Зачем менять поля, объявленные как константы? Или зачем объявлять их константами, а потом изменять...
имхо, это криво и может только запутать.
Сейчас научите человека - тоже будет извращаться :)

/ Форум / Программирование игр / Графика

2001—2014 © GameDev.ru — Разработка игр