Unity将内部模型转换成stl格式模型,用于3D打印机进行打印
2015-06-08 10:21
681 查看
本章我们一起来看下怎样将unity中的fbx模型转成stl模型并且保存到本地。
原理:stl模型都是由三角面组成的,只要我们了解stl文件的格式,就能够轻松的将fbx模型转换成stl。
1、先获取到fxb模型在Unity中的模型组件GameObject
2、获取模型mesh,得到总的顶点数和三角面数量
3、循环遍历顶点,并将数据写入到本地文件中
具体代码如下:
//go表示模型组件
//vertices用于保存模型顶点数
Vector3[] vertices = go.transform.GetComponent<MeshFilter>().mesh.vertices;
//triangles用于保存模型三角面数
int[] triangles = go.transform.GetComponent<MeshFilter>().mesh.triangles;
int i = 0;
int trianglesCount = triangles.Length;
//计算出stl的大小
int stlSize = 80 + 4 + (trianglesCount + 360) * (4 * 12 + 2);
byte[] stl = new byte[stlSize];
//创建一个文件流用于将数据写入到本地
MemoryStream ms = new MemoryStream(stl);
BinaryWriter writer = new BinaryWriter(ms);
byte[] header = new byte[80];
short _short = 0;
header[0] = 73;
header[1] = 99;
header[2] = 101;
header[3] = 109;
header[4] = 97;
header[5] = 110;
writer.Write(header);
writer.Write(trianglesCount);
//循环遍历顶点,并将数据写入到文件中
for (i = 0; i < trianglesCount; i += 3)
{
writer.Write(0.0f);
writer.Write(0.0f);
writer.Write(0.0f);
writer.Write(vertices[triangles[i]].x);
writer.Write(vertices[triangles[i]].z);
writer.Write(vertices[triangles[i]].y);
writer.Write(vertices[triangles[i + 2]].x);
writer.Write(vertices[triangles[i + 2]].z);
writer.Write(vertices[triangles[i + 2]].y);
writer.Write(vertices[triangles[i + 1]].x);
writer.Write(vertices[triangles[i + 1]].z);
writer.Write(vertices[triangles[i + 1]].y);
writer.Write(_short);
}
writer.Close();
ms.Close();
ms.Dispose();
//将数据保存到本地
File.WriteAllBytes(Application.persistentDataPath + "/" + modelName, stl);
原理:stl模型都是由三角面组成的,只要我们了解stl文件的格式,就能够轻松的将fbx模型转换成stl。
1、先获取到fxb模型在Unity中的模型组件GameObject
2、获取模型mesh,得到总的顶点数和三角面数量
3、循环遍历顶点,并将数据写入到本地文件中
具体代码如下:
//go表示模型组件
//vertices用于保存模型顶点数
Vector3[] vertices = go.transform.GetComponent<MeshFilter>().mesh.vertices;
//triangles用于保存模型三角面数
int[] triangles = go.transform.GetComponent<MeshFilter>().mesh.triangles;
int i = 0;
int trianglesCount = triangles.Length;
//计算出stl的大小
int stlSize = 80 + 4 + (trianglesCount + 360) * (4 * 12 + 2);
byte[] stl = new byte[stlSize];
//创建一个文件流用于将数据写入到本地
MemoryStream ms = new MemoryStream(stl);
BinaryWriter writer = new BinaryWriter(ms);
byte[] header = new byte[80];
short _short = 0;
header[0] = 73;
header[1] = 99;
header[2] = 101;
header[3] = 109;
header[4] = 97;
header[5] = 110;
writer.Write(header);
writer.Write(trianglesCount);
//循环遍历顶点,并将数据写入到文件中
for (i = 0; i < trianglesCount; i += 3)
{
writer.Write(0.0f);
writer.Write(0.0f);
writer.Write(0.0f);
writer.Write(vertices[triangles[i]].x);
writer.Write(vertices[triangles[i]].z);
writer.Write(vertices[triangles[i]].y);
writer.Write(vertices[triangles[i + 2]].x);
writer.Write(vertices[triangles[i + 2]].z);
writer.Write(vertices[triangles[i + 2]].y);
writer.Write(vertices[triangles[i + 1]].x);
writer.Write(vertices[triangles[i + 1]].z);
writer.Write(vertices[triangles[i + 1]].y);
writer.Write(_short);
}
writer.Close();
ms.Close();
ms.Dispose();
//将数据保存到本地
File.WriteAllBytes(Application.persistentDataPath + "/" + modelName, stl);
相关文章推荐
- unity3D 让粒子在UI上播放
- unity, water cube
- unity3d面试经验
- UGUI实现unity摇杆
- windows下安装mysql(mysql-installer-community-5.6.10.1)
- Unity游戏开发的数学与物理 4 ( 在物体运动中加入重力 )
- Unity 相关经典博客资源总结
- Unity3D游戏开发之自由视角下的角色控制
- Unity3D判断当前所在平台
- unity 3D 常见英文单词的中文意思
- Unity3d 游戏中的实时降噪-对Square Enix文档的研究与实现
- Unity3d 游戏中的实时降噪-对Square Enix文档的研究与实现
- Unity3d 获取屏幕depth与normal
- 初识Unity
- Unity3D笔记之OnGUI()下的自适屏
- Unity3D游戏开发-模仿项目一 第一人称角色射击(有源代码)
- Unity UGUI —— 无限循环List
- C# Unity游戏开发——Excel中的数据是如何到游戏中的 (三)
- Unity3D资源管理架构
- unity3d 根据手指触摸的位置去放置UI