Дверные сложности

Разрабатываю альтернативный игровой движок для таких столпов индустрии как Thief 1 / 2 и System Shock 2. Название движка — Force Tech, он быстрый, легковесный и поддерживает множество современных эффектов. Зачем, почему и как я это делаю можно почитать в статье-FAQ.
Наверняка многие из вас слышали такое высказывание: "Двери — это один из самых самых сложных элементов геймдизайна". Со всей ответственностью могу это подтвердить! :) К примеру, для поворота двери не вокруг её центра, а вокруг края, этот центр надо сместить к краю, повернуть дверь, а потом вернуть центр обратно. Чтобы не делать этого для каждого кадра анимации поворота, можно в самом объекте двери хранить её смещенные координаты, а в подобъекте — компенсацию этого смещения, тогда при отрисовке дверь будет располагаться на правильном месте.

На этом изображении фиолетовая толстая рамка — это реальная позиция объекта, а тонкая зеленая — смещенная позиция внутреннего подобъекта.
На этом изображении фиолетовая толстая рамка — это реальная позиция объекта, а тонкая зеленая — смещенная позиция внутреннего подобъекта.

Получается, что дверь всё равно поворачивается вокруг своего центра (центра фиолетовой рамки), но за счёт смещения подобъекта достигается нужный эффект! Казалось бы, цель достигнута, но... не так быстро. У нас же есть ещё физическое представление объекта, коллайдер, с которым будет взаимодействовать игрок и все другие физические объекты. Если кидать их в закрытую дверь, они должны отскакивать, верно?

Обычно позиция коллайдера совпадает с позицией объекта, но у нас-то позиция объекта смещена! Получается, чтобы нам передать правильную позицию коллайдеру, надо снова использовать компенсацию смещения.

Спешу вас огорчить, поскольку и на этом проблема ещё не решена: при расчете физической симуляции, для каждого коллайдера мы получаем обновленные координаты его позиции, которые надо передать самому объекту, дабы он рисовался в правильном месте. А, как мы помним, реальные координаты объекта смещены, поэтому, если мы передадим новые без обратной компенсации смещения, объект быстро улетит от нас в бесконечность. Учитываем и этот нюанс, и, вуаля! Дверь открывается:

Вот такой вот тернистый путь пришлось преодолеть просто для того, чтобы сделать поворачивающуюся дверь. Но, как говорил присно поминаемый Стив Джобс, "One more thing..." Дело в том, что есть ещё такие двери, у которых, в связи с вышеописанными исправлениями, появился небольшой зазор. Ещё предстоит разобраться в причинах его появления и исправить.

Подписывайтесь, чтобы не пропускать новости проекта и узнавать больше подробностей!

5656
61 комментарий

Если что у тебя одина из классчиеских проблем с дверьми
ОНА МАЛЕНЬКАЯ
Допустим у тебя герой 175 см - то размер двери у тебя воспринимается как 180. И ощущение что герой будет бится головй о потолок
(конечно такаие двери бывают, в подсобках)

Вот например решение из ХАЛФ ЛАЙФ
1. Дверь в реальности(2метра)
2. Дверь для HLA (VR) (2метра -50)
3.Дверь для HLA 2 - дверь 3 метра

Двери на плоском экране воспринимаются МЕньше чем в реальности.
Поэтому их нужно делать БОЛЬШЕ
как и потолки

15

Спасибо за совет. На видео используются оригинальные ассеты из Thief 2. Когда буду делать собственные - это учту.

К примеру, для поворота двери не вокруг её центра, а вокруг края, этот центр надо сместить к краю, повернуть дверь, а потом вернуть центр обратно

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

4

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

1

Ну и гемор же ты придумал ей богу, а все потому что решил использовать свой движок, ну и как писали выше пивот на грань поставь и все, или твой движок не юзает дефолт пивот?)

3

В этом вся суть! :) Вообще, это типичная работа программиста - порваться внутри, но сделать пользователю удобно.

1

не на грань а на петлю)
Хотя грань тоже подойдет если в лоуполи стилистики делать, хм.