Войти
ПрограммированиеФорумФизика

Bullet Physics - Libgdx - перемещение мира, а не объекта

#0
22:41, 8 ноя. 2019

Здравствуйте. Изучаю Буллет физику(libgdx). Хочу реализовать "камеру от третьего лица", но перемещать не камеру, а мир.
Создал сцену с несколькими геометрическими фигурами. Камера смотрит в центр координат,  и может вращаться. С помощью кнопок, используя кватернион вращаю куб. Куб имеет небольшую скорость и вскоре покидает поле зрения камеры.
Далее добавил возможность выбора объектов(object.selected=true/false)

        if(gui.selectBox.getSelectedIndex()==0)
        {
            objectSphere_r.selected=true;
            objectSphere_g.selected=false;
            objectSphere_b.selected=false;
            objectSphere_y.selected=false;
            objectSphere.selected=false;
            objectBox.selected=false;
        }
        if(gui.selectBox.getSelectedIndex()==1)
        {
            objectSphere_r.selected=false;
            objectSphere_g.selected=true;
            objectSphere_b.selected=false;
            objectSphere_y.selected=false;
            objectSphere.selected=false;
            objectBox.selected=false;
        }
        ..............
        .............
Код перемещения мира:
        for(int i=0; i<instances.size; i++)
        {
            GameObject obj = instances.get(i);
            if(obj.selected)
            {
                Vector3 pos = new Vector3();
                obj.body.getWorldTransform().getTranslation(pos);
                
                for(int j=0; j<instances.size; j++)
                {
                    GameObject obj2 = instances.get(j);
                    Vector3 pos2 = new Vector3();
                    obj2.body.getWorldTransform().getTranslation(pos2);
                    Vector3 npos = new Vector3(pos2.sub(pos));
                    obj2.transform.setTranslation(npos);
                    obj2.body.proceedToTransform(obj2.transform);
                }
            }
        }
Краткое описание кода: если объект выбран, запоминаем его позицию. И из позиции всех объектов вычитаем позицию выбранного объекта. Выбранный объект перемещается в центр координат, куда смотрит камера, а остальные - куда надо.

Только после перемещения вращение куба неправильное. Куб как будто очень сильно потяжелел. Секунд пять, после нажатия кнопки, вращения не наблюдается. Но кватернион оказывается в течении этих секунд набирает скорость. И куб рывком начинает крутиться.
Вращение куба:

                Quaternion boxRot = objectBox.body.getOrientation();
    Vector3 Yup = new Vector3(0,1,0);
    Vector3 Ydown = new Vector3(0,-1,0);
    Vector3 newYup = Yup.mul(boxRot);
    Vector3 newYdown = Ydown.mul(boxRot);
    
    Vector3 Zup = new Vector3(0,0,1);
    Vector3 Zdown = new Vector3(0,0,-1);
    Vector3 newZup = Zup.mul(boxRot);
    Vector3 newZdown = Zdown.mul(boxRot);
    
    Vector3 XkL = new Vector3(-1,0,0);
    Vector3 XkR = new Vector3(1,0,0);
    Vector3 newXkL = XkL.mul(boxRot);
    Vector3 newXkR = XkR.mul(boxRot);
        
        if(gui.leftButton.b)
        {
            objectBox.body.applyForce(newXkR, newZup);
            objectBox.body.applyForce(newXkL, newZdown);
        }
        if(gui.rightButton.b)
        {
            objectBox.body.applyForce(newXkR, newZdown);
            objectBox.body.applyForce(newXkL, newZup);
        }
        .........
Необходимо, что бы куб сразу после нажатия кнопки начал вращаться. Может кто-то сталкивался с аналогичной проблемой. Куб:  btRigidBody, размеры: 1единица, масса: 1 ед.


#1
(Правка: 23:15) 22:58, 8 ноя. 2019

Плотник

Не понял, начиная с этого момента (в основном связь этого предложения с заголовком):
> используя кватернион вращаю куб. Куб имеет небольшую скорость и вскоре покидает поле зрения камеры.

Попробуй как-то структурировать вопрос/описание проблемы (или их несколько?).

P.S. И вращения (torque) я не увидел. Ты прикладываешь силы (иногда так тоже можно, но непонятно у тебя зачем).

#2
(Правка: 9 ноя. 2019, 0:06) 23:38, 8 ноя. 2019

rcsim

правильнее сказать: используя ориентацию в кватернионах(Quaternion boxRot = objectBox.body.getOrientation()) нахожу точки приложения силы для вращения.
А куб изначально движется по сцене. Движение и вращение не взаимосвязаны.
Проблема только одна:
после добавления кода "перемещения мира", куб не сразу начинает вращение когда нажимаешь на кнопку. Секунд пять он "ждёт".
Думаю, перемещение мира и вращение куба(путем приложения силы) взаимосвязаны: если вращаю куб - он вращается, если добавить перемещение мира вокруг камеры - куб перестает вращаться. Значит: или я неправильно перемещаю мир, или нужно искать причину неправильного вращения куба после перемещения мира.

#3
0:20, 9 ноя. 2019

Плотник
> как перемещать мир(bullet world) вокруг камеры, а не камеру перемещать по миру.

Буквально, так сделать нельзя, ну то есть у bullet нет такого понятия как "перемещать мир".
Не знаю как конкретно в libgdx, но по идее можно задать некий transform offset в виде вектора.
Или м.б. в дереве сцены трансформацию для камеры (не трогая физику) предусмотреть.

#4
(Правка: 12:06) 12:00, 9 ноя. 2019

rcsim
Спасибо за ответ. Простенькую камеру для перемещения по миру я освоил.

И еще один вопрос(если нельзя "перемещать мир"): есть ли возможность или метод, для перемещения(расчета движения) одних тел относительно одного тела? Например что-то (btRigidBody)body1.makeWorldCenter=true(сделать центром мира). Если имеются тела body2, body3...., они будут двигаться относительно body1, а перемещение самого тела body1 будет добавляться к перемещениям других тел. Соответственно body1 будет в центре координат, визуально он как будто не движется.

#5
13:00, 9 ноя. 2019

В принципе, можно применять transform (т.е. позиционировать) к любому телу (острову).
Т.е. да, выбираешь "центральное тело", нормализуешь его position в 0, и на величину этой нормализации двигаешь и все остальные тела.
Но это если говорить только о bullet.

А "понравится" это libgdx, или нет, я не знаю - он может кэшировать позиции тел (напр. для визуальной интерполяции).

#6
14:16, 9 ноя. 2019

Спасибо. Буду разбираться.

ПрограммированиеФорумФизика