天天看点

利用gltfloader.dll或者SharpGLTF生成gltf、glb数据1、gltf的资料2、gltf查看工具3、C#生成gltf\glb的类库

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的倍数。

继续阅读