Программирование игр, создание игрового движка, OpenGL, DirectX, физика, форум
GameDev.ru / Программирование / Форум / Попытка сделать физический движок

Попытка сделать физический движок

Поделиться

Страницы: 1 2 3 4 ... 11 ... 19 20 21 Следующая

GringosolУчастникwww15 сен. 20120:36#0
После долгожданного возвращения ноутбука из ремонта продолжаю мучать visual studio в попытах добиться некой правдоподобности поведения объектов.
Пока результат оставляет желать и желать. Сделал мини-пирамидку. а она рассыпается самым подлым образом. Но мало того, что рассыпается, так еще кубики проходят друг сквозь друга.
Посмотрите, если не лень. Я так понимаю, вся проблема сейчас в определении коллизий?
архив с движком
Трение не делал пока.

Правка: 15 сен. 2012 0:40

SuslikМодераторwww15 сен. 20120:47#1
импульсы почти наверняка точно считаются верно, поздравляю. пирамида так и должна постепенно разъезжаться, так как трения нет - это совершенно нормально.

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

с трением может быть чуть посложнее. ты разобрался, как его реализовывать? если что-то не понятно, могу попытаться объяснить.

Правка: 15 сен. 2012 0:50

GringosolУчастникwww15 сен. 20121:21#2
Suslik
> с трением может быть чуть посложнее. ты разобрался, как его реализовывать?
я читал статью, вроде понятно было)) хотя как дойду до реализации, наверное будут вопросы. а там еще и шарниры нужно будет делать.
псевдоимпульсы отключил, без них пока тошно))
насчет warmstartinga хотел уточнить, как оно работает, но потом вроде допер: появляется контакт, и все время, пока он живет, в каждом кадре импульс в нем аккумулируется.
warmstarting'а тоже пока нет.
С CD  пытаюсь разобраться: с помощью разделяющих осей определяю пересекающиеся треугольники, для каждой пары треугольников нахожу ось, по которой пересечение минимально; соседние треугольники объединяю в группы; потом нахожу отношения, в которых находятся треугольники двух пересекающихся тел: контакт плоскость-плоскость, плоскость-отрезок, отрезок-отрезок, плоскость-вершина. Это неверно изначально? Или имеет смысл отладить?

Правка: 15 сен. 2012 1:24

SuslikМодераторwww15 сен. 20121:29#3
Gringosol
> насчет warmstartinga хотел уточнить, как оно работает, но потом вроде допер:
> появляется контакт, и все время, пока он живет, в каждом кадре импульс в нем
> аккумулируется.
как бы да, общая идея такова. там обычно проблемы возникают в том, как его ограничивать(импульс не может быть меньше нуля - какой?), в том, как определять, какой контакт с предыдущего шага в какой перешёл на текущем. потом небольшие проблемы с вормстартингом у трения, надо немного подумать.

> пытаюсь разобраться: с помощью разделяющих осей определяю пересекающиеся
> треугольники, для каждой пары треугольников нахожу ось, по которой пересечение
> минимально; соседние треугольники объединяю в группы; потом нахожу отношения, в
> которых находятся треугольники двух пересекающихся тел: контакт
> плоскость-плоскость, плоскость-отрезок, отрезок-отрезок, плоскость-вершина.
какая-то ерунда. попробуй просто когда находишь разделяющую ось просто перебрать все фейсы одного из боксов и если нормаль одного из них почти совпадает с разделяющей осью, то этот фейс - контактный. если ни один фейс не нашёлся, перебираешь всего его рёбра - если хоть одно ребро почти перпендикулярно разделяющей оси и находится с внешней для этой оси стороны, то это ребро - контактное. иначе просто берёшь самую далёкую в направлении оси вершину. точно так же перебираешь все фичи второго бокса. далее тебе нужно, зная контактирующие фичи от каждого бокса, построить контактную группу из конкретного набора точек. я устал писать, постарайся сам понять, как это сделать.

GringosolУчастникwww16 сен. 20120:06#4
Suslik, а сейчас коллизии нормально находятся?
кубики
+ Показать

Правка: 16 сен. 2012 0:22

SuslikМодераторwww16 сен. 20126:37#5
вроде, уже не так плохо, как было раньше, но всё равно коллижн детекшн регулярно врёт. создавай два куба, дай одному провалиться в другой и ставь брейкпойнт, чтобы понять, почему коллижны не нашлись или нашлись не те, которые тебе бы хотелось.
GringosolУчастникwww29 сен. 201215:59#6
Решил-таки отказаться от пагубной затеи сделать расчет столкновений невыпуклых объектов.
Переписал CD. Еще нашла светлая мысль сделать шаг времени )).
Просьба потестить движок и сказать, что не так. И еще интересно, сколько fps выдает это действо.
Хотя самое большое "не так" видно невооруженным взглядом - конус колбасит не по-детски.
движок
repeatПостоялецwww29 сен. 201216:41#7
Gringosol
досмотрел до конца - все дружно спрыгнули со стола :D

> Решил-таки отказаться от пагубной затеи сделать расчет столкновений невыпуклых объектов.
да, это не лучшая затея на ранней стадии программирования own физики.

> Просьба потестить движок и сказать, что не так. И еще интересно, сколько fps выдает это действо.
не так - дахрена всего! конус - танцует ламбаду, стек боксов его внимательно смотрит и слушает, пытаясь побыстрее свалить :)
контакты гляжу ты подправил, а точнее КД.
фпс'а я у тебе не увидел, а fraps - врубать не захотел...но у меня не тормозит ))

Самое интересное это вот что:
у тебя стек из 2-х боксов стоит как вкопанный, а когда они лежат по отдельности на столе, то их колбасит по чуть чуть.
у меня-то как-раз обратная фигня :(
как удалось тебе успокоить стек боксов? или это секрет?

GringosolУчастникwww29 сен. 201220:25#8
ну, у меня 50 итераций солвера. может поэтому. пока правда без вармстартинга.

Правка: 29 сен. 2012 20:55

SuslikМодераторwww29 сен. 201220:26#9
с вормстартингом за глаза хватит 10
GringosolУчастникwww30 сен. 201217:17#10
Ну вот, я успокоил конус. Теперь он не пляшет. Хотя это далось ценой потери fps, потому что "успокоение" достигнуто за счет warmstarting'а, но так как он  пока не доделан, пришлось увеличить количество итераций.
При нажатии на кнопку Y пирамида начнет феерически разваливаться.
пирамида Хеопса

PS трение пока не сделал

Правка: 30 сен. 2012 17:24

repeatПостоялецwww30 сен. 201219:29#11
да. на физику похоже уже!
но тормозит жуть :(
хотя и у меня не лучше :)
ты меня заинтересовал с пирамидой, пойду ка и я себе сделаю пирамидку из 5-ти боксов :)))
ЗЫ тебе же не трудно наклепать еще одну демку, да? так вот сделай демку(пусть та же пирамида но кубов в 2-раза меньше) и поставь больше инерцию(раза в 4), а то я даже не могу увидеть толком вращение куба - оно мегаскоростное у тя..

Правка: 30 сен. 2012 19:29

GringosolУчастникwww30 сен. 201219:44#12
а я могу сделать, чтобы расчет каждого кадра физики был на нажатие кнопки
или просто момент инерции увеличить?
repeatПостоялецwww30 сен. 201220:05#13
сделай так:
-уменьш граву раза в 2;
-поставь три куба друг над другом;
-увеличь инерцию раза в 4 от последней демки;
-поверни все кубы так чтобы каждый падал на одну точку(ну чтобы вращение видно было);
-залей демку на сайт :) ;
GringosolУчастникwww30 сен. 201220:31#14
Залил. Может я что-то неправильно понял. Сделал 2 пирамиды и 3 куба повернутых друг над другом.
Вот, кстати, и баг выявился. Хотя может и не баг... Без Суслика не разобраться)).
кубы

Правка: 30 сен. 2012 20:35

Страницы: 1 2 3 4 ... 11 ... 19 20 21 Следующая

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

2001—2014 © GameDev.ru — Разработка игр