-
Notifications
You must be signed in to change notification settings - Fork 0
/
mesh.go
49 lines (40 loc) · 1.26 KB
/
mesh.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
package binvox
import (
"log"
gl "github.com/fogleman/fauxgl"
)
// ToMesh converts a BinVOX to a mesh.
func (b *BinVOX) ToMesh() *gl.Mesh {
log.Printf("Generating mesh for %v voxels...", len(b.WhiteVoxels)+len(b.ColorVoxels))
voxels := []gl.Voxel{}
keyFunc := func(v Key) {
voxels = append(voxels, gl.Voxel{X: v.X, Y: v.Y, Z: v.Z})
}
for v := range b.WhiteVoxels {
keyFunc(v)
}
for v := range b.ColorVoxels {
keyFunc(v)
}
mesh := gl.NewVoxelMesh(voxels)
log.Printf("Done generating mesh with %v triangles and %v lines.", len(mesh.Triangles), len(mesh.Lines))
mbb := mesh.BoundingBox()
log.Printf("Mesh MBB in voxel units = %v", mbb)
log.Println("Moving the mesh back into its original position...")
t1 := gl.V(0.5, 0.5, 0.5)
log.Printf("Translating by %v", t1)
mbb.Min = mbb.Min.Add(t1)
mbb.Max = mbb.Max.Add(t1)
log.Printf("Translated mesh MBB in voxel units = %v", mbb)
vpmm := b.VoxelsPerMM()
mmpv := 1.0 / vpmm
s := gl.V(mmpv, mmpv, mmpv) // uniform scaling
log.Printf("Scaling by %v millimeters per voxel", mmpv)
t2 := gl.V(b.TX, b.TY, b.TZ)
log.Printf("Translating by %v", t2)
m := gl.Identity().Translate(t1).Scale(s).Translate(t2)
mesh.Transform(m)
mbb = mesh.BoundingBox()
log.Printf("Done moving mesh to MBB=%v", mbb)
return mesh
}