Заказать игровой сервер Контакты (заказать плагин/исправить ошибки/другое) Пожертвовать Поиск

[ вход ]
[ последние сообщения ]

  • Страница 1 из 1
  • 1
Получение нормали к поверхности
tonline_kms65 Дата: Понедельник, 17.07.2017, 18:31:09 | Сообщение # 1
Сообщений: 215
Репутация: 3 [ +/- ]
Всем привет. Появился такой вопрос - в чем измеряется значение нормали полученное TR_GetPlaneNormal ?

Для понятности сделал видео, синий луч показывает какое место измеряется.
По центру экрана вывел значение нормали. Понятно что 1.000000 это перпендикуляр (т.е. 90 градусов)
Так вот вопрос - в чем измеряются эти значения? Это радианы? Или градусы? Или еще что то? Как понять эти значения?

ЮТУБ
https://youtu.be/6PrUtfTToQo

Вот так может быть будет понятнее:


Если судить по таблице Брадиса http://mozgan.ru/Table/TableBradis, то похоже что это значения - синус угла.

Добавлено (17.07.2017, 18:31:09)
---------------------------------------------
Всё, разобрался.
Все просто. На всякий случай нужно еще потестировать, но уже видно что все ОК. Выдает значение - синус угла.

Цитата
  GetVectorAngles(f_norm, f_angles);                //здесь конвертирую полученный вектор в угол
это не нужно.


Сообщение отредактировал tonline_kms65 - Понедельник, 17.07.2017, 22:58:43
 
Nail Дата: Среда, 19.07.2017, 20:43:42 | Сообщение # 2
Сообщений: 38
Репутация: 8 [ +/- ]
GetVectorAngles передает управление в SDK mathlib.cpp

Код
void VectorAngles( const float *forward, float *angles )
{
    Assert( s_bMathlibInitialized );
    float    tmp, yaw, pitch;
    
    if (forward[1] == 0 && forward[0] == 0)
    {
  yaw = 0;
  if (forward[2] > 0)
   pitch = 270;
  else
   pitch = 90;
    }
    else
    {
  yaw = (atan2(forward[1], forward[0]) * 180 / M_PI);
  if (yaw < 0)
   yaw += 360;

  tmp = sqrt (forward[0]*forward[0] + forward[1]*forward[1]);
  pitch = (atan2(-forward[2], tmp) * 180 / M_PI);
  if (pitch < 0)
   pitch += 360;
    }
    
    angles[0] = pitch;
    angles[1] = yaw;
    angles[2] = 0; //roll
}

получается 2 угла по осям x и y, вращение по z всегда 0.
https://ru.wikipedia.org/wiki/Полярная_система_координат

т.к. радианы = градусы * Пи/180, то выходит что результирующие углы заданы в градусах


Сообщение отредактировал Nail - Среда, 19.07.2017, 20:44:23
 
tonline_kms65 Дата: Среда, 26.07.2017, 04:22:39 | Сообщение # 3
Сообщений: 215
Репутация: 3 [ +/- ]
Видео сделал.
Получаю угол к треугольнику поверхности по след. формуле:
Код
RadToDeg(ArcSine(fNorm[2]))


Ютуб
https://youtu.be/vcN91jg_T6Y

Если смотреть визуально - вроде все верно. А вот как бы на 100% убедиться.

Цитата Nail ()
GetVectorAngles передает управление в SDK mathlib.cpp

Я же написал уже - это не нужно. Это моя ошибка была.

Цитата
TR_GetPlaneNormal(INVALID_HANDLE, f_norm); // получаю вектор

Получаю вектор, и из значения вектора по координате Z получаю синус угла, и из синуса угол по формуле. Так наверно вернее будет.
Судя по всему эта функция выдает значение скалярного произведения вектора положения треугольника и вектора от ENT до этого треугольника.
Но я повторюсь - возможно я и ошибаюсь. Смущает 3 координаты вектора, из них я беру только одну(Z)
Хотя визуально - все четко соответствует.

Мне это нужно будет в будущем, когда например двигаю по земле какую-то ENT и нужно что бы она не залезала в холм а перекатывалась по нему в соответствии с углом этого холма. Это как один из примеров применения.
Само значение угла не нужно, оно мне сейчас нужно что бы визуально видеть соответствие. Быстрее будет сравнивать по синусу.


Сообщение отредактировал tonline_kms65 - Среда, 26.07.2017, 04:51:19
 
  • Страница 1 из 1
  • 1
Поиск: