New example models/m3d_loading
This commit is contained in:
parent
f465c30447
commit
9782760778
2 changed files with 156 additions and 0 deletions
BIN
examples/models/m3d_loading/cesium_man.m3d
Normal file
BIN
examples/models/m3d_loading/cesium_man.m3d
Normal file
Binary file not shown.
156
examples/models/m3d_loading/main.go
Normal file
156
examples/models/m3d_loading/main.go
Normal file
|
@ -0,0 +1,156 @@
|
||||||
|
/*******************************************************************************************
|
||||||
|
*
|
||||||
|
* raylib [models] example - Load models M3D
|
||||||
|
*
|
||||||
|
* Example originally created with raylib 4.5, last time updated with raylib 4.5
|
||||||
|
*
|
||||||
|
* Example contributed by bzt (@bztsrc) and reviewed by Ramon Santamaria (@raysan5)
|
||||||
|
*
|
||||||
|
* NOTES:
|
||||||
|
* - Model3D (M3D) fileformat specs: https://gitlab.com/bztsrc/model3d
|
||||||
|
* - Bender M3D exported: https://gitlab.com/bztsrc/model3d/-/tree/master/blender
|
||||||
|
*
|
||||||
|
* Example licensed under an unmodified zlib/libpng license, which is an OSI-certified,
|
||||||
|
* BSD-like license that allows static linking with closed source software
|
||||||
|
*
|
||||||
|
* Copyright (c) 2022-2024 bzt (@bztsrc)
|
||||||
|
*
|
||||||
|
********************************************************************************************/
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"unsafe"
|
||||||
|
|
||||||
|
"github.com/gen2brain/raylib-go/raylib"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
screenWidth = 800
|
||||||
|
screenHeight = 450
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
// Initialization
|
||||||
|
rl.InitWindow(screenWidth, screenHeight, "raylib [models] example - M3D model loading")
|
||||||
|
|
||||||
|
// Define the camera to look into our 3d world
|
||||||
|
camera := rl.Camera{
|
||||||
|
Position: rl.NewVector3(1.5, 1.5, 1.5),
|
||||||
|
Target: rl.NewVector3(0.0, 0.4, 0.0),
|
||||||
|
Up: rl.NewVector3(0.0, 1.0, 0.0),
|
||||||
|
Fovy: 45.0,
|
||||||
|
Projection: rl.CameraPerspective,
|
||||||
|
}
|
||||||
|
|
||||||
|
position := rl.NewVector3(0.0, 0.0, 0.0)
|
||||||
|
|
||||||
|
modelFileName := "cesium_man.m3d"
|
||||||
|
drawMesh := true
|
||||||
|
drawSkeleton := true
|
||||||
|
animPlaying := false // Store anim state, what to draw
|
||||||
|
|
||||||
|
// Load model
|
||||||
|
model := rl.LoadModel(modelFileName)
|
||||||
|
|
||||||
|
// Load animations
|
||||||
|
|
||||||
|
animFrameCounter := 0
|
||||||
|
animID := 0
|
||||||
|
anims := rl.LoadModelAnimations(modelFileName)
|
||||||
|
animsCount := int32(len(anims))
|
||||||
|
|
||||||
|
rl.DisableCursor()
|
||||||
|
rl.SetTargetFPS(60)
|
||||||
|
|
||||||
|
// Main game loop
|
||||||
|
for !rl.WindowShouldClose() {
|
||||||
|
// Update
|
||||||
|
rl.UpdateCamera(&camera, rl.CameraFirstPerson)
|
||||||
|
|
||||||
|
if animsCount > 0 {
|
||||||
|
// Play animation when space bar is held down (or step one frame with N)
|
||||||
|
if rl.IsKeyDown(rl.KeySpace) || rl.IsKeyPressed(rl.KeyN) {
|
||||||
|
animFrameCounter++
|
||||||
|
if animFrameCounter >= int(anims[animID].FrameCount) {
|
||||||
|
animFrameCounter = 0
|
||||||
|
}
|
||||||
|
rl.UpdateModelAnimation(model, anims[animID], int32(animFrameCounter))
|
||||||
|
animPlaying = true
|
||||||
|
}
|
||||||
|
|
||||||
|
// Select animation by pressing C
|
||||||
|
if rl.IsKeyPressed(rl.KeyC) {
|
||||||
|
animFrameCounter = 0
|
||||||
|
animID++
|
||||||
|
if animID >= int(animsCount) {
|
||||||
|
animID = 0
|
||||||
|
}
|
||||||
|
rl.UpdateModelAnimation(model, anims[animID], 0)
|
||||||
|
animPlaying = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Toggle skeleton drawing
|
||||||
|
if rl.IsKeyPressed(rl.KeyB) {
|
||||||
|
drawSkeleton = !drawSkeleton
|
||||||
|
}
|
||||||
|
|
||||||
|
// Toggle mesh drawing
|
||||||
|
if rl.IsKeyPressed(rl.KeyM) {
|
||||||
|
drawMesh = !drawMesh
|
||||||
|
}
|
||||||
|
|
||||||
|
// Draw
|
||||||
|
rl.BeginDrawing()
|
||||||
|
|
||||||
|
rl.ClearBackground(rl.RayWhite)
|
||||||
|
|
||||||
|
rl.BeginMode3D(camera)
|
||||||
|
|
||||||
|
// Draw 3d model with texture
|
||||||
|
if drawMesh {
|
||||||
|
rl.DrawModel(model, position, 1.0, rl.White)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Draw the animated skeleton
|
||||||
|
if drawSkeleton {
|
||||||
|
modelBones := model.GetBones()
|
||||||
|
modelPoses := model.GetBindPose()
|
||||||
|
animBones := unsafe.Slice(anims[animID].Bones, anims[animID].BoneCount)
|
||||||
|
animPoses := unsafe.Slice(anims[animID].FramePoses, anims[animID].FrameCount)
|
||||||
|
transforms := unsafe.Slice(animPoses[animFrameCounter], anims[animID].BoneCount)
|
||||||
|
for bone := 0; bone < int(model.BoneCount)-1; bone++ {
|
||||||
|
if !animPlaying || animsCount == 0 {
|
||||||
|
// Display the bind-pose skeleton
|
||||||
|
rl.DrawCube(modelPoses[bone].Translation, 0.04, 0.04, 0.04, rl.Red)
|
||||||
|
if modelBones[bone].Parent >= 0 {
|
||||||
|
rl.DrawLine3D(modelPoses[bone].Translation, modelPoses[modelBones[bone].Parent].Translation, rl.Red)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// // Display the frame-pose skeleton
|
||||||
|
rl.DrawCube(transforms[bone].Translation, 0.05, 0.05, 0.05, rl.Red)
|
||||||
|
if animBones[bone].Parent >= 0 {
|
||||||
|
rl.DrawLine3D(transforms[bone].Translation, transforms[animBones[bone].Parent].Translation, rl.Red)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
rl.DrawGrid(10, 1.0)
|
||||||
|
|
||||||
|
rl.EndMode3D()
|
||||||
|
|
||||||
|
rl.DrawText("PRESS SPACE to PLAY MODEL ANIMATION", 10, screenHeight-80, 10, rl.Maroon)
|
||||||
|
rl.DrawText("PRESS N to STEP ONE ANIMATION FRAME", 10, screenHeight-60, 10, rl.DarkGray)
|
||||||
|
rl.DrawText("PRESS C to CYCLE THROUGH ANIMATIONS", 10, screenHeight-40, 10, rl.DarkGray)
|
||||||
|
rl.DrawText("PRESS M to toggle MESH, B to toggle SKELETON DRAWING", 10, screenHeight-20, 10, rl.DarkGray)
|
||||||
|
rl.DrawText("(c) CesiumMan model by KhronosGroup", screenWidth-210, screenHeight-20, 10, rl.Gray)
|
||||||
|
|
||||||
|
rl.EndDrawing()
|
||||||
|
}
|
||||||
|
|
||||||
|
// De-Initialization
|
||||||
|
rl.UnloadModelAnimations(anims)
|
||||||
|
rl.UnloadModel(model)
|
||||||
|
rl.CloseWindow()
|
||||||
|
}
|
Loading…
Add table
Add a link
Reference in a new issue