Exemple #1
0
        /// <summary>
        /// Updating collision meshes and stuff<para/>
        /// Поиск и обновление мешей столкновений
        /// </summary>
        public void Update(float delta)
        {
            // Search for collision data if needed
            // Поиск данных о столкновениях
            if (CollisionActive && !CollisionsFound)
            {
                CollisionFile.Group col = null;
                if (CollisionManager.Collisions.ContainsKey(MainMesh.Definition.ID))
                {
                    col = CollisionManager.Collisions[MainMesh.Definition.ID];
                }
                else
                {
                    if (CollisionManager.NamedCollisions.ContainsKey(MainMesh.Definition.ModelName))
                    {
                        col = CollisionManager.NamedCollisions[MainMesh.Definition.ModelName];
                    }
                }
                if (col != null)
                {
                    Collider = new StaticCollider(
                        col,
                        MainMesh.Coords.Position,
                        MainMesh.Coords.Angles,
                        MainMesh.Coords.Scale
                        );
                }
                CollisionsFound = true;
            }

            // Update collisions
            // Обновление коллизий
            if (Collider != null)
            {
                if (Collider.IsEnabled != CollisionActive)
                {
                    if (CollisionActive)
                    {
                        Collider.Enable();
                    }
                    else
                    {
                        Collider.Disable();
                    }
                }
            }
        }
Exemple #2
0
        /// <summary>
        /// Create new StaticCollider from existing collision data<para/>
        /// Создание нового коллайдера из существующих данных
        /// </summary>
        /// <param name="colmesh">Collision data<para/>Данные о коллизиях</param>
        public StaticCollider(CollisionFile.Group colmesh, Vector3 position, Quaternion angles, Vector3 scale)
        {
            // Create base transformation matrix
            // Создание базовой матрицы трансформации
            Matrix4 mat =
                Matrix4.CreateScale(scale) *
                Matrix4.CreateFromQuaternion(angles) *
                Matrix4.CreateTranslation(position);

            // Create bodies
            // Создание тел
            List <CollisionEntry> col = new List <CollisionEntry>();

            // Spheres
            // Сферы
            if (colmesh.Spheres != null)
            {
                foreach (CollisionFile.Sphere s in colmesh.Spheres)
                {
                    // Transforming positions to world coordinates
                    // Трансформация расположения в мировые координаты
                    Vector3 pos    = Vector3.TransformPosition(s.Center, mat);
                    float   radius = Vector3.TransformVector(Vector3.UnitX * s.Radius, mat).Length;

                    // Create primitive
                    // Создание примитива
                    EntityShape shape = new SphereShape(radius);
                    col.Add(new CollisionEntry()
                    {
                        Type     = PrimitiveType.Sphere,
                        Position = pos,
                        Rotation = Quaternion.Identity,
                        Shape    = shape,
                        Body     = new Entity(shape)
                    });
                }
            }

            // Cubes
            // Кубы
            if (colmesh.Boxes != null)
            {
                foreach (CollisionFile.Box b in colmesh.Boxes)
                {
                    // Transforming positions to world coordinates
                    // Трансформация расположения в мировые координаты
                    Vector3 pos = Vector3.TransformPosition(
                        new Vector3(
                            (b.Min.X + b.Max.X) / 2f,
                            (b.Min.Y + b.Max.Y) / 2f,
                            (b.Min.Z + b.Max.Z) / 2f
                            )
                        , mat);
                    float factor = Vector3.TransformVector(Vector3.UnitX, mat).Length;

                    // Create primitive
                    // Создание примитива
                    EntityShape shape = new BoxShape(
                        (float)Math.Abs(b.Max.X - b.Min.X) * factor,
                        (float)Math.Abs(b.Max.Y - b.Min.Y) * factor,
                        (float)Math.Abs(b.Max.Z - b.Min.Z) * factor
                        );
                    col.Add(new CollisionEntry()
                    {
                        Type     = PrimitiveType.Box,
                        Position = pos,
                        Rotation = angles,
                        Shape    = shape,
                        Body     = new Entity(shape)
                    });
                }
            }

            // Trimeshes
            // Тримеши
            if (colmesh.Meshes != null)
            {
                // Creating vertices array
                // Создание массива вершин
                BEPUutilities.Vector3[] verts = new BEPUutilities.Vector3[colmesh.Vertices.Length];
                for (int i = 0; i < colmesh.Vertices.Length; i++)
                {
                    verts[i] = new BEPUutilities.Vector3(
                        colmesh.Vertices[i].X,
                        colmesh.Vertices[i].Y,
                        colmesh.Vertices[i].Z
                        );
                }

                foreach (CollisionFile.Trimesh m in colmesh.Meshes)
                {
                    // Creating affine transformation
                    // Создание трансформации
                    BEPUutilities.AffineTransform transform = new BEPUutilities.AffineTransform(
                        new BEPUutilities.Vector3(scale.X, scale.Y, scale.Z),
                        new BEPUutilities.Quaternion(angles.X, angles.Y, angles.Z, angles.W),
                        new BEPUutilities.Vector3(position.X, position.Y, position.Z)
                        );

                    // Create primitive
                    // Создание примитива
                    col.Add(new CollisionEntry()
                    {
                        Type = PrimitiveType.Mesh,
                        Mesh = new StaticMesh(verts, m.Indices, transform)
                    });
                }
            }
            subColliders = col.ToArray();
        }