HLFX.Ru Forum
Показать все 6 сообщений этой темы на одной странице

HLFX.Ru Forum (https://hlfx.ru/forum/index.php)
- Технические вопросы (https://hlfx.ru/forum/forumdisplay.php?forumid=20)
-- Найти эйлеровы углы по вектору (https://hlfx.ru/forum/showthread.php?threadid=3461)


Отправлено nemyax 07-06-2012 в 16:12:

Найти эйлеровы углы по вектору

Есть трёхмерный вектор. Требуется найти такие углы по X и Y, чтобы Z была параллельна вектору. Помогите гомонитарию, пожалуйста =(


Отправлено XaeroX 07-06-2012 в 16:15:

Не мог бы гомонитарий выразиться яснее? Что значит "Z была параллельна вектору"? К тому же в терминологии углов эйлера лучше оперировать понятиями "вперед, вправо, вверх", а то мало ли что у вас там по оси Z.

__________________

xaerox on Vivino


Отправлено nemyax 07-06-2012 в 16:21:

Известен вектор (X1, Y1, Z1).
Найти такие pitch (по X) и yaw (по Y), чтобы объект в (0, 0, 0) был осью Z направлен в (X1, Y1, Z1). Порядок вращения XYZ.


Отправлено Дядя Миша 07-06-2012 в 17:02:

UTIL_VecToAngles - в любой халфе\кваке.
Но Z будет равен чему угодно. Либо 0 либо 180 на выбор.

Добавлено 07-06-2012 в 21:02:

Цитата:
nemyax писал:
Найти такие pitch (по X) и yaw (по Y)

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

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено nemyax 08-06-2012 в 08:02:

Цитата:
Дядя Миша писал:
UTIL_VecToAngles

Не нашёл иёного определения. Наговнокодил себе такое:
code:
aim_at({X,Y,Z}) -> aim_at(X, Y, Z). aim_at(X, Y, MaybeZ) -> Z = if MaybeZ == 0.0 -> 1.0E-30; true -> MaybeZ end, ToAngles = fun(Rad) -> Rad * 180/math:pi() end, HorizDist = math:sqrt(X*X+Z*Z), Alt = ToAngles(math:atan(Y/HorizDist)), Az = ToAngles(math:atan2(X, Z)), {Az, Alt, 0.0}.

Вроде работает.
Цитата:
Дядя Миша писал:
да нельзя ассоциировать компоненты вектора с углами эйлера

Я и не ассоциирую. Имелось в виду, что тангажырует тут по оси X, а рыскает по Y.
Цитата:
Дядя Миша писал:
Но Z будет равен чему угодно

Мне ноль нужен. По сути надо найти азимут и высоту.


Отправлено Дядя Миша 08-06-2012 в 09:40:

вектор можно сконвертировать только в PITCH и YAW. ROLL вычислить не получится, ибо один вектор не содержит в себе этой информации, увы.
Тут уже три вектора требуется, т.е. система координат.

Цитата:
nemyax писал:
Не нашёл иёного определения

Ужосы. А это что:
C++ Source Code:
1
void VectorAngles( const float *forward, float *angles )
2
{
3
  float	tmp, yaw, pitch;
4
 
5
  if( !forward || !angles )
6
  {
7
    if( angles ) VectorClear( angles );
8
    return;
9
  }
10
 
11
  if( forward[1] == 0 && forward[0] == 0 )
12
  {
13
    // fast case
14
    yaw = 0;
15
    if( forward[2] > 0 )
16
      pitch = 90.0f;
17
    else pitch = 270.0f;
18
  }
19
  else
20
  {
21
    yaw = ( atan2( forward[1], forward[0] ) * 180 / M_PI );
22
    if( yaw < 0 ) yaw += 360;
23
 
24
    tmp = sqrt( forward[0] * forward[0] + forward[1] * forward[1] );
25
    pitch = ( atan2( forward[2], tmp ) * 180 / M_PI );
26
    if( pitch < 0 ) pitch += 360;
27
  }
28
  VectorSet( angles, pitch, yaw, 0 );
29
}

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Временная зона GMT. Текущее время 18:28.
Показать все 6 сообщений этой темы на одной странице

На основе vBulletin версии 2.3.0
Авторское право © Jelsoft Enterprises Limited 2000 - 2002.
Дизайн и программирование: Crystice Softworks © 2005 - 2024