Войти
Box2DФорумОбщее

Проблема с рикошетом libgdx box2d

#0
22:03, 11 апр. 2016

Здравствуйте, я делаю игру - арканоид используя движок box2d

На данный момент у меня множество нерешенных проблем связанных с физикой объектов.

Основной проблемой на данный момент является непонятное для меня поведение шара в случае удара об угол плтаформы

Я использую движок box2d встроенный в libgdx.

Параметры тел следующие

Шар: 
плотность  10f
упругость 1.05f
трение 10f
тип тела - динамическое
linearDumping 0
angularDumping 0

Границы игрового поля:
плотность 0
трение 1
тип тела - статическое

Кирпичики:
плотность 0
трение 10f
тип тела - статическое

Платформа:
плотность 0
трение 10
тип тела - статическое

Шару при старте задается линейное ускорение
setLinearVelocity(0f, 1.1f)

ссылка на  изображение

Изображение

#1
9:05, 12 апр. 2016

:) Вроде и описал проблему, но конкретики особо ни какой. Со свойствами шаров понятно. Непонятно "является непонятное для меня поведение шара в случае удара об угол арканоида". Что для тебя непонятно? Кстати, картинка отсутствует.
Опиши более детально что ты делал и что видишь и что ожидал.

#2
9:38, 12 апр. 2016

Alerr, прошу прощения, почему то косячит ссылка
обновил сообщение, добавил ссылку на гифку
гифка хорошо отражает возникающую проблему
описать её словами проблематично

но если попытаться
то шарик после удара об угол платформы  нормально рикошетит в нужную сторону, но после того как ударяется о кирпичики у него будто что то ломается, и он перестает рикошетить при колизиях и начинает просто ехать вдоль платформы\границ\кирпичей
я в свою очередь ожидаю что он продолжит рикошетить, но полагаю что я что то упустил, что то очень важное)

если сейчас изображение опять не доступно, скажите
перезалью куда нибудь в другое место

#3
11:12, 12 апр. 2016

может для платформы следует использовать динамическое тело? и перемещать его с помощью линейного ускорения?

сейчас оно статическое и перемещается с помощью трансформа по X координатам мыши

#4
15:43, 12 апр. 2016

картинка до сих пор не работает:(

Onifent
> может для платформы следует использовать динамическое тело?
без разницы


Onifent
> и перемещать его с помощью линейного ускорения?
> сейчас оно статическое и перемещается с помощью трансформа по X координатам
> мыши
вы используете физ. движек, поэтому для физических тел вообще забудьте про перемещение с помощью трансформации

Onifent
> плотность  10f
> упругость 1.05f
> трение 10f
приведите все значения к 1, и как у вас упругость такая получилась, когда она задается строго от 0 до 1 и к трению это по моему тоже относится.

В остальном ждем картинку, а то со слов не очень понятно)

#5
17:30, 12 апр. 2016

Обновил ссылку

дублирую в этом сообщении ссылка


DenBraun
как буду дома, попробую переделать взаимодействие с платформой
на данный момент сделал трансформом потому что мне важно точное следование платформы за курсором мыши, как реализовать подобное поведение с использованием сил или линейного ускорения я честно говоря не знаю, но постараюсь выяснить

по поводу  вашего последнего замечания вынужден не согласится с вами
в официальном мануале box2d  сказано что обычно для трения и упругости используются значения от 0 до 1 box2d manual
но так же указано что значение упругости установленное в 1 будет означать что объект будет отражен точно до его изначальной позиции
из чего следует что при значении 1.05f объект будет отражен на +5% его изначальной позиции, что по идее мне подходит т.к. я желаю ускорения шарика с течением времени

#6
19:05, 12 апр. 2016

Onifent
> но так же указано что значение упругости установленное в 1 будет означать что
> объект будет отражен точно до его изначальной позиции
> из чего следует что при значении 1.05f объект будет отражен на +5% его
> изначальной позиции, что по идее мне подходит т.к. я желаю ускорения шарика с
> течением времени
Не буду спорить, так как не помню точно, но по моему это не так, если вы вводите значение отличное от 0-1 то оно округляется до требуемого диапазона, проверю вечером для интереса)

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

Onifent
> Шару при старте задается линейное ускорение
> setLinearVelocity(0f, 1.1f)
В данном случае вы как раз не ускорение задаете, а скорость

#7
21:45, 17 апр. 2016

DenBraun
Изменил способ перемещения платформы, также изменил способ задания движения для шара
теперь платформа является  призматик джоинтом
в целом симуляция выглядит более адекватной, но проблему это увы не решило, при ударе об угол  все катится в ад
я вижу что при ударе об угол, шару задается вращение
и при ударе об кирпичик это вращение гасится трением при этом почти полнотью гася скорость
но у меня соврешенно нет идей как это можно исправить

вот визуализация проблемы на данный момент ссылка

код передвижения платформы

public void move(Vector2 vector2) {
        float platformX = getPosition().x;

        if (vector2.x < platformX - 0.05f) {
            platformBody.applyLinearImpulse(new Vector2(-0.6f, 0f), platformBody.getPosition(), true);
        }

        if (vector2.x > platformX + 0.05f) {
            platformBody.applyLinearImpulse(new Vector2(0.6f, 0f), platformBody.getPosition(), true);
        }
        if (vector2.x <= platformX + 0.05f && vector2.x >= platformX - 0.05f) {
            platformBody.setLinearVelocity(0, 0);
        }
    }

так даю изначальный импульс шару

 if (Gdx.input.justTouched()) {
            if (!mouseClicked) {
                ball.getBody().setActive(true);
                System.out.println("mouse clicked");
                ball.getBody().applyLinearImpulse(0f, 0.3f, ball.getPosition().x, ball.getPosition().y, true);
                mouseClicked = true;

            }
        }

#8
12:01, 18 апр. 2016

А в чем проблема трение убрать у всех?

Box2DФорумОбщее

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