Jump to content

Глобальная turnVelocity в относительную


Recommended Posts

Как перевести глобальную turnVelocity в относительную машины?

TurnVelocity работает в глобальных значениях, как здесь в любом положении ТС:

 NxzjKscHNCI.jpg

 

А мне нужно как здесь (относительно машины за часовой стрелкой например):

4yysKCAnaVQ.jpg

 

Как? :D
Может кто-то знает формулу для этого или есть функция, которая мне с этим поможет?

При этом нужно не одну сторону лишь, а любую. 

Link to comment

Я бы на вопрос ответил, нет.

Без проблем можно пересчитать то, что можно сосчитать. У меня при одинаковом setTurn, несколько getTurn с таймерами, дают раз от раза отличные цифры, может быть я что-то делаю не так.

Вот наверное сначала нужно создать условия повторяемости, ожидаемого результата. После будет возможно высчитать.

Link to comment

@AfterAll14, всему свое время)

А вообще я имел ввиду, что пара setTurnVelocity и getTurnVelocity, работает мягко говоря странно. Например используя пару setElementVelocity и getElementVelocity, можно получать повторяющийся результат, и соответственно использовать результаты в каких-то расчетах. Но с turn я получал каждый раз разные результаты, очень разные.

Link to comment
On 09.04.2017 at 17:06, AfterAll14 said:

@Fabervox Тебе в политику надо xD Серьезно, у тебя нереальный скилл отвечать не отвечая по существу ничего xD

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

Скалярное произведение векторов есть число. Не поможет в решении.
@obuhhh, получите вращение элемента машины, преобразуйте вращение в матрицу 4x4, найдите обратную к ней матрицу и умножьте результат на turnVelocity {x,y,z,0}.

С преобразованием матриц не смогу помочь по причине другого типа системы координат в игре.

Edited by SDraw
Link to comment
Just now, SDraw said:

Скалярное произведение векторов есть число. Не поможет в решении.

Лол. Ты не понял. Перемножаешь глобальный вектор на ось Х - получаешь локальную компоненту по оси Х. И так для каждой оси, если нужно.

То что ты написал понять и сделать сами смогут единицы (им помощь не требуется).

Just now, SDraw said:

С преобразованием матриц не смогу помочь по причине другого типа системы координат в игре.

Ахаха, самое сложное что требуется, чтобы сделать по твоему методу - сам ищи типа :D.

Link to comment

@AfterAll14, политика проще...

Ну вот без матриц и на пальцах. Есть вращение по X, глобальное, то что дается обычной функции, если объект повернут на 90 градусов, то можно просто переставить куда там нужно на Y или Z, на 180 градусов, значит просто обратить знак перед числом, 270, обратить знак и на другую ось...

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

Наверное проблема решаема, но честно говоря, мне не особо понятны единицы этого turnvelocity. Я могу легко посчитать, что из себя представляет обычный velocity, посредством getElementPosition и getTickCount/onClientRender. Как также посчитать turnvelocity я незнаю, и дело вовсе не в его глобальности, дело в том что я при одинаковых таймерах, заново создаваемым авто и стабильном фпс вижу весьма странную картинку, а getTurnVelocity показывает разные цифры. Можно пропорционально корректировать, но как понять какую вообще нужно цифру задавать? Быть может я делал что-то не так, желательно использовать некий реальный диапазон для turnVelocity, а не менять на порядок(0.1,1,10).

@SDraw, или быть может я воочию увидел "другой тип координат"? Вроде бы конечно мне пофик, но если придется столкнуться с этим, научите заранее спасти свою психику.

Link to comment
31 minutes ago, Fabervox said:

@SDraw, или быть может я воочию увидел "другой тип координат"? Вроде бы конечно мне пофик, но если придется столкнуться с этим, научите заранее спасти свою психику.

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

Что turnVelocity представляет собой - мне тоже неизвестно, даже потестировать нет возможности. Однако, есть предположения:
- Если turnVelocity - нормированный вектор, определяющий направление поворота, то вариант описанный мною выше должен помочь (из данного предположения и делал вариант)

- Если turnVelocity - изменение вращения элемента по осям, придётся модифицировать вариант: преобразовать turnVelocity и вращение элемента машины в кватернионы, умножить вращение turnVelocity на обратный кватернион элемента машины и привести полученный кватернион к Эйлеровым углам

Edited by SDraw
  • Like 1
Link to comment

@Fabervox, я дошел к мнению, что 1 единица в turnVelocity это 1 поворот/сек. Не уверен, но на это похоже. Тем более в описании на вики написано о spin.

Я вешал машину в воздух: на 50мс таймер, {0, 0, 0.05} велосити и {0, 0, 10} позиция. По хоткею обнуллял {0, 0, 0} ротацию и турн велосити.
Применял различные значения для статичной машины и результат был одинаков, т.е. с функцией проблем нет. Проблема появляется с положением машины на дороге:по координате Y значение прыгает между 360 и 0, потому что это грачиные значения. Даже когда машина стоит значение прыгает и применение turnVelocity приводят к разным результатам. 

Поэтому проводить эксперименты на земле ни к чему полезному не приведут.

На счет измененной системы координат. Наверное из-за этого не работают адекватно матрицы ротации в трехмерном мире.Надо просить разработчиков внести функцию для относительной turnVelocity, ибо они натворили, а нам разгребать. :)

Edited by obuhhh
  • Like 1
Link to comment
13 minutes ago, AfterAll14 said:

@obuhhh тебе что конкретно надо сделать?

В конкретный момент дернуть машину за "веревку", которая может быть привязана к любой точке машины. Использовать хочу эту турнВелосити с обычной велосити.

(дернуть != тащить)

Edited by obuhhh
Link to comment
Just now, AfterAll14 said:

Так тебе глобальная скорость нужна будет. Ну по крайней мере я бы делал так.

Если машина стоит неподвижно в нулевой ротации, то это подойдет, но не в другом случае. С этим я столкнулся. 

Link to comment

@obuhhh, меня сейчас это не сильно волнует, но попробовав немного, столкнулся со странностями. Предельная скорость это в целом понятно, но по хорошему надо мерять и длительность импульса.

Если все действительно что-то около 1об/с, тогда все просто, находим положение в третьей оси, тем самым получая коэфф. дифференциации локального turnVelocity между двумя другими осями для глобального velocity. Но вот если например мы берем rx и ry равные 45, то turnVelocity по z получит две половинки, правильно ли давать ей их, или нужно среднее/наибольшее/ещё какое-то, тут лучше эксперимент ответит.

В не нулевой ротации, turnVelocity применял необходимый или прибавлял к имеющемуся?

Link to comment
8 minutes ago, Fabervox said:

В не нулевой ротации, turnVelocity применял необходимый или прибавлял к имеющемуся?

И так, и так. пробовал. Суть результата в первом сообщении — вся машина в любом положении крутится по мировой оси.

 

upd
Результат такой: серые стрелки — нити в какую сторону и за какую часть дергают.

PUClwAul0LI.jpg

Edited by obuhhh
Link to comment
8 minutes ago, SDraw said:

Ага, тут оказывается пытаются сделать крепления. Вещь таки не из легких, мои варианты сразу в топку идут.

Нет, машина тащиться за веревкой не будет. Мне надо саму физику этого толчка, остальное — коммерческая тайна. :D

Link to comment
  • Other Languages Moderators
1 hour ago, obuhhh said:

Нет, машина тащиться за веревкой не будет. Мне надо саму физику этого толчка, остальное — коммерческая тайна. :D

Тогда решение вашего вопроса тоже - коммерческая тайна. Если хотите более подробнее узнать, приведите неявные(аналогичные), бытовые примеры.

Edited by Disinterpreter
Link to comment

@obuhhh, самое простое, это сделать наработки в другом движке.

Здесь какой ньюанс, пока направление вектора движения, далеко от направления объекта, оно приводит к вращению. По мере приближения оно приводит к большему движению уже объекта, и далее движение приводит к замедлению ротации. Это в идеальной ситуации.

У всех тут есть какие-то маленькие или большие коммерческие и прочие тайны. И можно играть в игру, кто сможет выдать минимальный кусок от них. Причем выдано оно ведь будет не только участникам игры, но и вообще всем.

А "интересант" то по большому счету один...

Link to comment
On 15.04.2017 at 18:05, Fabervox said:

...

Ну ладно. Надо сделать джетпаки для машины. По одному с каждой стороны для авто, а можно и 4 — по углам. Вот.
Но просто подкинуть это не то. Вдруг один двигатель повернется в другую сторону *сломается*. Тогда он будет работать не идеально вверх.
Или вообще, будет только один, который тоже будет повернут в бок, и ты когда наждмешь, то тебя начнет в бок толкать. Вооот.

Link to comment
1 minute ago, AfterAll14 said:

А почему джетпаки на веревках? Я себе не особо представляю такую конструкцию.

Это была аналогия, чтобы не раскрывать все карты. Извините. :)

Имелось в виду, что сама суть "толчка" что в ситуации с веревками, что с джетпаками — одинаковая. Вооот.

Link to comment
45 minutes ago, AfterAll14 said:

И в чем вопрос сейчас у тебя?

Их всё только больше.
Теперь надо вектор разницы углов, между двумя векторами.  Пытаюсь реализовать костылями..

Link to comment

Нет такого понятия как "вектор разницы углов". Ты полез в тему где требуется наличие хотя бы базового уровня понимания динамики движения твердых тел (для изучения подразумевается наличие соответствующих знаний математического аппарата и базовых знаний хотя бы ньютоновской физики). Не вижу смысла что-то тебе объяснять т.к. тебе лучше почитать учебники чтобы получить какую-то базу.

Сразу наперед скажу что возникнут проблемы с устойчивостью в полете, надо будет как-то стабилизировать, это скрипт не на одну неделю работы. Если нету столько времени и сил лучше сделать какую-нибудь фейковую систему с простеньким подъемом и перемещением через setElementPosition/setElementRotation.

Link to comment

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...