g3n/engine

Is there a place where I can see examples of using g3n?

kimchijoa opened this issue · 3 comments

Hello, I'm trying to create a 3d modeling viewer using g3n-engine now.

However, I am having difficulty using it because there are not many examples of use.

There are parts of g3nd(Demo) and g3n that behave differently, so I want to see an example of this, where can I see it?

When I create a 3d modeling viewer based on g3nd, I can't play animation because it becomes nil pointer in certain parts.

I want to see an example of using animation in gtlf loader. Thank you.

type GltfLoader struct {
	prevLoaded core.INode
	anims      animation.Animation
}

var t *GltfLoader

...(main func inner)....
for i := range g.Animations {
		anim, err := g.LoadAnimation(i)
		anim.SetLoop(true)
		t.anims = append(t.anims, anim)    <--- this is nil pointer
		if err != nil {
			fmt.Println("Load Animation Err : ", err)
		}
	}


Hi! G3ND uses the most recent tagged version of G3N, which is older than the latest commit. I'd guess that's why you're seeing discrepancies. The G3ND example loader -> gltf shows GLTF animations that you could use as starting point. If you find a bug, please post a minimal reproducible example and I or someone else may be able to take a look.

Thank you for the comments. Come to think of it, I didn't post the example code I wrote. I will attach the code I used below Could you have a look at it?

//main.go

package main

import (
	"fmt"
	"path/filepath"
	"time"

	"github.com/g3n/engine/animation"
	"github.com/g3n/engine/app"
	"github.com/g3n/engine/camera"
	"github.com/g3n/engine/core"
	"github.com/g3n/engine/gls"
	"github.com/g3n/engine/gui"
	"github.com/g3n/engine/light"
	"github.com/g3n/engine/loader/gltf"
	"github.com/g3n/engine/math32"
	"github.com/g3n/engine/renderer"
	"github.com/g3n/engine/util/helper"
	"github.com/g3n/engine/window"
)

type GltfLoader struct {
	prevLoaded core.INode
	anims      animation.Animation
}

var t *GltfLoader

func main() {
	fmt.Println("Create app, camera")
	// Create application and scene
	a := app.App(1920, 1080, "g3n Test")
	scene := core.NewNode()

	// Set the scene to be managed by the gui manager
	gui.Manager().Set(scene)

	// Create perspective camera
	cam := camera.New(1)
	cam.SetPosition(0, 0, 3)
	scene.Add(cam)

	// Set up orbit control for the camera
	camera.NewOrbitControl(cam)

	// Set up callback to update viewport and camera aspect ratio when the window is resized
	onResize := func(evname string, ev interface{}) {
		// Get framebuffer size and update viewport accordingly
		width, height := a.GetSize()
		a.Gls().Viewport(0, 0, int32(width), int32(height))
		// Update the camera's aspect ratio
		cam.SetAspect(float32(width) / float32(height))
	}
	a.Subscribe(window.OnWindowSize, onResize)
	onResize("", nil)

	//====================================================================================================================================================
	//Create and add loader
	fmt.Println("Create external gtlf file model")
	fpath := "C:/Users/kh/Documents/golang/src/g3n-engine/test-gltf/BrainStem.gltf" //<-- local gltf file

	fmt.Println("read file")
	ext := filepath.Ext(fpath)
	var g *gltf.GLTF
	var err error

	//check extension
	fmt.Println("== ext is : ", ext)
	if ext == ".gltf" {
		g, err = gltf.ParseJSON(fpath)
	} else if ext == ".glb" {
		g, err = gltf.ParseBin(fpath)
	}

	if err != nil {
		fmt.Println("err Parse : ", err)
		return
	}

	defaultScenIdx := 0
	if g.Scene != nil {
		defaultScenIdx = *g.Scene
	}
	fmt.Println("Load Mesh")
	n, err := g.LoadMesh(defaultScenIdx)
	if err != nil {
		fmt.Println("Load Failed : ", err)
		return
	}

	fmt.Println("Looping Animation")
	for i := range g.Animations {
		anim, err := g.LoadAnimation(i)
		anim.SetLoop(true)
		t.anims = append(t.anims, anim)   //<=== #ISUUE t.ainms is nullPoint 
		if err != nil {
			fmt.Println("Load Animation Err : ", err)
		}
	}
	fmt.Println("add Scene")
	scene.Add(n)
	//====================================================================================================================================================

	// Create and add lights to the scene
	scene.Add(light.NewAmbient(&math32.Color{1.0, 1.0, 1.0}, 0.8))
	pointLight := light.NewPoint(&math32.Color{1, 1, 1}, 5.0)
	pointLight.SetPosition(1, 0, 2)
	scene.Add(pointLight)

	// Create and add an axis helper to the scene
	scene.Add(helper.NewAxes(0.5))

	// Set background color to gray
	a.Gls().ClearColor(0.5, 0.5, 0.5, 1.0)

	// Run the application
	a.Run(func(renderer *renderer.Renderer, deltaTime time.Duration) {
		a.Gls().Clear(gls.DEPTH_BUFFER_BIT | gls.STENCIL_BUFFER_BIT | gls.COLOR_BUFFER_BIT)
		renderer.Render(scene, cam)
		//Loop Animation
		for _, anim := range t.anims {
			anim.Update(float32(deltaTime.Seconds()))
		}
	})
}