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

Определение высоты (2 стр)

Поделиться
Страницы: 1 2 3 Следующая »
DiganПостоялецwww11 июня 20102:25#15
Pushkoff, два нюанса: поверхность препятствия может неровной и препятствия могут быть ниже роста персонажа.
PushkoffУдалёнwww11 июня 20102:58#16
Digan
пускай лучи начиная от ног...
PushkoffУдалёнwww11 июня 20103:06#17
Digan
пустив 2 луча уже можно узать наклон...
XunterПостоялецwww11 июня 20103:36#18
Digan
> Допустим стоит герой лицом к стене. Как можно определить высоту этой стены?
правильней как d.m.k написал
> Как вариант сделать "генератор" разметки, который будет анализировать
> геометрию.
отдельная колижн геометрия стенок помеченая на какие можно залазить, через какие перелазить.
рэйкаст по направлению движения персонажа даст точку, нормаль и тип этой геометрии под которые будет играться анимация.
а-ля принц персии.
DiganПостоялецwww11 июня 201016:53#19
отдельная колижн геометрия стенок помеченая на какие можно залазить, через какие перелазить.
рэйкаст по направлению движения персонажа даст точку, нормаль и тип этой геометрии под которые будет играться анимация.

Хм. А как выбрать эту самую отдельную колижн геометрию из всей геометрии уровня?
Допустим у меня уровень один сплошной меш и есть селектор в котором хранятся все треугольники меша. По направлению движения пускается луч и проверяется длина луча до ближайшего по направлению треугольника из  селектора.
XunterПостоялецwww11 июня 201018:04#20
Digan
> А как выбрать эту самую отдельную колижн геометрию из всей геометрии уровня?
во-первых - колижн геометрия отдельно должна быть. физхалы там конвексы. они сильно другой детализации и генерятся или рисуются моделерами.
по слоям еще. вот отдельные слои могут помимо колижна использоваться для выбора анимации.
рейкасту указывается с какими слоями пересекаться. точка пересечения и нормаль дадут необходимое положения чара относительно этой геометрии на момент начала анимации. дальше там анимировать персонажа так чтоб он попал в это начальное положение и проигрывать анимацию.
стенки по которым лазить - один таг геометрии, лестницы - другой, заборы через которые прыгать - третий. 
DiganПостоялецwww11 июня 201022:16#21
Если правильно понял то это делается так. Моделер рисует в редакторе меш с малым количеством полигонов. В движке создается класс нода для этих целей наследованный от основного. Дополнительный параметр -например высота и метод получения высоты. В мапере созданный меш присваивается ноду как экземпляр созданного класса (например: Объект-> добавить -> clambObject). Далее в самой игре пускается луч, если персонаж столкнулся с этим объектом и нажата клавиша прыжка, то нашим методом получаем высоту объекта и проигрываем анимацию.
Я правильно понял?
XunterПостоялецwww14 июня 201017:28#22
Digan
> В движке создается класс нода для этих целей наследованный от основного.
> Дополнительный параметр -например высота и метод получения высоты. В мапере
> созданный меш присваивается ноду как экземпляр созданного класса (например:
> Объект-> добавить -> clambObject).
нет, обычно есть отдельный collision и/или физдвиг - у него своя сцена, lowpoly, конвексы, шейпы. отдельно от визуальной геометрии.
разделенные по слоям или "раскрашенные" в разные таги. лестница, забор или стена для лазания это не отдельные объекты в сценграфе - они просто частью (статической) геометрии сцены могут быть.

> Далее в самой игре пускается луч, если персонаж столкнулся с этим объектом и
> нажата клавиша прыжка, то нашим методом получаем высоту объекта и проигрываем
> анимацию.
нет, когда столкнулись - уже часто поздно - надо периодически делать рэйкаст по направлению движения по collision сцене.
raycast всегда говорит точку пересечения и нормаль если пересеклись и может быть чуть разным - или ищет пересечение с конкретным слоем или ищет с collision сценой и говорит с каким слоем пересеклись.
точку с нормалью и необходимое положния перса надо находить чуть заранее - чтобы анимацией его "пришвартовать" туда откуда он сыграет анимацию по стенке/лестнице/забору правильно.

DiganПостоялецwww21 июня 20102:20#23
Вот сделал рейкаст по направлению движения и визуализацию треугольника с которым в данный момент пересекается луч.

Изображение

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

PushkoffУдалёнwww21 июня 20103:15#24
Digan
я тебе уже писал. пускай лучи через каждые 25 см над позицией перса вперед, до высоты на которую перс может вскарабкаться... когда находишь первый луч который длиннее чем расстояние перса до стены (то есть нашелся просвет), пусти луч в сторону пола (вниз) из точки над препятствием (тебе придется гарантировать что физ объем препятствия толще какой-то определенной величины)... способ тяжелый но практически универсальный, и при должной оптимизации рейкаста, не должен сильно хавать время...
DiganПостоялецwww21 июня 20104:08#25
25 см в 3D Движке понятие относительное :)
Тут наверное скорей надо измерять в длине вектора. Так как передвижение, положение начала рейкаста и конца рейкаста и т.д. задается в векторах.

Pushkoff, ваш подход реально где-то уже используется или это только ваша теория?
Как я уже говорил мне нужно, чтобы карабканье было не только на препятствия выше героя,но и ниже.
Хотя ваш способ тоже к этому подходит, только пускать лучи надо начинать пониже.
Я так понял по вашему способу если пускать лучи через каждые 25 см, высота препятствия должна кратной 25.

Мне более интересен подход о котором написал Xunter...

kvakvsПостоялецwww21 июня 20104:18#26
По хорошему - надо ставить 3д разметку, в тех местах, куда можно запрыгнуть, подтянуться, присесть-укрыться, или проползти.

Всё остальное - геометрические эксперименты, 10 20 50 раз сработает, 100 раз сработает, на 101 заглючит да так, что игроки будут с восторгом постить видео и скриншоты заглючивших персонажей по всем интернетам.

-Eugene-Постоялецwww21 июня 20105:50#27
kvakvs
Нуну! Помню в сталкере ЧН все очень любили прятаться от пуль за сгоревшими покосившимися заборами, пафосно прыгать через ряд ящиков длиной метров в пять, причем проваливаясь ногами в них же, и т.п.
XunterПостоялецwww21 июня 201020:55#28
Digan
У тебя физдвиг какой-нибудь используется?
если PhysX - посмотри NxScene::raycastAllShapes() ,  NxScene::raycastClosestShape(), у них есть параметр  groups, 
в NxShapeDesc есть NxCollisionGroup        group; ( если руками в коде - у NxShape есть NxShape::setGroup() ),
сцену для PhysX можно экспортить из макса/майки. со всеми шейпами, которым CollisionGroup выставлены. вот стенам сделай отдельную группу, заборам отдельныую, и рейкаст делай по этим группам.

в Bullet почти так-же.

PushkoffУдалёнwww21 июня 201021:02#29
Digan
> где-то уже используется или это только ваша теория?
вычитал в каком-то пейпере, когда занимался физикой... мне метод не пригодился, но я его хорошо запомнил (может чуть позже и в моем проекте это появится, пока нет необходимости, так как нет прыжков)...

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

допустим у тебя стена находится на расстоянии 50 см впереди, высотой 2 метра...
пускаем лучи от позиции на полу длинной допустим 55 см
25см - длинна луча 50 (уперся в стену)
50см - длинна 50(опять)
...
200см - длинна 50(уперся)
225см - длинна 55 и коллизий нет - есть проход... с конца этого луча пускаем луч вниз длинной 25см, упираемся в отметку 2 метра - верх стены...
надеюсь понятно объяснил...
спрашивай...

Страницы: 1 2 3 Следующая »

/ Форум / Программирование игр / Общее

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

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