-
Notifications
You must be signed in to change notification settings - Fork 12
/
main.go
63 lines (55 loc) · 1.44 KB
/
main.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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
package main
import (
"log"
"github.com/unixpickle/model3d"
"github.com/unixpickle/model3d/model2d"
"github.com/unixpickle/model3d/render3d"
)
const (
Scale = 0.003
Width = 682 * Scale
Height = 573 * Scale
Depth = 0.06
TextDepth = 0.1
)
func main() {
solid := &Solid{
Body: model2d.MeshToCollider(
model2d.MustReadBitmap("body.png", nil).FlipY().Mesh().Blur(0.25).Blur(0.25),
),
Text: model2d.MeshToCollider(
model2d.MustReadBitmap("text.png", nil).FlipY().Mesh().Blur(0.25).Blur(0.25),
),
}
log.Println("Creating mesh...")
mesh := model3d.MarchingCubesSearch(solid, 0.005, 8)
log.Println("Smoothing...")
mesh = mesh.SmoothAreas(0.05, 50)
log.Println("Flattening...")
mesh = mesh.FlattenBase(0)
log.Println("Eliminating co-planar...")
mesh = mesh.EliminateCoplanar(1e-8)
log.Println("Saving...")
mesh.SaveGroupedSTL("tag.stl")
render3d.SaveRandomGrid("rendering.png", mesh, 3, 3, 300, nil)
}
type Solid struct {
Body model2d.Collider
Text model2d.Collider
}
func (s *Solid) Min() model3d.Coord3D {
return model3d.Coord3D{}
}
func (s *Solid) Max() model3d.Coord3D {
return model3d.Coord3D{X: Width, Y: Height, Z: TextDepth}
}
func (s *Solid) Contains(c model3d.Coord3D) bool {
if !model3d.InBounds(s, c) {
return false
}
c2d := c.Coord2D().Scale(1 / Scale)
if c.Z < Depth && model2d.ColliderContains(s.Body, c2d, 0) {
return true
}
return c.Z < TextDepth && model2d.ColliderContains(s.Text, c2d, 0)
}