1、gltf的资料
官方教程
快速上手
详细教程
2、gltf查看工具
windows系统自带的3D查看器
3、C#生成gltf\glb的类库
3.1 官方的类库
gltfloader.dll类库的项目地址
首先看快速上手里的一个最简单的gltf样例
{
"scenes" : [
{
"nodes" : [ 0 ]
}
],
"nodes" : [
{
"mesh" : 0
}
],
"meshes" : [
{
"primitives" : [ {
"attributes" : {
"POSITION" : 1
},
"indices" : 0
} ]
}
],
"buffers" : [
{
"uri" : "data:application/octet-stream;base64,AAABAAIAAAAAAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAA=",
"byteLength" : 44
}
],
"bufferViews" : [
{
"buffer" : 0,
"byteOffset" : 0,
"byteLength" : 6,
"target" : 34963
},
{
"buffer" : 0,
"byteOffset" : 8,
"byteLength" : 36,
"target" : 34962
}
],
"accessors" : [
{
"bufferView" : 0,
"byteOffset" : 0,
"componentType" : 5123,
"count" : 3,
"type" : "SCALAR",
"max" : [ 2 ],
"min" : [ 0 ]
},
{
"bufferView" : 1,
"byteOffset" : 0,
"componentType" : 5126,
"count" : 3,
"type" : "VEC3",
"max" : [ 1.0, 1.0, 0.0 ],
"min" : [ 0.0, 0.0, 0.0 ]
}
],
"asset" : {
"version" : "2.0"
}
}
然后引用类库里的gltfloader.dll,代码如下,生成的结果跟上面效果一致。
static void Main(string[] args)
{
Gltf gltf = new Gltf();
Scene scene = new Scene();
scene.Name = "test";
scene.Nodes = new int[1] { 0 };
gltf.Scenes = new Scene[1] { scene };
Node node = new Node();
node.Mesh = 0;
gltf.Nodes = new Node[1] { node};
Mesh mesh = new Mesh();
MeshPrimitive meshPrimitive = new MeshPrimitive();
meshPrimitive.Attributes = new Dictionary<string, int>();
meshPrimitive.Attributes.Add("POSITION", 1);
meshPrimitive.Indices = 0;
mesh.Primitives = new MeshPrimitive[1] { meshPrimitive };
gltf.Meshes = new Mesh[1] { mesh};
glTFLoader.Schema.Buffer buffer = new glTFLoader.Schema.Buffer();
buffer.Uri = "data:application/octet-stream;base64,AAABAAIAAAAAAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAA=";
buffer.ByteLength = 44;
gltf.Buffers = new glTFLoader.Schema.Buffer[1] { buffer };
BufferView bufferView1 = new BufferView();
bufferView1.Buffer = 0;
bufferView1.ByteOffset = 0;
bufferView1.ByteLength = 6;
bufferView1.Target = BufferView.TargetEnum.ELEMENT_ARRAY_BUFFER;
BufferView bufferView2 = new BufferView();
bufferView2.Buffer = 0;
bufferView2.ByteOffset = 8;
bufferView2.ByteLength = 36;
bufferView2.Target = BufferView.TargetEnum.ARRAY_BUFFER;
gltf.BufferViews = new BufferView[2] { bufferView1, bufferView2 };
Accessor accessor1 = new Accessor();
accessor1.BufferView = 0;
accessor1.ByteOffset = 0;
accessor1.ComponentType = Accessor.ComponentTypeEnum.UNSIGNED_SHORT;
accessor1.Count = 3;
accessor1.Type = Accessor.TypeEnum.SCALAR;
accessor1.Max = new float[1] { 2 };
accessor1.Min = new float[1] { 0 };
Accessor accessor2 = new Accessor();
accessor2.BufferView = 1;
accessor2.ByteOffset = 0;
accessor2.ComponentType = Accessor.ComponentTypeEnum.FLOAT;
accessor2.Count = 3;
accessor2.Type = Accessor.TypeEnum.VEC3;
accessor2.Max = new float[3] { 1.0f,1.0f,0.0f };
accessor2.Min = new float[3] { 0.0f,0.0f,0.0f };
gltf.Accessors = new Accessor[2] { accessor1,accessor2 };
Asset asset= new Asset();
asset.Version = "2.0";
gltf.Asset = asset;
Interface.SaveModel(gltf,"test.gltf");
Interface.Pack("test.gltf", "test.glb"); //将gltf转化为glb
}
3.2 第三方类库
SharpGLTF
3.3 几何数据
看着上面的url一阵懵逼,那我们能不能用我们能看懂的几何数据呢?
创建几何数据的方法(以创建一个三角形为例):
private static void CreateGeometry()
{
List<int> indexs = new List<int>() { 0, 1, 2,0 };
List<float> vertexs = new List<float>() { 0.0f, 0.0f, 0.0f,0.0f,0.0f,1.0f,1.0f,0.0f,1.0f };
using (FileStream f = File.Create("geometry.bin"))
{
using (BinaryWriter writer = new BinaryWriter(f))
{
foreach (var index in indexs)
{
writer.Write((short)index);
}
foreach (var vt in vertexs)
{
writer.Write(vt);
}
}
}
}
将上面的url改为
buffer.Uri ="geometry.bin"
并在导出gltf和glb之前引用上面的创建几何的方法。
其中索引里{0,1,2,0}中的最后一个0没什么意义,纯粹占位用的,需要保证索引的字节大小是4的倍数。