Народ просто я захотел подгрузить сделанный мной в 3d max'e остров и создал сферу, как мне теперь заставить сферу есдить по земле с учётом всех не ровностью... просто когда я пытался перебрать все треуголники что бы найти тот над которым стоит сфера у меня комп виснит и говорит out of memory, посоветуйте как это исправить или как узнать полигон над которым висит тело ил как заставить сферу двигаться по острову...
И пожалуйста если зашли и знаете хоть что то, то не махайте на меня рукой типо полнуй лох ну его на ... , скажите что знаете...
Заюзай например октарное дерево, а лучше - прикрути физ. двиг. (PhysX например или Bullet)
я подписался я нуб, объясни как работает Octree (просто я не хочупользоваться готовыми двигами, хочу его сделать сам...)
а гуглить религия не позволяет?
Kellendros
Сначала изучи какой нибудь движок. по мере его использования и изучения ты поймешь как все работает.
(Вдумчиво) недавно сам таким был мечтал создать свой движок. Ну может если ты гений и знаешь что делаешь.
Так что мой тебе совет изучи сначала какой нибудь движок. Тогда все яснее станет.
Вот можешь почитать что я писал на форуме когда только начинал...Создание движка
Mekrod
Ты уверен, что мне это адресовал? Я - не автор темы.
Ну тут 2 задачи.
Заставить сферу ездить.
Проверять столкновение с землей.
Такое вполне можно за денек другой и без движка самому сделать.
Лучше сделай для начала сферу на плоскости. А ты это программировать хочешь или в 3д максе заставить ездить?
mekrod, спасибо тебе, только не мог бы ты посоветовать какойнибудь хороший движок...
pink master я уже прописал движение сверы по нажатию на a w s d влево вправо вперёд и назад у меня немного другие зада заставить тело "упасть" на плоскость (модель) и потом при каждом шаге перепроверять может ли он сделать шаг или нет, и если да то тогла просчитать будущие координаты... не могли бы вы помочь мне в изучение просто я в одиночку всё пишу и изучаю, и это немного сложно...
>> я уже прописал движение сферы по нажатию на a w s d влево вправо вперёд
Hа каком языке то? Меня угораздило родится нетелепатом^^
>> "упасть"
Значит пусть будет гравитация!
>> при каждом шаге перепроверять может ли он сделать шаг или нет
Все правильно говоришь.
>> не могли бы вы помочь мне в изучение просто я в одиночку всё пишу и изучаю, и это немного сложно...
Ну в простейшем варианте примерно так.
1) Делаем список игровых объектов. И добавляем к нему все созданные объекты.
2) Пробегаем по нему и обновляем каждый из них, а именно:
а) Если к объекту приложен вектор силы то передвигаем его согласно вектору, если это возможно.
б) Проверяем, будет ли объект в конечной точке движения пересекаться с каким-либо объектом. Если будет то ничего не делаем. Если не будет то передвигаем.
Чтобы проверить будет ли объект пересекаться с каким-либо другим нужен список всех объектов и функция, которая принимает 2 объекта и возвращает пересекаются ли они или нет. Такая функция может быть довольно сложной для написания самому, поэтому неплохо если она уже встроена. Например в ХNA это Bool BoundingSphere.Intersects(BoundingBox).
Точнее проверить 2 сферы или 2 прямоугольника или луч и плоскость на пересечение задача очень даже легкая. Другое дело проверить 2 объекты из кучи полигонов. Обычно от этого отказываются того что это слишком медленно работает. А проверяют только примерное пересечение прямоугольников, в которые можно вписать модели. Их часто называют BoundingBoх или просто BB.
P.S. Кстати куда легче сначала разобраться с 2д пересечениями, а потом перейти на 2д. Пересечение 2ух окружностей или прямоугольников задача проще не придумаешь.
Жаль что ты не телепат))) На 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 будет менятся до тех пор пока мы не наткнумся на полигон???
Кто что думает???
Woland
Приношу свои извинения это я адресовывал не тебе а Автору темы.
Kellendros
Честно на счет твоего алгоритма загрузит процу сильно, если не повесит.
И вообще на кой тебе здался этот алгоритм когда в GLScene есть готовая физическая библиотека если не ошибаюсь то ODE.
Сам тоже начинал с GLScene.
во всех нормальных играх, ландшафты строят спомощью текстур. а там уже легко будет найти пересечение объекта с землей.
но если все-таки требуется модель, можно создать массив и заполнять данными в виде текстуры.
Kellendros
>2) Получение координат по Z для тела (зная его x и y)
>3) Применение силы ускорения свободного подения по таймеру со смещение на t*v где t = 1
>1) Нахождение треугольника лежащего под объектом
Статья с исходником на Delphi.
этим алгоритмом можно получить ближайшие триугольники, и уже их проверять на столкновения.
используешь проверку столкновений Триугольник VS Сфера
>4) Проверка на перелёт ниже нужного, если перелетел то выровнять по найденному z и выключить таймер.
Это довольно просто делается, если сделаешь (2), то всё поймёшь =)
вообще говоря, для приближения к решению данной задачи - могу порекомендовать 2 подхода...
1 - сугубый фэйк.
никакой физики, есть поверхность (в простейшем случае - хейтмап), и мы по нему ездим, причем ездим особо тупо - с отслеживанием только нижней точки контакта
1.1 - убедиться, что технология простая, но убогая. хотя, в ряде случаев ничего больше не надо.
2 - физик-бэйзед. тут процесс примерно следующий...
2.1 - накатать "сферического коня в вакууме" - а именно - шарики, скачущие внутри сугубо прямоугольной коробки, выровненой по осям координат.
2.1.1 - шарики летают друг через друга
2.1.2 - шарики сталкиваются
все абсолютно упругое, естественно...
2.2 - усложнить задачу, развернув коробку произвольным образом (можно динамически)
2.3 - коробка непрямоугольная...
из 2 неким мистическим образом следует вариант 3 - фэйковая физика. то есть выкидываем то, что не нужно, а все остальное моделируем так, как нам удобно...
все бы ничего, но вот выбрать хорошую фэйковую модель - это либо хай-класс, либо долго и нудно подбирать...
собственно, где-то посередине этого процесса начнет появляться *осознание* проблемы. и от (прошу прощения) беспомощного "а хочу, штоба падало" произойдет постепенный переход к более внятным вопросам, на которые можно будет получить информативный ответ с минимумом флейма. :)
зы : это имха такая...
Тема в архиве.