ПрограммированиеФорумОбщее

с++ Использование контроллеров для поворота головы.

#0
7:12, 7 апр 2025

Движек "Source"(HL2) c++.
Всем привет. Мне нужна помощь с использованием контроллера поворота головы, само понимание контроллер возможно неправильно, может быть оно как-то по другому называется, так сказать более грамотно, но я смотрю как это в коде называется,  так я его и называю.
Такого рода контроллеры хороши тем, что не нужно заморачиваться с кватернионами и матрицами вращений, никогда не возникнет Gimbal lock - ситуация с углами Эйлера.
Контроллер вращает зависимую кость только в одном положении, т.е. pitch, yaw или roll, в зависимости от иерархии костей скелета.
Меня, здесь, пока интересует поворот кости только по yaw(горизонт), это что бы мне понять принцип системы отсчета.
 
Суть такая, 3D модель -> скелет игрока имеет кость(шея для примера), этой костью можно управлять этим самым контроллером, который имеет ограничение вращения, здесь меня интересует именно yaw, ограничение вращения примерно +-50 градусов(я думаю это градусы).
Строю вектор направления от направления кости(шеи) до точки прицеливания(например противник). Получаю дельту направления и точки прицеливания направления кости(шеи). Вроде ничего особо сложного нет.
Но теперь самое основное - углы поворотов кости 360 град., а вот контроллера точно не такие(честно сказать я даже не знаю в чем они измеряются, у контроллера). Я конвертирую в радианы, насколько это правильно - я не знаю.
Вращать саму кость - головняк, это нужно менять развесовку костей модели, что бы сама кость, которая находится в иерархии скелета модели, повернулась и дочерние кости не потянулись.
В общем мне нужно получить соответствие систем отсчета кости(шеи) и контроллера, что бы поворачивать контроллер на значение дельты в радианах c учётом разницы систем измерений, как-то так. Даже толком объяснить не могу.
Controller_1 | с++ Использование контроллеров для поворота головы.
Controller_2 | с++ Использование контроллеров для поворота головы.
Controller_3 | с++ Использование контроллеров для поворота головы.
В коде, для поворотов, используются данные float head_pitch и head_yaw
На скринах я показал поворот головы только pitch(влево и вправо(горизонт) +-50.0)

Controller_5 | с++ Использование контроллеров для поворота головы.

У меня контроллер управляет шеей, но так как голова сидит на шее - поворот шей это поворот головы, причем на тот-же угол. Почему не контроллер головы - контроллер головы будет управлять положением pithc(вертикаль).
На этом скрине я показываю что мне нужно, мне нужно голову(с направлением вектора головы(жёлтый)) повернуть в направлении вектора до противника(синий). 
Разница между этими векторами есть дельта, соответственно если дельта = 0 это и есть искомое направление, все просто и понятно, но есть одно НО!, положение контролера(SetPoseParametr), его координаты, вернее это даже не есть понятие координаты в полном понимании - это, будет правильнее сказать, положение(-50 0 +50  и это, естественно, не радианы), а оно отличается от углов векторов.
Даже если взять для сравнения один из углов вектора (Vector angles), например angles.x(float, что бы можно было сравнивать значения) тогда я смогу получить сравнение(это и есть альфа, в принципе)

float controler_poc = GetPosRarametr("head_yaw");
controler_poc *= M_PI/180.0;
if(anggles.x - controler_poc) == 0.0) return; 

Но данные получаю неправильные.

Я могу, конечно, тупо устанавливать положение контролера "вручную", так сказать "на глаз", а как просчитать правильные данные? В общем мне нужно отслеживание положения головы точно в направлении противника(грубо говоря - NPC при атаке смотрит на своего противника).

В самом движке всё это конечно-же есть(движек достаточно навороченный, нет только просчета освещения - старичок всё-таки), но такое чувство, что писали движек куча разных программистов, причём каждый писал под себя и потом как-то пытались все это разнообразие слепить воедино, информации от разработчиков просто никакой, что сами нарыли - тем и пользуйтесь.
По факту - я так ничего там и не понял с поворотом головы.
Да и сказать что это чистый с++.... те, кто привык работать с сылками и указателями могут для себя получить кучку непонятностей и естественно неприятностей. Но тем не менее это с++.


Пока сделал с помощью кватернионов, но это не то что мне нужно. Нужно как-то создать вектор вокруг которого вращать, а я не могу, при анимации все кости находятся в постоянном движении.

Запустить видео по клику - Как делать игрыЗапустить видео по клику - Как делать игры

ПрограммированиеФорумОбщее

Тема в архиве.