Скрытие объектов, скрывающих игрока в 3D-сцене - PullRequest
3 голосов
/ 02 декабря 2009

Я разрабатываю 3D-игру с камерой, не совсем похожую на игру в The Sims, и хочу, чтобы персонаж игрока не прятался за объектами, включая стены, колонны и другие объекты.

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

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

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

Демонстрационная иллюстрация SVG <эта стеновая панель скрывает игрока, поэтому она должна быть скрыта. Еще одна не связанная и в значительной степени уже решенная проблема - это удаление <em>всех трех стеновых панелей с той стороны, что не имеет отношения к этому вопросу и вызвано только системой картографирования, с которой я столкнулся.

Ответы [ 5 ]

3 голосов
/ 02 декабря 2009

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

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

1 голос
/ 03 декабря 2009

Нахождение того или иного объекта в данной точке на экране называется сбором. Вот ссылка XNA для вас, которая должна привести вас к примеру. Идея состоит в том, что вы извлекаете 3D-точку в игре из 2D-точки, а затем можете использовать стандартные методы обнаружения столкновений, чтобы определить, какой объект занимает это пространство. Затем вы можете выбрать для визуализации этого объекта по-другому.

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

1 голос
/ 03 декабря 2009

Создать ограничивающий объем от камеры до экстентов проигрывателя, определить, какие объекты пересекают этот объем, а затем визуализировать их в любом альтернативном стиле, который вы хотите?

Может быть, есть какой-то очень умный способ сделать это, но это кажется довольно простой версией, и не должно быть слишком удачным ударом (в любом случае вы, вероятно, делаете столкновение каждый кадр ....)

1 голос
/ 02 декабря 2009

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

0 голосов
/ 03 декабря 2009

Самое простое, что я могу придумать, это должно сработать относительно хорошо, это смоделировать все препятствия плоскостью, перпендикулярной вашей земле (при условии, что у вас есть земля). Грубо говоря, все, что является препятствием, это стена с некоторой высотой. 1001 *

Смоделируйте плеер как точку где-нибудь, а модель камеры - как другую точку. Линия в 3d, которая соединяет эти две точки, лежит в плоскости, которая вам особенно интересна, потому что, если эта плоскость пересекает «плоскость препятствий» ниже высоты препятствия, это означает, что это препятствие блокирует ваш взгляд на точку игрока. .

Надеюсь, это несколько ясно. Чтобы превратить это в алгоритм, вам необходимо реализовать общий метод определения пересечения двух плоскостей (чтобы определить, достаточно ли велико препятствие, чтобы заблокировать вид).

...