/// <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)); }
/// <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); }
/// <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); } }
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(); }