Сегодня еще один простенький урок по возможностям контент модели XNA. Итак...
Рано или поздно вам понадобится система частиц. Об реализации такой я говорить не буду, есть полно статьей и уроков об этом. Здесь я расскажу об размещении частиц, а точнее об размещении их на моделях.
Есть несколько вариантов решения этой проблемы. Наиболее простой — прописать в коде, но тогда добавление новой модели требует изменения и кода. Можно прописать отдельным файлом, но тогда надо делать некую привязку файла частицы к файлу модели. Мы выбираем другой путь — прописать позицию прямо в модели. Для этого нам надо :
редактор моделей (ВАЖНО! Редактор должен уметь работать с трансформациями, а не просто менять меш)
VS 2005/2008
XNA Framework 2/3
Голову на плечах и прямые руки :)
Работа с моделью
Идея заключается в использовании трансформаций моделей. Загружаем нашу сцену/модель редакторе и добавляем на сцену новый объект, допустим кубик. Теперь смещаем его в позицию, где должна быть наша система частиц (!ВАЖНО! Некоторые редакторы меняют позиции точек меша, а не трансформацию. В таком случае у нас ничего не получится :( ). И последнее меняем имя объекта так чтобы было понятно что там должна быть система частиц, например - Fire1 (для особо находчивых — в имени можно прописать дополнительные настройки, но здесь мы это использовать не будем). Модель готова
Работа над ContentProcessor'ом
Приступим к коду. В ContentProcessor'е мы ищем объекты по имени и сохраняем их матрицу трансформаций с списке. После этого сам объект мы удаляем. (!ВАЖНО! Код не учитывает изменений модели в базовом процессоре. То есть использования параметров Scale, X\Y\ZAxisRotation не повлияет на системы частиц. Все изменения должны быть применены вами самими.)
[ContentProcessor(DisplayName ="ParticleModel")]publicclass ParticleModelProcessor : ModelProcessor{string m_particlesPrefix ="";[DefaultValue("")]publicstring ParticlesPrefix { get {return m_particlesPrefix;} set {m_particlesPrefix = value;}}publicoverride ModelContent Process(NodeContent input, ContentProcessorContext context){ List<Matrix> fireTransforms =new List<Matrix>();if(!string.IsNullOrEmpty(this.ParticlesPrefix)){this.ProcessContent(input, fireTransforms);} ModelContent model =base.Process(input, context); model.Tag= fireTransforms;return model;}privatevoid ProcessContent(NodeContent input, List<Matrix> fireTransforms){if(input.Name!=null&& input.Name.StartsWith(this.ParticlesPrefix)){ fireTransforms.Add(input.AbsoluteTransform); input.Parent.Children.Remove(input);}else{for(int i = input.Children.Count-1; i >-1; i--){this.ProcessContent(input.Children[i], fireTransforms);}}}}
Использование
Теперь добавляем нашу модель в проект, меняем процессор и выставляем нужное начало имени для объектов частиц (в этом варианте имя частицы должно начинаться с Fire ).
После загрузки модели, получаем список матриц с Model.Tag и смещаем. Мы просто смещаем системы частиц и готово.
void UpdateSmokePlume(){ IList<Matrix> tramsforms = m_model.Tagas IList<Matrix>;for(int i =0; i < tramsforms.Count; i++){ Vector3 position = Vector3.Transform(Vector3.Zero, tramsforms[i]); smokePlumeParticles.AddParticle(position, Vector3.Up);}}
P.S.
Данный метод можно использовать не только для размещения частиц, но и других объектов, например оружия, флаги, елементы уровня и т.п.
1271 Прочтений • [Расположение в пространстве системы частиц] [08.08.2012] [Комментариев: 0]