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

Помогите Нубу...

#0
22:50, 3 сен 2009

Народ просто я захотел подгрузить сделанный мной в 3d max'e остров и создал сферу, как мне теперь заставить сферу есдить по земле с учётом всех не ровностью... просто когда я пытался перебрать все треуголники что бы найти тот над которым стоит сфера у меня комп виснит и говорит out of memory, посоветуйте как это исправить или как узнать полигон над которым висит тело ил как заставить сферу двигаться по острову...

И пожалуйста если зашли и знаете хоть что то, то не махайте на меня рукой типо полнуй лох ну его на ... , скажите что знаете...

#1
23:53, 3 сен 2009

Заюзай например октарное дерево, а лучше - прикрути физ. двиг. (PhysX например или Bullet)

#2
0:35, 4 сен 2009

я подписался я нуб, объясни как работает Octree (просто я не хочупользоваться готовыми двигами, хочу его сделать сам...)

#3
2:41, 4 сен 2009

а гуглить религия не позволяет?

#4
11:12, 4 сен 2009

Kellendros
Сначала изучи какой нибудь движок. по мере его использования и изучения ты поймешь как все работает.
(Вдумчиво) недавно сам таким был мечтал создать свой движок. Ну может если ты гений и знаешь что делаешь.

Так что мой тебе совет изучи сначала какой нибудь движок. Тогда все яснее станет.

Вот можешь почитать что я писал на форуме когда только начинал...Создание движка

#5
11:50, 4 сен 2009

Mekrod
Ты уверен, что мне это адресовал? Я - не автор темы.

#6
18:32, 4 сен 2009

Ну тут 2 задачи.
Заставить сферу ездить.
Проверять столкновение с землей.
Такое вполне можно за денек другой и без движка самому сделать.
Лучше сделай для начала сферу на плоскости. А ты это программировать хочешь или в 3д максе заставить ездить?

#7
20:01, 4 сен 2009

mekrod, спасибо тебе, только не мог бы ты посоветовать какойнибудь хороший движок...

pink master я уже прописал движение сверы по нажатию на a w s d влево вправо вперёд и назад у меня немного другие зада заставить тело "упасть" на плоскость (модель) и потом при каждом шаге перепроверять может ли он сделать шаг или нет, и если да то тогла просчитать будущие координаты... не могли бы вы помочь мне в изучение просто я в одиночку всё пишу и изучаю, и это немного сложно...

#8
23:52, 4 сен 2009

>> я уже прописал движение сферы по нажатию на a w s d влево вправо вперёд
Hа каком языке то? Меня угораздило родится нетелепатом^^

>> "упасть"
Значит пусть будет гравитация!

>> при каждом шаге перепроверять может ли он сделать шаг или нет
Все правильно говоришь.

>> не могли бы вы помочь мне в изучение просто я в одиночку всё пишу и изучаю, и это немного сложно...
Ну в простейшем варианте примерно так.
1) Делаем список игровых объектов. И добавляем к нему все созданные объекты.
2) Пробегаем по нему и обновляем каждый из них, а именно:
    а) Если к объекту приложен вектор силы то передвигаем его согласно вектору, если это возможно.
    б) Проверяем, будет ли объект в конечной точке движения пересекаться с каким-либо объектом. Если будет то ничего не делаем. Если не будет то передвигаем.
Чтобы проверить будет ли объект пересекаться с каким-либо другим нужен список всех объектов и функция, которая принимает 2 объекта и возвращает пересекаются ли они или нет. Такая функция может быть довольно сложной для написания самому, поэтому неплохо если она уже встроена. Например в ХNA это Bool BoundingSphere.Intersects(BoundingBox).
Точнее проверить 2 сферы или 2 прямоугольника или луч и плоскость на пересечение задача очень даже легкая. Другое дело проверить 2 объекты из кучи полигонов. Обычно от этого отказываются того что это слишком медленно работает. А проверяют только примерное пересечение прямоугольников, в которые можно вписать модели. Их часто называют BoundingBoх или просто BB.

P.S. Кстати куда легче сначала разобраться с 2д пересечениями, а потом перейти на 2д. Пересечение 2ух окружностей или прямоугольников задача проще не придумаешь.

#9
0:27, 5 сен 2009

Жаль что ты не телепат))) На Dalphi 7, с использованием GLScene, формулу нахождение координаты по z я для него вывел но мне для этого надо знать все координаты треугольника находящегося под ним, но вот проблема просто перебрать их все нельзя, тогда что делать???

Я вывел алгоритм:
1) Нахождение треугольника лежащего под объектом
2) Получение координат по Z для тела (зная его x и y)
3) Применение силы ускорения свободного подения по таймеру со смещение на t*v где t = 1
4) Проверка на перелёт ниже нужного, если перелетел то выровнять по найденному z и выключить таймер.

1 - я не могу осуществить
2 - формула, я её вывел
3 - это я уже делал
4 - это просто

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

(X-X0)*(X-X0)+(Y-Y0)*(Y-Y0)<R*R
где R будет менятся до тех пор пока мы не наткнумся на полигон???

Кто что думает???

#10
0:58, 5 сен 2009

Woland
Приношу свои извинения это я адресовывал не тебе а Автору темы.

#11
1:16, 5 сен 2009

Kellendros
Честно на счет твоего алгоритма загрузит процу сильно, если не повесит.
И вообще на кой тебе здался этот алгоритм когда в GLScene есть готовая физическая библиотека если не ошибаюсь то ODE.
Сам тоже начинал с GLScene.

#12
14:22, 5 сен 2009

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

#13
16:13, 5 сен 2009

Kellendros
>1) Нахождение треугольника лежащего под объектом

Статья с исходником на Delphi.
этим алгоритмом можно получить ближайшие триугольники, и уже их проверять на столкновения.

>2) Получение координат по Z для тела (зная его x и y)
используешь проверку столкновений Триугольник VS Сфера

>3) Применение силы ускорения свободного подения по таймеру со смещение на t*v где t = 1
>4) Проверка на перелёт ниже нужного, если перелетел то выровнять по найденному z и выключить таймер.
Это довольно просто делается, если сделаешь (2), то всё поймёшь  =)

#14
17:59, 5 сен 2009

вообще говоря, для приближения к решению данной задачи - могу порекомендовать 2 подхода...
1 - сугубый фэйк.
никакой физики, есть поверхность (в простейшем случае - хейтмап), и мы по нему ездим, причем ездим особо тупо - с отслеживанием только нижней точки контакта
1.1 - убедиться, что технология простая, но убогая. хотя, в ряде случаев ничего больше не надо.
2 - физик-бэйзед. тут процесс примерно следующий...
2.1 -  накатать "сферического коня в вакууме" - а именно - шарики, скачущие внутри сугубо прямоугольной коробки, выровненой по осям координат.
2.1.1 - шарики летают друг через друга
2.1.2 - шарики сталкиваются
все абсолютно упругое, естественно...
2.2 - усложнить задачу, развернув коробку произвольным образом (можно динамически)
2.3 - коробка непрямоугольная...

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

собственно, где-то посередине этого процесса начнет появляться *осознание* проблемы. и от (прошу прощения) беспомощного "а хочу, штоба падало" произойдет постепенный переход к более внятным вопросам, на которые можно будет получить информативный ответ с минимумом флейма. :)

зы : это имха такая...

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

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