XNA не содержит никаких функций для управления «сценой» - вам придется реализовать это самостоятельно. Например: вы можете создать класс Light
, содержащий информацию о вашем источнике света (положение, ориентация и т. Д.), А затем иметь их List<Light>
, которые вы обновляете и визуализируете сами.
Теперь я предполагаю, что у вас есть 3D-модель «Света» (например, металлическая коробка с лампочкой), а также 3D-модель сцены. И что вы можете понять, как их визуализировать - в XNA есть множество онлайн-учебников для простого рендеринга моделей. Вот отправная точка .
Таким образом, ваше третье требование («Динамически добавлять или удалять приборы») должно быть довольно простым, если вы можете визуализировать вещи. Просто добавьте и удалите Lights из своего списка на основе пользовательского ввода. См. Входное пространство имен .
И ваше второе требование («Динамически перемещать объект с помощью мыши и получить позицию взамен») также должно быть простым. Если вы хотите, чтобы пользователь перемещал источники света, щелкая и перетаскивая их, просто следите за положением мыши между кадрами и применяйте это в качестве корректировки положения (или поворота) нажатого источника света.
Чтобы выяснить, какой Light пользователь нажимает в первую очередь, хорошей отправной точкой является Образец комплектации .
Я предполагаю, что пользователь сам щелкнет на Light (металлический ящик), чтобы переместить / повернуть его. Если бы вы предпочли, чтобы пользователь щелкнул и перетащил конечную точку источника света (место, которое он проецирует) - это сложнее. Одна мысль, которая приходит на ум: Пересечь луч от вашего Света со сценой, чтобы найти центр спроецированного пятна. В этот момент нарисуйте фиктивный «дескриптор» объекта (например, сферы), который пользователь может щелкнуть и перетащить. Когда пользователь закончит перетаскивание, определите новую ориентацию источника света, чтобы сделать его новым центром.
Наконец, ваше первое требование («Генерация света (ориентация, растровое изображение как фильтр перед светом)») является сложным. Насколько я понимаю, вы хотите нарисовать конечную точку луча света на вашей сценической модели? Если это так, то, что вы ищете, называется Projective Texture Mapping . Предположительно, у вас будет круговая текстура для основных источников света и, возможно, другие текстуры для гобо.
Быстрый и грязный способ сделать это состоял бы в том, чтобы нарисовать вашу сценическую модель, один раз для каждого источника света, с аддитивным смешиванием (чтобы каждый источник света, добавленный вместе с другими источниками света и черным, не имел эффекта), с цветом установите любой желаемый цвет света и с черно-белой текстурой (белый кружок на черном фоне), нарисованной с помощью TextureAddressMode.Clamp
, с шейдером, который рисует текстуру с помощью проекционного наложения текстур, настроенного с помощью света в качестве точки проекции.