/// <summary>
        /// Vytvoří objekt typu <see cref="Body3D"/> na základě zadaných parametrů. Byl-li již zadaný model
        /// zpracováván, nedochází opětovně k výpočetně náročnému hledání dvojrozměrného tvaru.
        /// </summary>
        /// <param name="model">Trojrozměrný model.</param>
        /// <param name="position">Výchozí pozice objektu ve dvojrozměrném světě.</param>
        /// <param name="bodyType">Typ simulovaného tělesa (statické, kinematické nebo dynamické).</param>
        /// <param name="basicEffectParams">>Parametry pro třídu <see cref="BasicEffect"/>.</param>
        /// <param name="positionZ">Výchozí pozice na ose Z ve trojrozměrném světě.</param>
        /// <returns></returns>
        public Body3D CreateBody3D(
            Model model,
            Vector2 position  = new Vector2(),
            BodyType bodyType = BodyCreator.DEFAULT_BODY_TYPE,
            BasicEffectParams basicEffectParams = null,
            float positionZ = 0f)
        {
            //Tento model ještě nebyl instancí této třídy zpracováván
            if (!_modelVerticesPairs.ContainsKey(model))
            {
                using (Texture2D orthoRender = BitmapRenderer.RenderOrthographic(_graphicsDevice, model))
                {
                    //Najít v bitmapě tvar je výpočetně náročné, proto se to stane pro každý model zpracovávaný touto
                    //třídou jenom jednou
                    List <Vertices> verticesList = BodyCreator.CreateVerticesForBody(
                        orthoRender,
                        ReduceVerticesDistance,
                        TriangulationAlgorithm,
                        GraphicsToSimulationRatio);

                    _modelVerticesPairs.Add(model, verticesList);
                }
            }
            return(ConstructBody3D(model, _world2D, position, bodyType, positionZ, basicEffectParams));
        }
Exemplo n.º 2
0
        /// <summary>
        /// Vrátí objekt typu <see cref="Body3D"/>. Tvar pro dvourozměrnou fyzikální simulaci je dán parametrem body.
        /// </summary>
        /// <param name="model">Trojrozměrný model.</param>
        /// <param name="world2D">Dvourozměrný svět, do kterého má být těleso zařazeno.</param>
        /// <param name="body">Dvourozměrné těleso.</param>
        /// <param name="position">Výchozí pozice objektu v dvourozměrném světě.</param>
        /// <param name="bodyType">Typ simulovaného tělesa (statické, kinematické nebo dynamické).</param>
        /// <param name="basicEffectParams">Parametry pro třídu <see cref="BasicEffect"/>.</param>
        /// <returns>Objekt typu <see cref="Body3D"/>.</returns>
        public static Body3D CreateBody3D(
            Model model,
            World world2D,
            Body body,
            Vector2 position  = new Vector2(),
            BodyType bodyType = BodyCreator.DEFAULT_BODY_TYPE,
            BasicEffectParams basicEffectParams = null)
        {
            body.Position = position;
            body.BodyType = bodyType;
            world2D.Add(body);

            Body3D body3D = new Body3D(model, body)
            {
                BasicEffectParams = basicEffectParams
            };

            return(body3D);
        }
        private Body3D ConstructBody3D(
            Model model,
            World world2D,
            Vector2 position,
            BodyType bodyType,
            float positionZ,
            BasicEffectParams basicEffectParams)
        {
            Body body = BodyCreator.CreateBodyFromVertices(
                _modelVerticesPairs[model],
                world2D,
                position,
                bodyType,
                Density,
                Rotation);

            Body3D body3D = new Body3D(model, body, positionZ)
            {
                BasicEffectParams = basicEffectParams
            };

            return(body3D);
        }
Exemplo n.º 4
0
        /// <summary>
        /// Vrátí objekt typu <see cref="Body3D"/>. Tvar odpovídající dvourozměrné reprezentaci pro fyzikální simulaci
        /// je nalezen podle ortogonální projekce zadaného trojrozměrného modelu.
        /// </summary>
        /// <param name="model">Trojrozměrný model.</param>
        /// <param name="world2D">Dvourozměrný svět, do kterého má být těleso zařazeno.</param>
        /// <param name="graphicsDevice">Grafické zařízení.</param>
        /// <param name="position">Výchozí pozice objektu ve dvojrozměrném světě.</param>
        /// <param name="bodyType">Typ simulovaného tělesa (statické, kinematické nebo dynamické).</param>
        /// <param name="orthographicModelSize">Velikost modelu pro renderování. Pokud tento parametr není zadán,
        /// vypočítá se.</param>
        /// <param name="triangulationAlgorithm">Algoritmus pro rozdělení tvaru na množství menších konvexních
        /// polygonů.</param>
        /// <param name="basicEffectParams">Parametry pro třídu <see cref="BasicEffect"/>.</param>
        /// <returns>Objekt typu <see cref="Body3D"/>.</returns>
        public static Body3D CreateBody3D(
            Model model,
            World world2D,
            GraphicsDevice graphicsDevice,
            Vector2 position              = new Vector2(),
            BodyType bodyType             = BodyCreator.DEFAULT_BODY_TYPE,
            Vector2 orthographicModelSize = new Vector2(),
            TriangulationAlgorithm triangulationAlgorithm = BodyCreator.DEFAULT_TRIANGULATION_ALGORITHM,
            BasicEffectParams basicEffectParams           = null)
        {
            using (Texture2D orthoRender = BitmapRenderer.RenderOrthographic(graphicsDevice, model,
                                                                             BitmapRenderer.DEFAULT_BITMAP_SCALE, orthographicModelSize))
            {
                Body body2D = BodyCreator.CreatePolygonBody(orthoRender, world2D, position, bodyType,
                                                            1f, 0f, 1f, triangulationAlgorithm);

                Body3D body3D = new Body3D(model, body2D)
                {
                    BasicEffectParams = basicEffectParams
                };

                return(body3D);
            }
        }
        /// <summary>
        /// Sestaví horizontální řadu identických trojrozměrných simulovatelných objektů.
        /// </summary>
        /// <param name="model">Trojrozměrný model pro vytvoření tvaru.</param>
        /// <param name="world3D">Trojrozměrný svět, do kterého má být trojrozměrná řada zařazena.</param>
        /// <param name="count">Počet objektů tvořících řadu.</param>
        /// <param name="center">Souřadnice středu řady.</param>
        /// <param name="bodyType">Typ vytvořených objektů řady (statické, kinematické nebo dynamické).</param>
        /// <param name="category">Kategorie kolidujících těles.</param>
        /// <param name = "basicEffectParams"> Parametry pro třídu<see cref= "BasicEffect" />.</param>
        public void BuildRow(
            Model model,
            World3D world3D,
            int count,
            Vector2 center    = new Vector2(),
            BodyType bodyType = BodyType.Static,
            BasicEffectParams basicEffectParams = null,
            Category category = Category.Cat31)
        {
            if (count <= 0)
            {
                return;
            }

            Body3D body3D = CreateBody3D(model, center, bodyType, basicEffectParams);

            body3D.Body2D.SetCollisionCategories(category);
            world3D.AddBody3D(body3D);

            if (count == 1)
            {
                return;
            }

            float   xSize    = body3D.BoundingBox.Max.X * 2;
            int     eachSide = count / 2;
            Vector2 position = new Vector2(center.X - xSize, center.Y);

            body3D = CreateBody3D(model, position, bodyType, basicEffectParams);
            body3D.Body2D.SetCollisionCategories(category);
            world3D.AddBody3D(body3D);

            if (count == 2)
            {
                return;
            }

            for (int i = 2; i <= eachSide; i++)
            {
                position = new Vector2(center.X - i * xSize, center.Y);
                body3D   = CreateBody3D(model, position, bodyType, basicEffectParams);
                body3D.Body2D.SetCollisionCategories(category);
                world3D.AddBody3D(body3D);
            }

            for (int i = 1; i < eachSide; i++)
            {
                position = new Vector2(center.X + i * xSize, center.Y);
                body3D   = CreateBody3D(model, position, bodyType, basicEffectParams);
                body3D.Body2D.SetCollisionCategories(category);
                world3D.AddBody3D(body3D);
            }

            if (count % 2 != 0)
            {
                position = new Vector2(center.X + eachSide * xSize, center.Y);
                body3D   = CreateBody3D(model, position, bodyType, basicEffectParams);
                body3D.Body2D.SetCollisionCategories(category);
                world3D.AddBody3D(body3D);
            }
        }
Exemplo n.º 6
0
        protected override void Initialize()
        {
            Vector3 cameraPosition = new Vector3(0f, 4f, 15f);

            camera3D        = new BasicCamera3D(cameraPosition, GraphicsDevice.Viewport.AspectRatio);
            camera3D.Target = new Vector3(0f, 0f, 3f);

            Vector2 gravity = new Vector2(0f, -9.80665f);

            world3D = new World3D(gravity, camera3D);

            #region BasicEffectParams

            Vector3 ambientColor  = Color.Blue.ToVector3();
            Vector3 specularColor = Color.Red.ToVector3();
            float   specularPower = 1f;
            Vector3 emmisiveColor = Color.Black.ToVector3();

            Vector3 directionalLight0Direction     = new Vector3(-1.5f, -1.5f, 1f);
            Vector3 directionalLight0DiffuseColor  = Color.Green.ToVector3();
            Vector3 directionalLight0SpecularColor = Color.Magenta.ToVector3();

            Vector3 directionalLight1Direction     = new Vector3(-1.5f, 1.5f, 0f);
            Vector3 directionalLight1DiffuseColor  = Color.Cyan.ToVector3();
            Vector3 directionalLight1SpecularColor = Color.Yellow.ToVector3();

            Vector3 directionalLight2Direction     = new Vector3(0, 1.5f, 1.5f);
            Vector3 directionalLight2DiffuseColor  = Color.Violet.ToVector3();
            Vector3 directionalLight2SpecularColor = Color.White.ToVector3();

            DirectionalLightParams directionalLight1 =
                new DirectionalLightParams(
                    directionalLight0Direction,
                    directionalLight0DiffuseColor,
                    directionalLight0SpecularColor);

            DirectionalLightParams directionalLight2 =
                new DirectionalLightParams(
                    directionalLight1Direction,
                    directionalLight1DiffuseColor,
                    directionalLight1SpecularColor);

            DirectionalLightParams directionalLight3 =
                new DirectionalLightParams(
                    directionalLight2Direction,
                    directionalLight2DiffuseColor,
                    directionalLight2SpecularColor);;

            FogParams fogParams = new FogParams(Color.CornflowerBlue.ToVector3(), 10f, 25f);

            effectParams =
                new BasicEffectParams(
                    ambientColor,
                    specularColor,
                    specularPower,
                    emmisiveColor,
                    directionalLight1,
                    directionalLight2,
                    directionalLight3,
                    fogParams);

            #endregion BasicEffectParams

            base.Initialize();
        }