123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105 |
- package renderer
- import (
- . "github.com/fogleman/fauxgl"
- "github.com/nfnt/resize"
- "errors"
- "image"
- "log"
- "os"
- "path/filepath"
- "strings"
- )
- const (
- scale = 1
- width = 1000
- height = 1000
- fovy = 10
- near = 1
- far = 40
- )
- var (
- eye = V(-6, -6, 5)
- center = V(0, -0.07, 0)
- up = V(0, 0, 1)
- light = V(-1, -2, 5).Normalize()
- color = ("#42f5b3")
- background = HexColor("#e0e0e0")
- )
- type RenderOption struct {
- Color string
- BackgroundColor string
- Width int
- Height int
- }
- type Renderer struct {
- Option RenderOption
- }
- func New3DRenderer(option RenderOption) *Renderer {
- return &Renderer{
- Option: option,
- }
- }
- func (r *Renderer) RenderModel(filename string) (image.Image, error) {
-
- var mesh *Mesh
- if strings.ToLower(filepath.Ext(filename)) == ".stl" {
- m, err := LoadSTL(filename)
- if err != nil {
- return nil, err
- }
- mesh = m
- } else if strings.ToLower(filepath.Ext(filename)) == ".obj" {
- m, err := LoadOBJ(filename)
- if err != nil {
- return nil, err
- }
- mesh = m
- } else {
- log.Println("Not supported format, given: " + filepath.Ext(filename))
- return nil, errors.New("Not supported model format")
- }
-
- mesh.UnitCube()
-
-
- mesh.SmoothNormalsThreshold(Radians(30))
-
- context := NewContext(r.Option.Width*scale, r.Option.Height*scale)
- context.ClearColorBufferWith(HexColor(r.Option.BackgroundColor))
-
- aspect := float64(width) / float64(height)
- matrix := LookAt(eye, center, up).Perspective(fovy, aspect, near, far)
-
- shader := NewPhongShader(matrix, light, eye)
- shader.ObjectColor = HexColor(r.Option.Color)
- context.Shader = shader
-
- context.DrawMesh(mesh)
-
- image := context.Image()
- image = resize.Resize(width, height, image, resize.Bilinear)
- return image, nil
- }
- func fileExists(filename string) bool {
- info, err := os.Stat(filename)
- if os.IsNotExist(err) {
- return false
- }
- return !info.IsDir()
- }
|