Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Кватернионы знает кто-нибудь? Брошенные кубики как правильно вращать? / 16 сообщений из 16, страница 1 из 1
08.04.2016, 02:17
    #39210652
Charles Weyland
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кватернионы знает кто-нибудь? Брошенные кубики как правильно вращать?
Вот код на Java (библиотека libgdx - но можно просто забить и представить, что это псевдокод)
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
    private ModelInstance diceInstance;
    private final Vector3 position;
    private final Quaternion rotation;
    private final Vector3 scale;
    ...
    //x,y - direction of movement
    public void Move(float x, float y)
    {
        position.x += x;
        position.y += y;
        //But how to rotate the dice correct? To look as though it is rolling
        rotation. ...??
        diceInstance.transform.set(new Matrix4(position, rotation, scale));
    }


Суть: по плоскости катится кубик в заданном направлении x,y (как видно из кода).
Как-то надо крутить этот кубик правильно.
Ок, поперёк движения в сторону направляю вектор и вокруг него верчу кубик.
Но он достигает границы и отскакивает (угол падения == углу отражения) и движется дальше в новом направлении. Как выбрать новый вектор вращения - вообще хз.
может, подскажет кто по этой части?
...
Рейтинг: 0 / 0
08.04.2016, 03:07
    #39210657
mikhail_n
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кватернионы знает кто-нибудь? Брошенные кубики как правильно вращать?
Если чисто физика, то V = [ w * r ], где V - линейная скорость, w - угловая скорость (на вашем языке - вектор вращения), r - радиус-вектор. Все три величины - вектора, [_*_] означает ВЕКТОРНОЕ произведение. Если на пальцах - если вы смотрите на вращающееся колесо и с ВАШЕЙ точки зрения оно вращается ПО часовой стрелки, то V вектор соответственно направлен слева направо, а вектор w - ОТ ВАС. Если же с ВАШЕЙ точки зрения колесо вращается ПРОТИВ часовой стрелки, то V вектор направлен справа налево, а вектор w - НА ВАС. Ну а теперь, зная как направлен вектор линейной скорости до и после отскока от стенки сами уж как-нибудь прикиньте что происходит с "вектором вращения" и насколько градусов он разворачивается из-за удара.

Успехов.
...
Рейтинг: 0 / 0
08.04.2016, 10:37
    #39210812
Кватернионы знает кто-нибудь? Брошенные кубики как правильно вращать?
mikhail_nЕсли чисто физика, то V = [ w * r ], где V - линейная скорость, w - угловая скорость (на вашем языке - вектор вращения), r - радиус-вектор. Все три величины - вектора, [_*_] означает ВЕКТОРНОЕ произведение. Если на пальцах - если вы смотрите на вращающееся колесо и с ВАШЕЙ точки зрения оно вращается ПО часовой стрелки, то V вектор соответственно направлен слева направо, а вектор w - ОТ ВАС. Если же с ВАШЕЙ точки зрения колесо вращается ПРОТИВ часовой стрелки, то V вектор направлен справа налево, а вектор w - НА ВАС. Ну а теперь, зная как направлен вектор линейной скорости до и после отскока от стенки сами уж как-нибудь прикиньте что происходит с "вектором вращения" и насколько градусов он разворачивается из-за удара.

Успехов.

Сравнение с колесом не корректное.

Нужно считать разницу углов плоскости кубика.
Кубик ударяется гранью, в зависимости от угла
простраственной позиции кубика
либо перекатывается через грань и соприкасается верхней относительно
пространственного расположения гранью,
либо не перекатывается и ударяется о препядствие плоскостью грани ,
либо нижней гранью .
Поведение во многом
будет зависеть от коэфициента трения-скольжения материалов кубика и грани
, упругости материалов, силы .....
...
Рейтинг: 0 / 0
08.04.2016, 13:48
    #39211051
Charles Weyland
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кватернионы знает кто-нибудь? Брошенные кубики как правильно вращать?
аппроксимация:
кубик катится в соответствии с физикой шара прямолинейно, равномерно.
В данном случае да, шар - не колесо. Сравнение не корректное.
...
Рейтинг: 0 / 0
08.04.2016, 20:30
    #39211453
mikhail_n
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кватернионы знает кто-нибудь? Брошенные кубики как правильно вращать?
Сравнение с колесом не корректное.

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

Да. А ещё Земля круглая, а вода мокрая.

аппроксимация:
кубик катится в соответствии с физикой шара прямолинейно, равномерно.
В данном случае да, шар - не колесо. Сравнение не корректное.

И што, у катящегося шара вектора V и w находятся между собой в каких-то других отношениях, чем у колеса? Ну замените "колесо" на "шар" в моём посте, от этого СОДЕРЖАТЕЛЬНО в нём НИЧЕГО не изменится.
...
Рейтинг: 0 / 0
09.04.2016, 05:07
    #39211567
Пётр Седов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кватернионы знает кто-нибудь? Брошенные кубики как правильно вращать?
Charles Weyland, может просто подправлять ориентацию кубика при каждом вызове Move?
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
    private ModelInstance diceInstance;
    private final Vector3 position;
    private final Quaternion rotation = new Quaternion(); // начальная ориентация, надеюсь rotation.isIdentity()
    private final Vector3 scale;
    ...
    //x,y - direction of movement
    public void Move(float x, float y)
    {
        position.x += x;
        position.y += y;

        // ось вращения перпендикулярна направлению движения
        Vector3 axis = (new Vector3(y, -x, 0)).nor(); // nor не нужен, если конструктор Quaternion-а сам нормализует ось
        Quaternion delta = new Quaternion(axis, /*angle:*/5); // или -5, надо экспериментировать
        rotation.mul(delta); // или mulLeft, надо экспериментировать
        rotation.nor(); // без этого единичный кватернион постепенно перестанет быть единичным (из-за накапливающейся погрешности)

        diceInstance.transform.set(new Matrix4(position, rotation, scale));
    }

https://en.wikipedia.org/wiki/Quaternions_and_spatial_rotation the multiplication of unit quaternions corresponds to the composition of three-dimensional rotations
...
Рейтинг: 0 / 0
10.04.2016, 00:17
    #39211795
Charles Weyland
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кватернионы знает кто-нибудь? Брошенные кубики как правильно вращать?
Пётр,
В том-то и проблема, что кубик начинает вращаться вокруг своих локальных осей, которые вращаются вместе с ним.
Сейчас попытаюсь обрисовать
...
Рейтинг: 0 / 0
10.04.2016, 00:19
    #39211796
Charles Weyland
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кватернионы знает кто-нибудь? Брошенные кубики как правильно вращать?
А, чуть ошибся в картинке. Красная стрелка вообще вниз должна быть направлена. Но суть изложил.
...
Рейтинг: 0 / 0
10.04.2016, 00:23
    #39211798
Charles Weyland
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кватернионы знает кто-нибудь? Брошенные кубики как правильно вращать?
Поправил пару погрешностей в иллюстрации
...
Рейтинг: 0 / 0
10.04.2016, 00:26
    #39211801
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кватернионы знает кто-нибудь? Брошенные кубики как правильно вращать?
Это вопрос на тему геймдева и физики столкновений. И его уместно задавать не в этом
форуме а там где тусят геймдевы.
...
Рейтинг: 0 / 0
10.04.2016, 00:41
    #39211805
Charles Weyland
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кватернионы знает кто-нибудь? Брошенные кубики как правильно вращать?
задал, там вообще молчком.
А Пётр хотя бы попытался помочь.
Сейчас пытаюсь как-то этот вектор правильно вращать, чтобы вокруг него уже весь кубик вращать.
...
Рейтинг: 0 / 0
10.04.2016, 02:50
    #39211829
Charles Weyland
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кватернионы знает кто-нибудь? Брошенные кубики как правильно вращать?
боже-боже-боже мой!!
оно работает!
Да, Пётр был прав, надо mulLeft!
Спасибо!!
...
Рейтинг: 0 / 0
10.04.2016, 17:14
    #39211972
Кватернионы знает кто-нибудь? Брошенные кубики как правильно вращать?
Charles Weylandзадал, там вообще молчком.
А Пётр хотя бы попытался помочь.
Сейчас пытаюсь как-то этот вектор правильно вращать, чтобы вокруг него уже весь кубик вращать.


YouTube Video
...
Рейтинг: 0 / 0
10.04.2016, 20:39
    #39212015
Пётр Седов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кватернионы знает кто-нибудь? Брошенные кубики как правильно вращать?
Charles WeylandДа, Пётр был прав, надо mulLeft!Как и с матрицами, порядок кватернионов в умножении имеет значение (обычно q1 * q2 ≠ q2 * q1), он влияет на то, в каком порядке будут делаться преобразования координат. Но в разных API/библиотеках это по-разному сделано, например:
OpenGL: new_vec = mat_3 * mat_2 * mat_1 * old_vec (вектор -- столбец)
Direct3D: new_vec = old_vec * mat_1 * mat_2 * mat_3 (вектор -- строка)
А с libgdx я никогда не работал, поэтому и написал, что надо экспериментировать.
https://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/math/Quaternion.html
Код: java
1.
public Quaternion mul(Quaternion other)

Multiplies this quaternion with another one in the form of this = this * other
...
Код: java
1.
public Quaternion mulLeft(Quaternion other)

Multiplies this quaternion with another one in the form of this = other * this

maytonЭто вопрос на тему геймдева и физики столкновений.Не, здесь нет физики (то, что делается физическими движками PhysX, Havok, Bullet), здесь чисто кинематика. Ну и за кадром остался простенький collision detection (кубик докатывается до стенки ⇒ меняем направление движения).

maytonИ его уместно задавать не в этом форуме а там где тусят геймдевы.Простые вопросы по разработке игр можно и в этом форуме задавать. А вот вопросы типа «Разработка ММО игры» -- да, смысла мало.
...
Рейтинг: 0 / 0
11.04.2016, 00:30
    #39212083
Charles Weyland
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кватернионы знает кто-нибудь? Брошенные кубики как правильно вращать?
Пётр,
сможете дать ещё одну подсказку на эту же тему?
Я сделал так, чтобы кубик вращался с помощью мыши. Т.е. куда я мышь веду, в ту сторону он и вращается.
Вопрос: как узнать, на какой стороне лежит кубик?
Казалось бы, ответ: узнать, на какой угол повёрнут кубик относительно X, относительно Y и относительно Z с помощью getAngleAround(ось). Ради эксперимента я воспользовался ещё просто некоторым getAngle() - угол, на который повёрнут кватернион.
Код: sql
1.
2.
3.
4.
 x = rotation.getAngleAround(Vector3.X);
 y = rotation.getAngleAround(Vector3.Y);
 z = rotation.getAngleAround(Vector3.Z);
 angle = rotation.getAngle();


(для справки: Vector3.X - это вектор (1; 0; 0))
углы выдаются в градусах

Стал выводить эти углы ради эксперимента прямо на экран.

Вопрос: почему при незначительно мелком изменении так меняются углы? И меняются они как-то хаотично почти, скачут на очень большие значения. Не могу проследить зависимости.
...
Рейтинг: 0 / 0
11.04.2016, 03:30
    #39212096
Пётр Седов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кватернионы знает кто-нибудь? Брошенные кубики как правильно вращать?
Charles Weyland Вопрос: как узнать, на какой стороне лежит кубик?Я бы делал так. Сначала вычисляем, где находятся центры граней, в мировой системе координат:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
Matrix4 transform = new Matrix4(position, rotation, scale);
float hs = 0.5f; // половина размера кубика
Vector3 face_1_center = (new Vector3(hs, 0, 0)).mul(transform);
Vector3 face_2_center = (new Vector3(-hs, 0, 0)).mul(transform);
Vector3 face_3_center = (new Vector3(0, hs, 0)).mul(transform);
Vector3 face_4_center = (new Vector3(0, -hs, 0)).mul(transform);
Vector3 face_5_center = (new Vector3(0, 0, hs)).mul(transform);
Vector3 face_6_center = (new Vector3(0, 0, -hs)).mul(transform);
// или во всех случаях traMul, надо экспериментировать

(hs, 0, 0) -- центр первой грани в локальной системе координат кубика
face_1_center -- центр первой грани в мировой системе координат
и т. д.
А потом просто смотрим, центр какой грани ниже всего:
Код: java
1.
2.
3.
4.
5.
6.
7.
int lowest_face = 1;
float lowest_face_center_z = face_1_center.z;
if (face_2_center.z < lowest_face_center_z) {lowest_face_center_z = face_2_center.z; lowest_face = 2;}
if (face_3_center.z < lowest_face_center_z) {lowest_face_center_z = face_3_center.z; lowest_face = 3;}
if (face_4_center.z < lowest_face_center_z) {lowest_face_center_z = face_4_center.z; lowest_face = 4;}
if (face_5_center.z < lowest_face_center_z) {lowest_face_center_z = face_5_center.z; lowest_face = 5;}
if (face_6_center.z < lowest_face_center_z) {lowest_face_center_z = face_6_center.z; lowest_face = 6;}


Charles Weyland Казалось бы, ответ: узнать, на какой угол повёрнут кубик относительно X, относительно Y и относительно Z с помощью getAngleAround(ось).
Код: sql
1.
2.
3.
 x = rotation.getAngleAround(Vector3.X);
 y = rotation.getAngleAround(Vector3.Y);
 z = rotation.getAngleAround(Vector3.Z);


(для справки: Vector3.X - это вектор (1; 0; 0))
углы выдаются в градусах

Стал выводить эти углы ради эксперимента прямо на экран.

Вопрос: почему при незначительно мелком изменении так меняются углы? И меняются они как-то хаотично почти, скачут на очень большие значения. Не могу проследить зависимости. Смысл метода getAngleAround я не особо понял из документации. Попробуйте лучше углы Эйлера (yaw, pitch, roll), для них есть специальные методы: getYaw, getPitch, getRoll. Углы Эйлера не должны бешено скакать.

Charles WeylandРади эксперимента я воспользовался ещё просто некоторым getAngle() - угол, на который повёрнут кватернион.
Код: sql
1.
 angle = rotation.getAngle();

Единичный кватернион задаёт преобразование координат типа «поворот». На какой угол этот поворот, как раз можно узнать с помощью этого метода, насколько я понимаю.
...
Рейтинг: 0 / 0
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Кватернионы знает кто-нибудь? Брошенные кубики как правильно вращать? / 16 сообщений из 16, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]