package module
v0.0.0-...-c605f1e Latest Latest

This package is not in the latest version of its module.

Go to latest
Published: May 28, 2023 License: MIT Imports: 9 Imported by: 7


license GoDoc Go Report Card


gwob - Pure Go Golang parser for Wavefront .OBJ 3D geometry file format


Install with Go Modules (Go 1.11 or higher)

git clone
cd gwob
go install

Install without Go Modules (Go before 1.11)

go get
cd ~/go/src/
go install


Import the package in your Go program:

import ""


// Error handling omitted for simplicity.

import ""

options := &gwob.ObjParserOptions{} // parser options

o, errObj := gwob.NewObjFromFile("gopher.obj", options) // parse/load OBJ

// Scan OBJ groups
for _, g := range o.Groups {
    // ...


Run the example:

cd example
go run main.go

You can supply a custom input OBJ by setting the env var INPUT:

INPUT=gopher.obj go run main.go

If you specify any command line argument, the OBJ will be dumped to stdout:

go run main.go d

See directory example.


See the GoDoc documentation.



Package gwob is a pure Go parser for Wavefront .OBJ 3D geometry file format.


// Error handling omitted for simplicity.

import ""

options := &gwob.ObjParserOptions{} // parser options

o, errObj := gwob.NewObjFromFile("gopher.obj", options) // parse

// Scan OBJ groups
for _, g := range o.Groups {
    // snip

See also:



View Source
const (
	ErrFatal    = true  // ErrFatal means fatal stream error
	ErrNonFatal = false // ErrNonFatal means non-fatal parsing error

Internal parsing error


This section is empty.


This section is empty.


type Group

type Group struct {
	Name       string
	Smooth     int
	Usemtl     string
	IndexBegin int
	IndexCount int

Group holds parser result for a group.

type Material

type Material struct {
	Name  string
	MapKd string
	MapKa string
	MapKs string
	MapD  string
	Bump  string
	MapKe string
	Kd    [3]float32
	Ka    [3]float32
	Ks    [3]float32
	Ns    float32
	Ni    float32
	Illum int
	D     float32
	Tr    float32

Material holds information for a material. Kd - diffuse color. Ka - ambient color. Ks - specular color. Ns - specular exponent. Ni - optical density aka. index of refraction. Illum - illumination model enum id. D / Tr - trasparency (Tr = 1 - D) MapKa - ambient map MapKd - diffuse map MapKs - specular map MapD - scalar procedural texture map Bump/map_Bump - bump texture map - modify surface normal Ke/MapKe - emissive map - extension

type MaterialLib

type MaterialLib struct {
	Lib map[string]*Material

MaterialLib stores materials.

func NewMaterialLib

func NewMaterialLib() MaterialLib

NewMaterialLib creates a new material lib.

func ReadMaterialLibFromBuf

func ReadMaterialLibFromBuf(buf []byte, options *ObjParserOptions) (MaterialLib, error)

ReadMaterialLibFromBuf parses material lib from a buffer.

func ReadMaterialLibFromFile

func ReadMaterialLibFromFile(filename string, options *ObjParserOptions) (MaterialLib, error)

ReadMaterialLibFromFile parses material lib from a file.

func ReadMaterialLibFromReader

func ReadMaterialLibFromReader(rd io.Reader, options *ObjParserOptions) (MaterialLib, error)

ReadMaterialLibFromReader parses material lib from a reader.

func ReadMaterialLibFromStringReader

func ReadMaterialLibFromStringReader(rd StringReader, options *ObjParserOptions) (MaterialLib, error)

ReadMaterialLibFromStringReader parses material lib from StringReader.

type Obj

type Obj struct {
	Indices []int
	Coord   []float32 // vertex data pos=(x,y,z) tex=(tx,ty) norm=(nx,ny,nz)
	Mtllib  string
	Groups  []*Group

	BigIndexFound  bool // index larger than 65535
	TextCoordFound bool // texture coord
	NormCoordFound bool // normal coord

	StrideSize           int // (px,py,pz),(tu,tv),(nx,ny,nz) = 8 x 4-byte floats = 32 bytes max
	StrideOffsetPosition int // 0
	StrideOffsetTexture  int // 3 x 4-byte floats
	StrideOffsetNormal   int // 5 x 4-byte floats

Obj holds parser result for .obj file.

func NewObjFromBuf

func NewObjFromBuf(objName string, buf []byte, options *ObjParserOptions) (*Obj, error)

NewObjFromBuf parses Obj from a buffer.

func NewObjFromFile

func NewObjFromFile(filename string, options *ObjParserOptions) (*Obj, error)

NewObjFromFile parses Obj from a file.

func NewObjFromReader

func NewObjFromReader(objName string, rd io.Reader, options *ObjParserOptions) (*Obj, error)

NewObjFromReader parses Obj from a reader.

func NewObjFromStringReader

func NewObjFromStringReader(objName string, rd StringReader, options *ObjParserOptions) (*Obj, error)

NewObjFromStringReader parses Obj from a StringReader.

func NewObjFromVertex

func NewObjFromVertex(objName string, coord []float32, indices []int) (*Obj, error)

NewObjFromVertex creates Obj from vertex data.

func (*Obj) Coord64

func (o *Obj) Coord64(i int) float64

Coord64 gets vertex data as float64.

func (*Obj) NumberOfElements

func (o *Obj) NumberOfElements() int

NumberOfElements gets the number of strides.

func (*Obj) ToFile

func (o *Obj) ToFile(filename string) error

ToFile saves OBJ to file.

func (*Obj) ToWriter

func (o *Obj) ToWriter(w io.Writer) error

ToWriter writes OBJ to writer stream.

func (*Obj) VertexCoordinates

func (o *Obj) VertexCoordinates(stride int) (float32, float32, float32)

VertexCoordinates gets vertex coordinates for a stride index.

type ObjParserOptions

type ObjParserOptions struct {
	LogStats      bool
	Logger        func(string)
	IgnoreNormals bool

ObjParserOptions sets options for the parser.

type StringReader

type StringReader interface {
	ReadString(delim byte) (string, error) // Example: bufio.Reader

StringReader is input for the parser.


Path Synopsis
Package main shows how to use the 'gwob' package to parse geometry data from OBJ files.
Package main shows how to use the 'gwob' package to parse geometry data from OBJ files.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL