From 5622ece0e3435699015e101f8ddfad6f6fcafb71 Mon Sep 17 00:00:00 2001 From: Bernhard Schelling <14200249+schellingb@users.noreply.github.com> Date: Thu, 2 Aug 2018 01:50:18 +0900 Subject: [PATCH] Add skeletal mesh with inverse kinematics sample --- 32-3d-materials.inl | 2 +- 34-skeletal-mesh-ik.inl | 41 ++++++++++++++++++ Data/human.glb.zip | Bin 0 -> 33180 bytes README.md | 1 + ZillaLibSampleMain.cpp | 16 ++++++- ZillaLibSamples-OSX.xcodeproj/project.pbxproj | 3 +- ZillaLibSamples-iOS.xcodeproj/project.pbxproj | 3 +- ZillaLibSamples-vs.vcxproj | 1 + 8 files changed, 62 insertions(+), 5 deletions(-) create mode 100644 34-skeletal-mesh-ik.inl create mode 100644 Data/human.glb.zip diff --git a/32-3d-materials.inl b/32-3d-materials.inl index d99713d..51f0d67 100644 --- a/32-3d-materials.inl +++ b/32-3d-materials.inl @@ -10,7 +10,7 @@ struct sMain : public ZL_Application void Load(int argc, char *argv[]) { //Initialize the game with depth buffer, 3d rendering and shadow mapping - ZL_Display::Init("Advanced 3D Materials", 1280, 720, ZL_DISPLAY_ALLOWRESIZEHORIZONTAL | ZL_DISPLAY_DEPTHBUFFER); + ZL_Display::Init("Advanced 3D Materials", 1280, 720, ZL_DISPLAY_DEPTHBUFFER); ZL_Display3D::Init(); ZL_Display3D::InitShadowMapping(); ZL_Input::Init(); diff --git a/34-skeletal-mesh-ik.inl b/34-skeletal-mesh-ik.inl new file mode 100644 index 0000000..243edb5 --- /dev/null +++ b/34-skeletal-mesh-ik.inl @@ -0,0 +1,41 @@ +static ZL_Camera Camera; +static ZL_Light Light = ZL_Light(ZL_Vector3(2.f, 5.f, 8.f)); +static ZL_SkeletalMesh SkeletalMesh; +static ZL_RenderList RenderList; + +struct sMain : public ZL_Application +{ + sMain() : ZL_Application() {} + + void Load(int argc, char *argv[]) + { + //Initialize the game with depth buffer and 3d rendering + ZL_Display::Init("Skeletal Mesh", 1280, 720, ZL_DISPLAY_DEPTHBUFFER); + ZL_Display3D::Init(); + ZL_Input::Init(); + + //Load the skeletal mesh model file + SkeletalMesh = ZL_SkeletalMesh::FromGLTF("Data/human.glb.zip"); + } + + void AfterFrame() + { + if (ZL_Input::Down(ZLK_ESCAPE)) ZL_Application::Quit(); + + //Update the camera position every frame referencing the mouse coordinates + float HoirzontalAngleRad = (ZL_Display::PointerX-ZLHALFW)/ZLHALFW*PI+PIHALF; + float VerticalAngleRad = ((ZL_Display::PointerY-ZLHALFH)/ZLHALFH-.2f)*PIHALF*0.8f; + Camera.SetLookAt(ZL_Vector3::FromRotation(HoirzontalAngleRad, VerticalAngleRad) * 3.f + ZL_Vector3(0,0,1), ZL_Vector3(0,0,1)); + + //Update the foot positions with inverse kinematics (IK) + SkeletalMesh.TwoBoneIK(12, ZL_Vector3(-.1f, 0, .23f - .15f * ssin(ZLSECONDS * 5)), ZL_Vector3::Forward); //Left foot + SkeletalMesh.TwoBoneIK(15, ZL_Vector3( .1f, 0, .23f - .15f * scos(ZLSECONDS * 5)), ZL_Vector3::Forward); //Right foot + SkeletalMesh.Update(); + + //Setup and draw our dynamic render list with our skeletal mesh on a black background + RenderList.Reset(); + RenderList.Add(SkeletalMesh, ZL_Matrix::Identity); + ZL_Display::ClearFill(ZL_Color::Black); + ZL_Display3D::DrawListWithLight(RenderList, Camera, Light); + } +} Main; diff --git a/Data/human.glb.zip b/Data/human.glb.zip new file mode 100644 index 0000000000000000000000000000000000000000..43be2cdb4ad7abc45c31fb99314aa3a6315dfe71 GIT binary patch literal 33180 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� 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 independent settings storage

[](https://zillalib.github.io/samples/?25)
[- Run in Web Browser -](https://zillalib.github.io/samples/?25)
[Win32](https://zillalib.github.io/samples/ZillaLibSample-25_Win32.zip)/[Win64](https://zillalib.github.io/samples/ZillaLibSample-25_Win64.zip)/[Android](https://zillalib.github.io/samples/ZillaLibSample-25.apk)
[MacOSX](https://zillalib.github.io/samples/ZillaLibSample-25_osx.zip)/[Linux32](https://zillalib.github.io/samples/ZillaLibSample-25_linux_x86_32.zip)/[Linux64](https://zillalib.github.io/samples/ZillaLibSample-25_linux_x86_64.zip)
[View Source](https://github.com/schellingb/ZillaLibSamples/blob/master/25-saving-loading-settings.inl)|**Open Web Link**

Opening an URL in the browser

[](https://zillalib.github.io/samples/?26)
[- Run in Web Browser -](https://zillalib.github.io/samples/?26)
[Win32](https://zillalib.github.io/samples/ZillaLibSample-26_Win32.zip)/[Win64](https://zillalib.github.io/samples/ZillaLibSample-26_Win64.zip)/[Android](https://zillalib.github.io/samples/ZillaLibSample-26.apk)
[MacOSX](https://zillalib.github.io/samples/ZillaLibSample-26_osx.zip)/[Linux32](https://zillalib.github.io/samples/ZillaLibSample-26_linux_x86_32.zip)/[Linux64](https://zillalib.github.io/samples/ZillaLibSample-26_linux_x86_64.zip)
[View Source](https://github.com/schellingb/ZillaLibSamples/blob/master/26-open-web-link.inl)|**JSON Reader and Writer**

Sample of how to read and write JSON formatted data

[](https://zillalib.github.io/samples/?27)
[- Run in Web Browser -](https://zillalib.github.io/samples/?27)
[Win32](https://zillalib.github.io/samples/ZillaLibSample-27_Win32.zip)/[Win64](https://zillalib.github.io/samples/ZillaLibSample-27_Win64.zip)/[Android](https://zillalib.github.io/samples/ZillaLibSample-27.apk)
[MacOSX](https://zillalib.github.io/samples/ZillaLibSample-27_osx.zip)/[Linux32](https://zillalib.github.io/samples/ZillaLibSample-27_linux_x86_32.zip)/[Linux64](https://zillalib.github.io/samples/ZillaLibSample-27_linux_x86_64.zip)
[View Source](https://github.com/schellingb/ZillaLibSamples/blob/master/27-json-read-write.inl) **Advanced Polygon Usage**

Polygons with multi contours and extrusion

[](https://zillalib.github.io/samples/?28)
[- Run in Web Browser -](https://zillalib.github.io/samples/?28)
[Win32](https://zillalib.github.io/samples/ZillaLibSample-28_Win32.zip)/[Win64](https://zillalib.github.io/samples/ZillaLibSample-28_Win64.zip)/[Android](https://zillalib.github.io/samples/ZillaLibSample-28.apk)
[MacOSX](https://zillalib.github.io/samples/ZillaLibSample-28_osx.zip)/[Linux32](https://zillalib.github.io/samples/ZillaLibSample-28_linux_x86_32.zip)/[Linux64](https://zillalib.github.io/samples/ZillaLibSample-28_linux_x86_64.zip)
[View Source](https://github.com/schellingb/ZillaLibSamples/blob/master/28-advanced-polygon.inl)|**Blend Modes Visualizer**

Tool to visualize all kinds of blending modes

[](https://zillalib.github.io/samples/?29)
[- Run in Web Browser -](https://zillalib.github.io/samples/?29)
[Win32](https://zillalib.github.io/samples/ZillaLibSample-29_Win32.zip)/[Win64](https://zillalib.github.io/samples/ZillaLibSample-29_Win64.zip)/[Android](https://zillalib.github.io/samples/ZillaLibSample-29.apk)
[MacOSX](https://zillalib.github.io/samples/ZillaLibSample-29_osx.zip)/[Linux32](https://zillalib.github.io/samples/ZillaLibSample-29_linux_x86_32.zip)/[Linux64](https://zillalib.github.io/samples/ZillaLibSample-29_linux_x86_64.zip)
[View Source](https://github.com/schellingb/ZillaLibSamples/blob/master/29-blend-modes.inl)|**Simple Game**

A simple game showing off various features

[](https://zillalib.github.io/samples/?30)
[- Run in Web Browser -](https://zillalib.github.io/samples/?30)
[Win32](https://zillalib.github.io/samples/ZillaLibSample-30_Win32.zip)/[Win64](https://zillalib.github.io/samples/ZillaLibSample-30_Win64.zip)/[Android](https://zillalib.github.io/samples/ZillaLibSample-30.apk)
[MacOSX](https://zillalib.github.io/samples/ZillaLibSample-30_osx.zip)/[Linux32](https://zillalib.github.io/samples/ZillaLibSample-30_linux_x86_32.zip)/[Linux64](https://zillalib.github.io/samples/ZillaLibSample-30_linux_x86_64.zip)
[View Source](https://github.com/schellingb/ZillaLibSamples/blob/master/30-simple-game.inl) **Basic 3D**

Basic example of rendering a 3D scene

[](https://zillalib.github.io/samples/?31)
[- Run in Web Browser -](https://zillalib.github.io/samples/?31)
[Win32](https://zillalib.github.io/samples/ZillaLibSample-31_Win32.zip)/[Win64](https://zillalib.github.io/samples/ZillaLibSample-31_Win64.zip)/[Android](https://zillalib.github.io/samples/ZillaLibSample-31.apk)
[MacOSX](https://zillalib.github.io/samples/ZillaLibSample-31_osx.zip)/[Linux32](https://zillalib.github.io/samples/ZillaLibSample-31_linux_x86_32.zip)/[Linux64](https://zillalib.github.io/samples/ZillaLibSample-31_linux_x86_64.zip)
[View Source](https://github.com/schellingb/ZillaLibSamples/blob/master/31-basic-3d.inl)|**Advanced 3D Materials**

Using advanced and custom shaders for materials

[](https://zillalib.github.io/samples/?32)
[- Run in Web Browser -](https://zillalib.github.io/samples/?32)
[Win32](https://zillalib.github.io/samples/ZillaLibSample-32_Win32.zip)/[Win64](https://zillalib.github.io/samples/ZillaLibSample-32_Win64.zip)/[Android](https://zillalib.github.io/samples/ZillaLibSample-32.apk)
[MacOSX](https://zillalib.github.io/samples/ZillaLibSample-32_osx.zip)/[Linux32](https://zillalib.github.io/samples/ZillaLibSample-32_linux_x86_32.zip)/[Linux64](https://zillalib.github.io/samples/ZillaLibSample-32_linux_x86_64.zip)
[View Source](https://github.com/schellingb/ZillaLibSamples/blob/master/32-3d-materials.inl)|**3D Particles**

A simple effect using the 3D particle system

[](https://zillalib.github.io/samples/?33)
[- Run in Web Browser -](https://zillalib.github.io/samples/?33)
[Win32](https://zillalib.github.io/samples/ZillaLibSample-33_Win32.zip)/[Win64](https://zillalib.github.io/samples/ZillaLibSample-33_Win64.zip)/[Android](https://zillalib.github.io/samples/ZillaLibSample-33.apk)
[MacOSX](https://zillalib.github.io/samples/ZillaLibSample-33_osx.zip)/[Linux32](https://zillalib.github.io/samples/ZillaLibSample-33_linux_x86_32.zip)/[Linux64](https://zillalib.github.io/samples/ZillaLibSample-33_linux_x86_64.zip)
[View Source](https://github.com/schellingb/ZillaLibSamples/blob/master/33-3d-particles.inl) +**Skeletal Mesh IK**

Loading a skeletal mesh with inverse kinematics

[](https://zillalib.github.io/samples/?34)
[- Run in Web Browser -](https://zillalib.github.io/samples/?34)
[Win32](https://zillalib.github.io/samples/ZillaLibSample-34_Win32.zip)/[Win64](https://zillalib.github.io/samples/ZillaLibSample-34_Win64.zip)/[Android](https://zillalib.github.io/samples/ZillaLibSample-34.apk)
[MacOSX](https://zillalib.github.io/samples/ZillaLibSample-34_osx.zip)/[Linux32](https://zillalib.github.io/samples/ZillaLibSample-34_linux_x86_32.zip)/[Linux64](https://zillalib.github.io/samples/ZillaLibSample-34_linux_x86_64.zip)
[View Source](https://github.com/schellingb/ZillaLibSamples/blob/master/34-skeletal-mesh-ik.inl) diff --git a/ZillaLibSampleMain.cpp b/ZillaLibSampleMain.cpp index e844adc..32fa1f1 100644 --- a/ZillaLibSampleMain.cpp +++ b/ZillaLibSampleMain.cpp @@ -26,7 +26,7 @@ using namespace std; #ifndef ZILLALIBSAMPLES_NUMBER -#define ZILLALIBSAMPLES_NUMBER 33 +#define ZILLALIBSAMPLES_NUMBER 34 #define ZILLALIBSAMPLES_HASDATA 1 #endif @@ -109,6 +109,8 @@ struct ZL_Display_Sample : public ZL_Display #include "32-3d-materials.inl" #elif ZILLALIBSAMPLES_NUMBER == 33 #include "33-3d-particles.inl" +#elif ZILLALIBSAMPLES_NUMBER == 34 +#include "34-skeletal-mesh-ik.inl" #endif //Test compile all samples with ZILLALIBSAMPLES_NUMBER set to 0 @@ -162,6 +164,7 @@ namespace NS01 { #undef SCENE_GAME };namespace NS17 { #include "17-surface-shader.inl" +#undef SCENE_GAME };namespace NS18 { #include "18-render-clipping.inl" };namespace NS19 { @@ -186,6 +189,15 @@ namespace NS01 { #include "28-advanced-polygon.inl" };namespace NS29 { #include "29-blend-modes.inl" +};namespace NS30 { +#include "30-simple-game.inl" +};namespace NS31 { +#include "31-basic-3d.inl" +};namespace NS32 { +#include "32-3d-materials.inl" +};namespace NS33 { +#include "33-3d-particles.inl" +};namespace NS34 { +#include "34-skeletal-mesh-ik.inl" }; - #endif diff --git a/ZillaLibSamples-OSX.xcodeproj/project.pbxproj b/ZillaLibSamples-OSX.xcodeproj/project.pbxproj index b5f2b67..202a62c 100644 --- a/ZillaLibSamples-OSX.xcodeproj/project.pbxproj +++ b/ZillaLibSamples-OSX.xcodeproj/project.pbxproj @@ -34,6 +34,7 @@ 101031 = { isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = "31-basic-3d.inl"; sourceTree = ""; }; 101032 = { isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = "32-3d-materials.inl"; sourceTree = ""; }; 101033 = { isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = "33-3d-particles.inl"; sourceTree = ""; }; + 101034 = { isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = "34-skeletal-mesh-ik.inl"; sourceTree = ""; }; 202001 = { isa = PBXBuildFile; fileRef = 201001; }; 201001 = { isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = "ZillaLibSampleMain.cpp"; sourceTree = ""; }; @@ -60,7 +61,7 @@ 800000 = { isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ZillaLibSamples.app; sourceTree = BUILT_PRODUCTS_DIR; }; A00001 = { isa = PBXGroup; name = Products; children = (800000); sourceTree = ""; }; - A00002 = { isa = PBXGroup; name = Sources; children = (101001,101002,101003,101004,101005,101006,101007,101008,101009,101010,101011,101012,101013,101014,101015,101016,101017,101018,101019,101020,101021,101022,101023,101024,101025,101026,101027,101028,101029,101030,101031,101032,101033,201001); sourceTree = ""; }; + A00002 = { isa = PBXGroup; name = Sources; children = (101001,101002,101003,101004,101005,101006,101007,101008,101009,101010,101011,101012,101013,101014,101015,101016,101017,101018,101019,101020,101021,101022,101023,101024,101025,101026,101027,101028,101029,101030,101031,101032,101033,101034,201001); sourceTree = ""; }; A00003 = { isa = PBXGroup; name = Resources; children = (301001,401001); sourceTree = ""; }; A00004 = { isa = PBXGroup; name = Frameworks; children = (501001,501002,501003,501004,501005,501006,501007); sourceTree = ""; }; A00005 = { isa = PBXGroup; name = CustomTemplate; children = (600001,A00001,A00002,A00003,A00004); sourceTree = ""; }; diff --git a/ZillaLibSamples-iOS.xcodeproj/project.pbxproj b/ZillaLibSamples-iOS.xcodeproj/project.pbxproj index 0a3efe9..df10f85 100644 --- a/ZillaLibSamples-iOS.xcodeproj/project.pbxproj +++ b/ZillaLibSamples-iOS.xcodeproj/project.pbxproj @@ -34,6 +34,7 @@ 101031 = { isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = "31-basic-3d.inl"; sourceTree = ""; }; 101032 = { isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = "32-3d-materials.inl"; sourceTree = ""; }; 101033 = { isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = "33-3d-particles.inl"; sourceTree = ""; }; + 101034 = { isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = "34-skeletal-mesh-ik.inl"; sourceTree = ""; }; 202001 = { isa = PBXBuildFile; fileRef = 201001; }; 201001 = { isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = "ZillaLibSampleMain.cpp"; sourceTree = ""; }; @@ -74,7 +75,7 @@ 800000 = { isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ZillaLibSamples.app; sourceTree = BUILT_PRODUCTS_DIR; }; A00001 = { isa = PBXGroup; name = Products; children = (800000); sourceTree = ""; }; - A00002 = { isa = PBXGroup; name = Sources; children = (101001,101002,101003,101004,101005,101006,101007,101008,101009,101010,101011,101012,101013,101014,101015,101016,101017,101018,101019,101020,101021,101022,101023,101024,101025,101026,101027,101028,101029,101030,101031,101032,101033,201001); sourceTree = ""; }; + A00002 = { isa = PBXGroup; name = Sources; children = (101001,101002,101003,101004,101005,101006,101007,101008,101009,101010,101011,101012,101013,101014,101015,101016,101017,101018,101019,101020,101021,101022,101023,101024,101025,101026,101027,101028,101029,101030,101031,101032,101033,101034,201001); sourceTree = ""; }; A00003 = { isa = PBXGroup; name = Resources; children = (301001,401001,401002,401003,401004,401005,401006,401007,401008,401009,401010,401011); sourceTree = ""; }; A00004 = { isa = PBXGroup; name = Frameworks; children = (501001,501002,501003,501004,501005,501006,501007,501008,501009,501010,501011); sourceTree = ""; }; A00005 = { isa = PBXGroup; name = CustomTemplate; children = (600001,A00001,A00002,A00003,A00004); sourceTree = ""; }; diff --git a/ZillaLibSamples-vs.vcxproj b/ZillaLibSamples-vs.vcxproj index cde1d8e..a6ebef9 100644 --- a/ZillaLibSamples-vs.vcxproj +++ b/ZillaLibSamples-vs.vcxproj @@ -85,6 +85,7 @@ + \ No newline at end of file