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

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

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

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

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

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

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

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

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