comments
This commit is contained in:
parent
5041e92871
commit
7acdc03776
|
@ -0,0 +1 @@
|
|||
*.gltf
|
48
convert.go
48
convert.go
|
@ -15,6 +15,7 @@ func Convert(stl STL, outFile string) {
|
|||
normalBuf := make([]byte, 0)
|
||||
positionBuf := make([]byte, 0)
|
||||
|
||||
// padding each buffer part
|
||||
padding := func(buf []byte) []byte {
|
||||
log.Println("padding: ", len(buf)%4)
|
||||
for len(buf)%4 != 0 {
|
||||
|
@ -24,22 +25,23 @@ func Convert(stl STL, outFile string) {
|
|||
return buf
|
||||
}
|
||||
|
||||
// 写入顶点
|
||||
// positions to byte
|
||||
for i := range stl.TriangleNum {
|
||||
t := stl.Triangles[i]
|
||||
positionBuf = append(positionBuf, t.Position...)
|
||||
}
|
||||
positionBuf = padding(positionBuf)
|
||||
|
||||
// 写入法向量
|
||||
// normals to byte
|
||||
for i := range stl.TriangleNum {
|
||||
t := stl.Triangles[i]
|
||||
// each position, write 3 times
|
||||
normalBuf = append(normalBuf, t.Normal...)
|
||||
normalBuf = append(normalBuf, t.Normal...)
|
||||
normalBuf = append(normalBuf, t.Normal...)
|
||||
}
|
||||
normalBuf = padding(normalBuf)
|
||||
// 写入索引
|
||||
// indices to byte
|
||||
for i := range stl.TriangleNum * 3 {
|
||||
buf := make([]byte, 4)
|
||||
binary.LittleEndian.PutUint32(buf, uint32(i))
|
||||
|
@ -49,22 +51,24 @@ func Convert(stl STL, outFile string) {
|
|||
|
||||
log.Println(len(positionBuf), len(normalBuf), len(indexBuf))
|
||||
|
||||
// concat
|
||||
allData := make([]byte, 0)
|
||||
allData = append(allData, indexBuf...)
|
||||
allData = append(allData, normalBuf...)
|
||||
allData = append(allData, positionBuf...)
|
||||
|
||||
allData = append(allData, indexBuf...) // Indices: 0
|
||||
allData = append(allData, normalBuf...) // attributes["NORMAL"] = 1
|
||||
allData = append(allData, positionBuf...) // attributes["POSITION"] = 2
|
||||
|
||||
base := base64.StdEncoding.EncodeToString(allData)
|
||||
|
||||
attributes := make(map[string]int, 0)
|
||||
attributes["POSITION"] = 2
|
||||
attributes["NORMAL"] = 1
|
||||
attributes["POSITION"] = 2
|
||||
|
||||
gltf := GLTF{
|
||||
Asset: Asset{Version: "2.0"},
|
||||
Scenes: []Scene{{Nodes: []int{0}}},
|
||||
Nodes: []Node{{Mesh: 0}},
|
||||
Meshes: []Mesh{{Primitives: []Primitive{{Attributes: attributes, Indices: 0, Mode: 4}}}},
|
||||
// ByteLength not length after base64
|
||||
Buffers: []Buffer{{Uri: fmt.Sprintf("data:application/gltf-buffer;base64,%s", base), ByteLength: len(allData)}},
|
||||
BufferViews: []BufferView{
|
||||
// index
|
||||
|
@ -72,58 +76,58 @@ func Convert(stl STL, outFile string) {
|
|||
Buffer: 0,
|
||||
ByteOffset: 0,
|
||||
ByteLength: len(indexBuf),
|
||||
Target: 34963,
|
||||
Target: 34963, // ELEMENT_ARRAY_BUFFER float indices
|
||||
},
|
||||
// normal
|
||||
{
|
||||
Buffer: 0,
|
||||
ByteOffset: len(indexBuf),
|
||||
ByteLength: len(normalBuf),
|
||||
Target: 34962,
|
||||
Target: 34962, // ARRAY_BUFFER int vertex
|
||||
},
|
||||
// position
|
||||
{
|
||||
Buffer: 0,
|
||||
// ByteOffset: len(indexBuf),
|
||||
ByteOffset: len(indexBuf) + len(normalBuf),
|
||||
ByteLength: len(positionBuf),
|
||||
Target: 34962,
|
||||
Target: 34962, // ARRAY_BUFFER int vertex
|
||||
},
|
||||
},
|
||||
Accessors: []Accessor{
|
||||
{
|
||||
BufferView: 0,
|
||||
ByteOffset: 0,
|
||||
ComponentType: 5125,
|
||||
Type: "SCALAR",
|
||||
Count: stl.TriangleNum * 3,
|
||||
ComponentType: 5125, // uint ; 5124 int will loss model parts
|
||||
Type: "SCALAR", // index
|
||||
Count: stl.TriangleNum * 3, // 1 index : 1 position
|
||||
},
|
||||
{
|
||||
BufferView: 1,
|
||||
ByteOffset: 0,
|
||||
ComponentType: 5126,
|
||||
ComponentType: 5126, // float
|
||||
Type: "VEC3",
|
||||
Count: stl.TriangleNum * 3,
|
||||
Max: []float32{1, 1, 1},
|
||||
Count: stl.TriangleNum * 3, // 1 normal : 1 position
|
||||
Max: []float32{1, 1, 1}, // or cal from stl data
|
||||
Min: []float32{-1, -1, -1},
|
||||
},
|
||||
{
|
||||
BufferView: 2,
|
||||
ByteOffset: 0,
|
||||
ComponentType: 5126,
|
||||
ComponentType: 5126, // float
|
||||
Type: "VEC3",
|
||||
Count: len(positionBuf) / 12,
|
||||
Max: stl.Max,
|
||||
Count: len(positionBuf) / 12,// xyz = 4x3; or stl.TriangleNum * 3
|
||||
Max: stl.Max, // cal from stl data
|
||||
Min: stl.Min,
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
// or not indent
|
||||
data, err := json.MarshalIndent(gltf, " ", " ")
|
||||
if err != nil {
|
||||
log.Println("marshal error: ", err.Error())
|
||||
return
|
||||
}
|
||||
// output
|
||||
os.Remove(outFile)
|
||||
f, err := os.OpenFile(outFile, os.O_CREATE, os.ModePerm)
|
||||
if err != nil {
|
||||
|
|
19
data.go
19
data.go
|
@ -11,18 +11,17 @@ type Triangle struct {
|
|||
XYZ []float32
|
||||
}
|
||||
|
||||
func (t Triangle) EuqalsPosition(position []byte) bool {
|
||||
x1 := binary.LittleEndian.Uint32(position[:4])
|
||||
y1 := binary.LittleEndian.Uint32(position[4:8])
|
||||
z1 := binary.LittleEndian.Uint32(position[8:12])
|
||||
|
||||
x2 := binary.LittleEndian.Uint32(t.Position[:4])
|
||||
y2 := binary.LittleEndian.Uint32(t.Position[4:8])
|
||||
z2 := binary.LittleEndian.Uint32(t.Position[8:12])
|
||||
|
||||
return x1 == x2 && y1 == y2 && z1 == z2
|
||||
}
|
||||
//
|
||||
// header num
|
||||
// |----80B------|-4B-|-----triangle1--------|--------triangle2-------|-----------...
|
||||
|
||||
// Normal(xyz) 4 x 3 position1 position2 position3 attribute
|
||||
// each triangle: |--------12--------|--------12--------|--------12--------|--------12--------|---2-------|
|
||||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
type STL struct {
|
||||
Header string
|
||||
TriangleNum int
|
||||
|
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
5
load.go
5
load.go
|
@ -12,8 +12,11 @@ func Load(filePath string) (stl STL) {
|
|||
if err != nil {
|
||||
log.Panic("open file " + filePath + " error: " + err.Error())
|
||||
}
|
||||
|
||||
// load 80 header
|
||||
headerBuf := make([]byte, 80)
|
||||
file.Read(headerBuf)
|
||||
// int32
|
||||
triangleNumBuf := make([]byte, 4)
|
||||
file.Read(triangleNumBuf)
|
||||
|
||||
|
@ -30,7 +33,7 @@ func Load(filePath string) (stl STL) {
|
|||
|
||||
positionBuf := make([]byte, 4*3*3)
|
||||
file.Read(positionBuf)
|
||||
|
||||
// find max/min xyz
|
||||
for r := range 3 {
|
||||
x := math.Float32frombits(binary.LittleEndian.Uint32(positionBuf[:4+(r*4)]))
|
||||
y := math.Float32frombits(binary.LittleEndian.Uint32(positionBuf[(r * 4) : (r*4)+4]))
|
||||
|
|
Loading…
Reference in New Issue