Для зрелищности иногда нужны мелкие детали.
Например стрелковое оружие в NAE реализовано достаточно хорошо.
Но куда деваются стреляные гильзы? Этот момент не реализован.
Или при уничтожении крупного объекта например, взрыв есть но где обломки?
Предлагаю свой готовый класс достаточно хорошо справляющийся с этими моментами.
Класс очень простой, прост для понимания и легко модифицируется для собственных нужд.
После создания, этот тип получает на один момент линейную и угловую скорость, затем движется по инерции.
using System; using System.Collections.Generic; using System.Text; using System.ComponentModel; using System.Drawing.Design; using Engine.MathEx; using Engine.Renderer; using Engine.MapSystem; using Engine.PhysicsSystem; using ProjectEntities; using Engine.Utils; using Engine.EntitySystem; namespace GameEntities { public class DynamicTypeEjectionType : DynamicType { //Величина случайного смещения точки объекта по координатам, относительно исходной точки. [FieldSerialize] Vec3 rndPosition; /// <summary> /// Gets or sets RND Position of spawn (Vec3). /// </summary> public Vec3 RndPosition { get { return rndPosition; } set { rndPosition = value; } } //Величина случайного вращения (вокруг исходной оси) объекта. [FieldSerialize] Vec3 rndRotation; /// <summary> /// Gets or sets RND Rotation of new object (Vec3). /// </summary> public Vec3 RndRotation { get { return rndRotation; } set { rndRotation = value; } } //Звук выброса [FieldSerialize] string ejectSound; /// <summary> /// Gets or sets eject sound (in center of THIS type). /// </summary> [Editor (typeof(EditorSoundUITypeEditor), typeof(UITypeEditor))] [SupportRelativePath] public string EjectSound { get { return ejectSound; } set { ejectSound = value; } } //вектор линейной скорости [FieldSerialize] Vec3 linearVelocityVec3; /// <summary> /// Gets or sets linear speed vector (Vec3). /// </summary> public Vec3 LinearVelocityVec3 { get { return linearVelocityVec3; } set { linearVelocityVec3 = value; } } //вектор случайно поправки вектора линейной скороти [FieldSerialize] Vec3 linearVelocityVec3Rnd; /// <summary> /// Gets or sets linear speed vector (Vec3). /// </summary> public Vec3 LinearVelocityVec3Rnd { get { return linearVelocityVec3Rnd; } set { linearVelocityVec3Rnd = value; } } //вектор ангулярной скорости [FieldSerialize] Vec3 angularVelocityVec3; /// <summary> /// Gets or sets linear speed vector (Vec3). /// </summary> public Vec3 AngularVelocityVec3 { get { return angularVelocityVec3; } set { angularVelocityVec3 = value; } } //вектор случайно поправки вектора ангулярной скорости [FieldSerialize] Vec3 angularVelocityVec3Rnd; /// <summary> /// Gets or sets linear speed vector (Vec3). /// </summary> public Vec3 AngularVelocityVec3Rnd { get { return angularVelocityVec3Rnd; } set { angularVelocityVec3Rnd = value; } } } public class DynamicTypeEjection : Dynamic { DynamicTypeEjectionType _type = null; public new DynamicTypeEjectionType Type { get { return _type; } } bool FirstForce = false; protected override void OnPostCreate(bool loaded) { base.OnPostCreate(loaded); if (Type.RndPosition == Vec3.Zero) Type.RndPosition = new Vec3 (1, 1, 1); if (Type.RndRotation == Vec3.Zero) Type.RndRotation = new Vec3 (1, 1, 1); } protected override void OnTick() { base.OnTick(); if (FirstForce == false && Type.PhysicsModel.Length > 0) { Body body = PhysicsModel.Bodies[0]; if (body == null) return; //body.AngularVelocity = Vec3.Zero; EngineRandom random = World.Instance.Random; Vec3 RndVec3 = new Vec3 (random.NextFloatCenter (), random.NextFloatCenter (), random.NextFloatCenter ()); Position = Position + (Type.RndPosition * RndVec3); Rotation = Rotation + new Angles (Type.RndRotation * RndVec3).ToQuat(); body.AngularVelocity = Type.AngularVelocityVec3 + (Type.AngularVelocityVec3Rnd * RndVec3); body.LinearVelocity = Rotation * (Type.LinearVelocityVec3 + (Type.LinearVelocityVec3Rnd*RndVec3)); FirstForce = true; if (Type.EjectSound != null) SoundPlay3D (Type.EjectSound, .5f, true); } } } }
Описание типа:
Создайте тип класса DynamicTypeEjection.
1. Ангулярная ("вращательная") скорость. Значения YAW. Определяет как объект закрутится в момент появления.
2. Максимальная величина случайной поправки на ангулярную скорость. Складывается с исходной ангулярной скростью.
3. Звуковой эффект при срабатывании.
4. Вектор линейной скорости.
5. Максимальная величина случайной поправки на линейную скорость. Складывается с исходной линейной скоростью.
6. Максимальная величина случайной поправки на исходное положение перед "выбросом"
7. Максимальная величина случайной поправки на исходные углы поворота объекта.
Особое внимание!
- Используется специально Velocity, а не импульс. Ибо так проще и не надо заморачиваться с весом объекта.
- Вектор Velocity, в отличии от импульса всегда воздействует на относительный центр объекта.
- Вектор линейной и ангулярной скорости указываются в относительных координатах (в координатах объекта).
- При создании НЕ проверяется место создания на наличие свободного от физических тел пространства.
- Рекомендую убивать объект не более чем через 2-3 секунды, чтобы не нагружать физическую систему. В большинстве случаев этого достаточно.
Позже добавлю пример ипользования.