Specify 3D File Save Options in C#
Overview
This article explains how you can save 3D files into different formats after loading them in Scene object using C#. By loading and saving, you can perform number of different conversions e.g.
- Convert FBX to X in C#
- Convert GLTF to OBJ in C#
- Convert OBJ to X in C#
- Convert STL to OBJ in C#
- Convert RVM to 3DS in C#
3D File Save Options
There are several Scene.Save
method overloads that accept a SaveOptions object. This should be an object of a class derived from the SaveOptions
class. Each save format has a corresponding class that holds save options for that save format, for example, there is ColladaSaveOptions
for the FileFormat.Collada
save format.
Use of the Collada Save Options
The C# code below shows how to set save options before saving a 3D file to Collada format.
// For complete examples and data files, please go to https://github.com/aspose-3d/Aspose.3D-for-.NET | |
ColladaSaveOptions saveColladaopts = new ColladaSaveOptions(); | |
// Generates indented XML document | |
saveColladaopts.Indented = true; | |
// The style of node transformation | |
saveColladaopts.TransformStyle = ColladaTransformStyle.Matrix; | |
// Configure the lookup paths to allow importer to find external dependencies. | |
saveColladaopts.LookupPaths = new List<string>(new string[] { "textures" }); |
Use of the Discreet3DS Save Options
The C# code below shows how to set save options before saving a 3D file to a Discreet 3DS format.
// For complete examples and data files, please go to https://github.com/aspose-3d/Aspose.3D-for-.NET | |
// Initialize an object | |
Discreet3dsSaveOptions saveOpts = new Discreet3dsSaveOptions(); | |
// The start base for generating new name for duplicated names. | |
saveOpts.DuplicatedNameCounterBase = 2; | |
// The format of the duplicated counter. | |
saveOpts.DuplicatedNameCounterFormat = "NameFormat"; | |
// The separator between object's name and the duplicated counter. | |
saveOpts.DuplicatedNameSeparator = "Separator"; | |
// Allows to export cameras | |
saveOpts.ExportCamera = true; | |
// Allows to export light | |
saveOpts.ExportLight = true; | |
// Flip the coordinate system | |
saveOpts.FlipCoordinateSystem = true; | |
// Prefer to use gamma-corrected color if a 3ds file provides both original color and gamma-corrected color. | |
saveOpts.GammaCorrectedColor = true; | |
// Use high-precise color which each color channel will use 32bit float. | |
saveOpts.HighPreciseColor = true; | |
// Configure the look up paths to allow importer to find external dependencies. | |
saveOpts.LookupPaths = new List<string>(new string[] { "textures" }); | |
// Set the master scale | |
saveOpts.MasterScale = 1; |
Use of the FBX Save Options
The C# code below shows how to set save options before saving a 3D file to an FBX format.
// For complete examples and data files, please go to https://github.com/aspose-3d/Aspose.3D-for-.NET | |
// Initialize an object | |
FbxSaveOptions saveOpts = new FbxSaveOptions(FileFormat.FBX7500ASCII); | |
// Generates the legacy material properties. | |
saveOpts.ExportLegacyMaterialProperties = true; | |
// Fold repeated curve data using FBX's animation reference count | |
saveOpts.FoldRepeatedCurveData = true; | |
// Always generates material mapping information for geometries if the attached node contains materials. | |
saveOpts.GenerateVertexElementMaterial = true; | |
// Configure the look up paths to allow importer to find external dependencies. | |
saveOpts.LookupPaths = new List<string>(new string[] { "textures" }); | |
// Generates a video object for texture. | |
saveOpts.VideoForTexture = true; |
FBXSaveOptions
also exposes EnableCompression
property which can be used to compress large binary data in the FBX file. Default value of this property is true. Below code snippet explains how can you work with this property while saving a scene.
// For complete examples and data files, please go to https://github.com/aspose-3d/Aspose.3D-for-.NET | |
// Load a 3D document into Aspose.3D | |
Scene scene = Scene.FromFile"document.fbx"); | |
scene.Save("UncompressedDocument.fbx", new FbxSaveOptions(FileFormat.FBX7500ASCII) { EnableCompression = false }); |
Use of the Obj Save Options
The code below shows how to set save options before saving a 3D file to an Obj format.
// For complete examples and data files, please go to https://github.com/aspose-3d/Aspose.3D-for-.NET | |
// Initialize an object | |
ObjSaveOptions saveObjOpts = new ObjSaveOptions(); | |
// Import materials from external material library file | |
saveObjOpts.EnableMaterials = true; | |
// Flip the coordinate system. | |
saveObjOpts.FlipCoordinateSystem = true; | |
// Configure the look up paths to allow importer to find external dependencies. | |
saveObjOpts.LookupPaths = new List<string>(new string[] { "textures" }); | |
// Serialize W component in model's vertex position | |
saveObjOpts.SerializeW = true; | |
// Generate comments for each section | |
saveObjOpts.Verbose = true; |
Use of the STL Save Options
The C# code below shows how to set save options before saving a 3D file to STL format.
// For complete examples and data files, please go to https://github.com/aspose-3d/Aspose.3D-for-.NET | |
// Initialize an object | |
StlSaveOptions saveSTLOpts = new StlSaveOptions(); | |
// Flip the coordinate system. | |
saveSTLOpts.FlipCoordinateSystem = true; | |
// Configure the look up paths to allow importer to find external dependencies. | |
saveSTLOpts.LookupPaths = new List<string>(new string[] { "textures" }); |
Use of the U3D Save Options
The C# code below shows how to set save options before saving a document to U3D format.
// For complete examples and data files, please go to https://github.com/aspose-3d/Aspose.3D-for-.NET | |
// Initialize an object | |
U3dSaveOptions saveU3DOptions = new U3dSaveOptions(); | |
// Export normal data. | |
saveU3DOptions.ExportNormals = true; | |
// Export the texture coordinates. | |
saveU3DOptions.ExportTextureCoordinates = true; | |
// Export the vertex diffuse color. | |
saveU3DOptions.ExportVertexDiffuse = true; | |
// Export vertex specular color | |
saveU3DOptions.ExportVertexSpecular = true; | |
// Flip the coordinate system. | |
saveU3DOptions.FlipCoordinateSystem = true; | |
// Configure the look up paths to allow importer to find external dependencies. | |
saveU3DOptions.LookupPaths = new List<string>(new string[] { "textures/" }); | |
// Compress the mesh data | |
saveU3DOptions.MeshCompression = true; |
Use of the glTF Save Options
The C# code below shows how to set save options before saving a document to glTF format.
// For complete examples and data files, please go to https://github.com/aspose-3d/Aspose.3D-for-.NET | |
// Initialize Scene object | |
Scene scene = new Scene(); | |
// Create a child node | |
scene.RootNode.CreateChildNode("sphere", new Sphere()); | |
// Set glTF saving options. The code example embeds all assets into the target file usually a glTF file comes with some dependencies, a bin file for model's vertex/indices, two .glsl files for vertex/fragment shaders | |
// Use opt.EmbedAssets to tells the Aspose.3D API to export scene and embed the dependencies inside the target file. | |
GltfSaveOptions opt = new GltfSaveOptions(FileContentType.ASCII); | |
opt.EmbedAssets = true; | |
// Use KHR_materials_common extension to define the material, thus no GLSL files are generated. | |
opt.UseCommonMaterials = true; | |
// Customize the name of the buffer file which defines model | |
opt.BufferFile = "mybuf.bin"; | |
// Save GlTF file | |
scene.Save("glTFSaveOptions_out.gltf", opt); | |
// Save a binary glTF file using KHR_binary_glTF extension | |
scene.Save("glTFSaveOptions_out.glb"); | |
// Developers may use saving options to create a binary glTF file using KHR_binary_glTF extension | |
GltfSaveOptions opts = new GltfSaveOptions(FileContentType.Binary); | |
scene.Save("Test_out.glb", opts); |
PrettyPrint in glTF Save Options
You can also use PrettyPrint property of GLTFSaveOptions class for human-understandable JSON print. The code below shows how to use this functionality.
// For complete examples and data files, please go to https://github.com/aspose-3d/Aspose.3D-for-.NET | |
// Initialize 3D scene | |
Scene scene = new Scene(new Sphere()); | |
// Initialize GltfSaveOptions | |
GltfSaveOptions opt = new GltfSaveOptions(FileFormat.GLTF2); | |
// The JSON content of GLTF file is indented for human reading, default value is false | |
opt.PrettyPrint = true; | |
// Save 3D Scene | |
scene.Save("prettyPrintInGltfSaveOption.gltf", opt); |
Save Dependencies of a 3D Scene in the Real File System
Developers may require to save all 3D scene dependencies in the real file system. They can define the path of a local directory, save in the MemoryFileSystem
object or simply discard dependencies. The FileSystem
property is added in the all save option classes.
Discard Saving the Material Files
// For complete examples and data files, please go to https://github.com/aspose-3d/Aspose.3D-for-.NET | |
// The code example uses the DummyFileSystem, so the material files are not created. | |
// Initialize Scene object | |
Scene scene = new Scene(); | |
// Create a child node | |
scene.RootNode.CreateChildNode("sphere", new Sphere()).Material = new PhongMaterial(); | |
// Set saving options | |
ObjSaveOptions opt = new ObjSaveOptions(); | |
opt.FileSystem = new DummyFileSystem(); | |
// Save 3D scene | |
scene.Save("DiscardSavingMaterial_out.obj", opt); |
Save Dependencies in the Local Directory
// For complete examples and data files, please go to https://github.com/aspose-3d/Aspose.3D-for-.NET | |
// The code example uses the LocalFileSystem class to save dependencies to the local directory. | |
// Initialize Scene object | |
Scene scene = new Scene(); | |
// Create a child node | |
scene.RootNode.CreateChildNode("sphere", new Sphere()).Material = new PhongMaterial(); | |
// Set saving options | |
ObjSaveOptions opt = new ObjSaveOptions(); | |
opt.FileSystem = new LocalFileSystem("local_dir/"); | |
// Save 3D scene | |
scene.Save"SavingDependenciesInLocalDirectory_out.obj", opt); |
Save Dependencies in the MemoryFileSystem Object
// For complete examples and data files, please go to https://github.com/aspose-3d/Aspose.3D-for-.NET | |
// The code example uses the MemoryFileSystem to intercepts the dependencies writing. | |
// Initialize Scene object | |
Scene scene = new Scene(); | |
// Create a child node | |
scene.RootNode.CreateChildNode("sphere", new Sphere()).Material = new PhongMaterial(); | |
// Set saving options | |
ObjSaveOptions opt = new ObjSaveOptions(); | |
MemoryFileSystem mfs = new MemoryFileSystem(); | |
opt.FileSystem = mfs; | |
// Save 3D scene | |
scene.Save("SavingDependenciesInMemoryFileSystem_out.obj", opt); | |
// Get the test.mtl file content | |
byte[] mtl = mfs.GetFileContent("SavingDependenciesInMemoryFileSystem_out.mtl"); | |
File.WriteAllBytes("Material.mtl", mtl); |
Use of the Google Draco (.drc) Save Options
The C# code below shows how to set save options before saving a 3D model to DRC format.
// For complete examples and data files, please go to https://github.com/aspose-3d/Aspose.3D-for-.NET | |
// Initialize Scene object | |
Scene scene = new Scene(); | |
// Create a child node | |
scene.RootNode.CreateChildNode("sphere", new Sphere()); | |
// Initialize .DRC saving options. | |
DracoSaveOptions opts = new DracoSaveOptions(); | |
// Quantization bits for position | |
opts.PositionBits = 14; | |
// Quantization bits for texture coordinate | |
opts.TextureCoordinateBits = 8; | |
// Quantization bits for vertex color | |
opts.ColorBits = 10; | |
// Quantization bits for normal vectors | |
opts.NormalBits = 7; | |
// Set compression level | |
opts.CompressionLevel = DracoCompressionLevel.Optimal; | |
// Save Google Draco (.drc) file | |
scene.Save("DRCSaveOptions_out.drc", opts); |
Use of the RVM Save Options
The C# code below shows how to set save options before saving a 3D model to RVM format.
// For complete examples and data files, please go to https://github.com/aspose-3d/Aspose.3D-for-.NET | |
Scene scene = new Scene(); | |
var node = scene.RootNode.CreateChildNode("Box", new Box()); | |
node.SetProperty("rvm:Refno", "=3462123"); | |
node.SetProperty("rvm:Description", "This is the description of the box"); | |
//The RVM attribute's prefix is rvm:, all properties that starts with rvm: will be exported to .att file(the prefix will be removed) | |
var opt = new RvmSaveOptions() { AttributePrefix = "rvm:", ExportAttributes = true }; | |
scene.Save( "test.rvm", opt); |