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

[Delphi+GLScene+ODE] Физика персонажа нуждающаяся в доделке, додумке

#0
1:50, 17 сен. 2006

[Delphi+GLScene+ODE] Физика персонажа нуждающаяся в доделке, додумке

Исходники демки: http://www.gamedev.ru/download/?id=4248

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

Ходим только в одной плоскости ( пока ).

Проблема в том, что почему-то неработает трение.
Оно устанавливается вроде здесь : Contact.surface.mu . Но сколько не ставь - не работает.
Другая проблема - это то, что капсула не должна соскальзывать со слабо наклонённых плоскостей ( а она соскальзывает ), а с сильно наклонённых как раз должна всегда.
Третья проблема - капсула не должна отскакивать от стены как резиновая, что имеет место.
Четвёртая - это как вообще лучше перемещать капсулу. Думаю, что принудитеьлно устанавливать ей скорость - не лучший вариант.

В общем, если кто знает как поправить ( улучшить ), подредактируйте исходник ?
Там в общем основной код - это функции GLCadencerProgress и nearCallback. Остальное - это загрузчики и прочий сервис.

Управление кнопками Up - вперёд, Down - назад, Space - остановка.


#1
1:32, 18 сен. 2006

Никто не делал простого капусульного персонажа на ODE?

#2
2:34, 18 сен. 2006

Капитан
1.
contact.surface.mode := ord(dContactBounce) or ord(dContactSoftCFM) or ord(dContactSlip1) or ord(dContactSlip2);
Contact
.surface.mode := ord(dContactBounce);

попробуй добавить dContactApprox1

2. см 1.

3. убери bounce. только все равно полностью не вылечит.

4. почему? хотя FPS не делал, незнаю.

#3
5:30, 19 сен. 2006

1. Не помогло.

2. В принципе капсуле можно наверное принудительно обнулять каждый раз скорость, когда она неподвижна, чтоб не соскальзовала. Но ведь при беге по наклонной плоскости её не обнулишь.

3. Без bounce стало лучше, только совсем не подпрыгивает теперь.

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

#4
23:52, 19 сен. 2006

Я делал
http://delphigames.h17.ru/files/domik.rar

#5
23:57, 19 сен. 2006

2 метра, либа ode.dll внутри

#6
1:34, 20 сен. 2006

Обнаружил, что просто обнуление скорости каждый раз не предотвращает скатывания с наклонной плоскости. Если присмотреться, то всё равно происходит скатывание. Только очень медленно.

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

        end else if IsKeyDown(VK_SPACE) then begin
          dBodySetGravityMode(CapsuleBody, 0);
          dBodySetLinearVel(CapsuleBody, 0, 0, 0);
        end;

Включать гравитацию : dBodySetGravityMode(CapsuleBody, 1);

В принципе нормально получается. Но если под ногами проваливается пол, то так и остаёшься висеть в воздухе. Или если допустим вошёл в лифт. Лифт поехал вниз, а ты так и висишь. Или если на монстра запрыгнул, а он убежал из под ног.

#7
1:42, 20 сен. 2006

Gendolf
> Я делал
> http://delphigames.h17.ru/files/domik.rar
Чего то никак не могу скачать. Сервер рвёт связь где-то на половине и не докачивает.

А как ты предотвращаешь скатывание с наклонных поверхностей?

#8
7:25, 20 сен. 2006

http://www.gamedev.ru/download/?id=4265
Посмотри, разберись.
ODE с массой плохо работает (мож только у меня :), поэтому ставлю очень маленькую

#9
7:48, 20 сен. 2006

Gendolf
> Посмотри, разберись.
Наконец то удалось скачать. Но исходников там нет, и чего смотреть - не понятно. Или это просто чтобы я поиграл ?

#10
13:37, 20 сен. 2006

Капитан
Ты че старушку лохматишь? :)
Код на GameDev, демка на http://delphigames.h17.ru/

#11
5:34, 27 сен. 2006

Gendolf
> Ты че старушку лохматишь? :)
> Код на GameDev, демка на http://delphigames.h17.ru/
Так понял. Спасибо.

Демку, к сожалению, посмотреть не удалось, потому как она требует GLSL, а есть только Cg.
По коду в общем то не очень понятно. Ты тормозишь объект просто обнуляя скорость dBodySetLinearVel(FBody, 0, 0, 0); ? Но это же вроде скатывание с наклонных плоскостей полностю не прекращает, а только замедляет. Я склоняюсь к тому, что каждый раз нужно просто принудительно ставить капсулу на старую позицию.

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

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