private static MeshGeometry3D GetMesh(ModelRenderSet renderSet, ModelPrimitiveGroup group) { var mesh = new MeshGeometry3D(); mesh.Positions = renderSet.Geometry.Positions; mesh.TextureCoordinates = renderSet.Geometry.TextureCoordinates; mesh.Normals = renderSet.Geometry.Normals; if (!group.Sectioned) { mesh.TriangleIndices = renderSet.Geometry.TriangleIndices; } else //一般用来显示装甲 { var primitive = renderSet.Geometry.TriangleIndices .Where((v, i) => i >= group.StartIndex && i < group.EndIndex * 3); mesh.TriangleIndices = new Int32Collection(primitive); } return(mesh); }
private static MaterialGroup GetMaterial(ModelPrimitiveGroup group, Model model) { MaterialGroup material = new MaterialGroup(); for (int i = group.Material.Propertys.Count - 1; i >= 0; --i) { var property = group.Material.Propertys[i]; { if (property.Name == "diffuseMap") { var diffusePath = new PackageFileInfo(property.Texture); if (model.Type == Model.ModelType.Collision) { var armor = model.ArmorObject.Armor; var armorValue = (byte)armor.GetArmorValue(group.Material.Identifier); var rgb = waveLengthToRGB(armorValue + 410); var diffuse = new DiffuseMaterial(); var diffuseBrush = new SolidColorBrush(System.Windows.Media.Color.FromArgb(255, 0, 0, 0)); diffuse.Brush = diffuseBrush; diffuse.Color = Colors.Black; diffuse.AmbientColor = Colors.Black; material.Children.Add(diffuse); var emissive = new EmissiveMaterial(); var emissiveBrush = new ImageBrush(); SetImageSource(emissiveBrush, diffusePath); emissiveBrush.TileMode = TileMode.Tile; emissiveBrush.ViewportUnits = BrushMappingMode.Absolute; emissive.Brush = emissiveBrush; material.Children.Add(emissive); } else { var diffuse = new DiffuseMaterial(); ImageBrush diffuseBrush = new ImageBrush(); SetImageSource(diffuseBrush, diffusePath); diffuseBrush.TileMode = TileMode.Tile; diffuseBrush.ViewportUnits = BrushMappingMode.Absolute; diffuse.Brush = diffuseBrush; material.Children.Add(diffuse); } } else if (property.Name == "specularMap") { var specularPath = new PackageFileInfo(property.Texture); var specular = new SpecularMaterial(); ImageBrush specularBrush = new ImageBrush(); SetImageSource(specularBrush, specularPath); specularBrush.TileMode = TileMode.Tile; specularBrush.ViewportUnits = BrushMappingMode.Absolute; specular.Brush = specularBrush; specular.SpecularPower = 20; material.Children.Add(specular); } } } return(material); }