This plugin loads a 3D Model into Construct 3, similar to the new built-in 3DShape plugin, but the 3D object can be a more complicated 3D model, loaded from a 3D model file format and texture. It also supports 3D animations.
It only supports gltf embedded and glb formats (preferably with an embedded texture in the file, a separate texture png file can also be supported.)
Please leave feedback or tag @kindeyegames on X or Mikal in the Construct Community Discord.
Some more (From @meta comments on CC Discord)
Advanced uses: read the dev logs and look at their associated examples.
Future state if this goes well:
Big thanks to r0j0hound on the Construct forums for sharing the gltf parsing and animation code which I used as a base for the gltf integration in this plug-in.
Fire elemental model credit: https://sketchfab.com/3d-models/fire-elemental-05fe96ef7fca472ba0bf753686216002
Again, please leave feedback or tag @kindeyegames on Twitter.
A great video from @FozzleCC describing details of how to use 3D models with the plug-in. If this video is useful for you, please support FozzleCC on his Patreon: https://bit.ly/PatreonFoozleCC
Note one change since this video was produced, it is now recommended to embed textures in the gltf / glb files and 3DObject will use them directly from the file, there is no need to load them into the 'image' of the 3DObject. The image can be left blank or filled with a solid color for easier identification in the event sheet.
If you want to go directly to specific subjects in the video, please see the timecode links below:
0:00 - Intro
2:31 - 3DObject Plugin Overview
6:48 - What is GLTF?
7:40 - Blender Intro
8:53 - Where to get 3D Models?
9:59 - Extracting Unity Asset Store Assets
15:21 - Sketchfab and Blender Reference
16:46 - Merging Multiple FBX Animations in Blender
22:35 - Associating texture to model in Blender
24:33 - Export GLTF from Blender
25:29 - Import GLTF into Construct 3
28:43 - Bake Multiple Textures to One in Blender
34:41 - Setting up Lighting for Baking in Blender
40:56 - Importing Baked Texture Model into C3
42:43 - Getting Free Animations from Mixamo.com
43:23 - GTLF Viewer & Debug
45:27 - Tips on Using GLTF Models & Performance
47:04 - Improve Performance with Blender Decimate
| Updated | 6 days ago |
| Status | Released |
| Category | Assets |
| Rating | Rated 5.0 out of 5 stars (27 total ratings) |
| Author | kindeyegames |
| Made with | Construct |
| Tags | 3D,construct,construct-3 |
Click download now to get access to the following files:
Log in with itch.io to leave a comment.
For Anybody running into Addon issues with the new release, Revert back to an older Construct Update. Click on the Pop Up link when loading your project, Click the link (LTS Release Page), Look for the previous Construct version and go to it, You'll be on an older version (It will instruct you to Update Construct 3) Dont do it.
If it doesnt Work still, Either Re-Install the Addons, If it already is, then the next thing is, Any addon you have applied to your game must align with Constructs 3 Version, Which means you have to go and Re-Download older Addon versions from your Devolper with Older versions of the addon, and make sure it aligns with Construct version.
Goodluck!
Sure, https://drive.google.com/file/d/1xXjeDyfm73Fdy21pSnBkzPzg4xeWzxDe/view?usp=drive...
This model loads on 440-2, and throws up that error and doesn't show on newer versions.
Can some one please explain to me how to use this addon? I tried to follow a tutorial on youtube that had me importing the glb file under files. But the guy on the video messed with the properties, even though when I click on the file the properties are blank. I followed the instructions to add the addon through the addon manager and restarted construct3 before doing this. I have no idea what I'm supposed to do. How do you use this? I can't find a tutorial
Hi, love this addon!
I read this comment of yours......
This add-on will not be ported to SDK V2 (but an LTS version of C3 that is compatible with it will be available for use for quite a while).
I am working on a new, similar addon with more capabilities, which is working with SDK V2 now. I will announce here when it is ready (it will take a bit to get to the same feature set, but it already supports PBR texture and normal maps.)
Any news on when this will be available please?
Phill
Hey there! Thanks for the plugin, it has opened the doors to a lot of cool opportunities. However, I'm having issues after I updated to the newest version of construct 3, and can't seem to find any working solutions.
Issue A:
After updating, objects in the project stopped using opacity values. Meaning any opacity related events, like the 'Fade' built-in addon just don't work. Any objects with a set opacity are also now just set to 100 aswell. For this, I am using both the latest versions of construct and the addon, and have tested on multiple browsers/machines with a friend.
I really only noticed the issue after I tried to export as an html, as before that I believe it was working as intended. However, now the project is bricked unless I find a fix for this.
Issue B:
In trying to get around this, I backported construct to beta r448. Opacity works in this version however any layout with a '3D Object' opens in debug to a black screen, reading 0 fps. I've tried using both r448 and r447, given they are both versions I've used while making the game. I've also tried multiple versions of this addon (specifically 2-77-0, 2-76-5, 2-76-2), all of which cause the 0 fps bug.
If any more information is needed, I am happy to send whatever. I don't really know how to read logs in construct, so that's the one place I haven't checked. Any help with this. or if there is a easy fix I've missed, would be much appreciated. Thanks!
here the sample, try to open c3p in R440.2 and than try open in R449
https://drive.google.com/file/d/16rOr9gWgFQnNxtxAPqTpxvEFI96zg75G/view?usp=shari...
Thanks for the example, please try 2-77-3:
https://kindeyegames.itch.io/c3-3dobject-alpha/devlog/993531/fix-opacity-and-col...
The issue is that C3 recently changed how their webgl2 renderer handled opacity and color and they changed how the vertex and fragment shader interfaced with it. In the end it will likely be a good thing, since it could improve performance for rendering standard C3 objects with varying opacity and color.
I will take a look tonight and see if there are changes possible in 3DObject to support this.
https://kindeyegames.itch.io/c3-3dobject-alpha/devlog/993019/fix-opacity-and-col...
Please try this fix (must use static geometry or gpu skinning).
Hi! Thanks for the timely fix. I'm personally still having issues with opacity after updating however.
Layouts without 3DObjects don't render opacity, alongside one's that have 3DObjects. Maybe I'm doing something wrong with the static geometry, but I can't find the setting outside of setting it at runtime on start of layout (which still doesn't fix the issue).
(edit: Just tested BIN712's example layout again after updating and can confirm it does not work there either, both without and with setting the 3DObject's static geometry at runtime)
Any advice or info is much appreciated! Thanks!
set one also still having issue, here the file https://drive.google.com/file/d/1kiAFi06XVw8UfBAT6qsYzgmJwJQgKPL7/view?usp=shari...
Hi! First of all, I want to thank @kindeyegames for such a great tool — thank you, you are the best!!!
I have a problem with enemies. Specifically, when there are two or more enemies — if I create just one enemy, all animations play correctly as intended. But if there are two or more enemies on the scene, an animation like death for example, only plays on one model. "for each" doesn't work in this case.
Is it possible to make each model play its own animation separately?)
Video demonstration of the problem:
https://drive.google.com/file/d/1RAP7pqHRVGX9iK5E0JA5SnjUNNBaIuTv/view?usp=shari...
I see you are already getting a lot of replies about the newest beta builds.
This is the one I am getting in Chrome. as for a test project it happens in a blank project with only a 3d object in it.
instance.js:1 Uncaught (in promise) TypeError: Cannot read properties of undefined (reading 'bindBuffer')
at Object3DInstance.Tick (instance.js:1:5086)
at Array._tickFunc (sdkInstanceBase.js:1:3226)
at C3.Event.Handler._FireNonCancellable (handler.js:1:2241)
at C3.Event.Dispatcher.dispatchEvent (dispatcher.js:1:970)
at C3.Runtime.Step_AfterPreTick (runtime.js:1:40202)
at C3.Runtime.Tick (runtime.js:1:38223)
at normal (runtime.js:1:3193)
I guess that makes sense. Construct is a 2d engine after all. Still a shame though.
[SW-Preview] Up to date
plugin.js:8 opts
{runtime: C3.Runtime, isSingleGlobal: false, isWorld: true, isRotatable: false, hasEffects: true, …}
plugin.js:171 [3DObject] allow gpu skinning
plugin.js:188 [3DObject] shader mikal_frag_light-8 not found
The powerPreference option is currently ignored when calling requestAdapter() on Windows. Seehttps://crbug.com/369219127
local.html:1 The powerPreference option is currently ignored when calling requestAdapter() on Windows. Seehttps://crbug.com/369219127
runtime.js:1 [C3 runtime] Hosted in worker, rendering with WebGPU [nvidia/lovelace]
instance.js:1 Uncaught (in promise) TypeError: Cannot read properties of undefined (reading 'bindBuffer')
at Object3DInstance.Tick (instance.js:1:5086)
at Array._tickFunc (sdkInstanceBase.js:1:3226)
at C3.Event.Handler._FireNonCancellable (handler.js:1:2241)
at C3.Event.Dispatcher.dispatchEvent (dispatcher.js:1:970)
at C3.Runtime.Step_AfterPreTick (runtime.js:1:40202)
at C3.Runtime.Tick (runtime.js:1:38223)
at C3.Runtime.Start (runtime.js:1:19364)
at async C3.Runtime.Init (runtime.js:1:12312)
at async InitRuntime (workermain.js:1:3322)
Tick @ instance.js:1
_tickFunc @ sdkInstanceBase.js:1
_FireNonCancellable @ handler.js:1
dispatchEvent @ dispatcher.js:1
Step_AfterPreTick @ runtime.js:1
Tick @ runtime.js:1
Start @ runtime.js:1
await in Start
Init @ runtime.js:1
await in Init
self.C3_InitRuntime @ runtime.js:1
InitRuntime @ workermain.js:1
await in InitRuntime
HandleInitRuntimeMessage @ workermain.js:1
[C3 preview] Browser opened wrong size popup: wanted 854 x 972, got 854 x 971; resizing to compensate
plugin.js:8 opts Object
plugin.js:171 [3DObject] allow gpu skinning
The powerPreference option is currently ignored when calling requestAdapter() on Windows. Seehttps://crbug.com/369219127Understand this warning
local.html:1 The powerPreference option is currently ignored when calling requestAdapter() on Windows. Seehttps://crbug.com/369219127Understand this warning
workermain.js:1 Uncaught (in promise) GPUPipelineError: The fragment input at location 0 doesn't have a corresponding vertex output.
at ValidateInterStageMatching (..\..\third_party\dawn\src\dawn\native\RenderPipeline.cpp:790)
at ValidateInterStageMatching (..\..\third_party\dawn\src\dawn\native\RenderPipeline.cpp:790)
When i try open my project in relase 441 or more i always receive black screen in preview. someone also have this problem? Console shows:
[SW-Preview] Up to date
bootPreview.js:105 Registered service worker onhttps://preview.construct.net/
previewWindow.js:1 [C3 preview] Browser opened wrong size popup: wanted 854 x 480, got 854 x 479; resizing to compensate
local.html:1 Unchecked runtime.lastError: A listener indicated an asynchronous response by returning true, but the message channel closed before a response was receivedUnderstand this error
plugin.js:8 opts Object
plugin.js:171 [3DObject] allow gpu skinning
plugin.js:188 [3DObject] shader mikal_frag_light-8 not found
Object3DPlugin @ plugin.js:188Understand this warning
runtime.js:1 [C3 runtime] Hosted in worker, rendering with WebGL 2 [ANGLE (NVIDIA, NVIDIA GeForce RTX 4070 (0x00002786) Direct3D11 vs_5_0 ps_5_0, D3D11)]
40[.WebGL-0x2b14000d4600] GL_INVALID_OPERATION: glDrawElements: It is undefined behaviour to have a used but unbound uniform buffer.Understand this warning
40[.WebGL-0x2b14000d4600] GL_INVALID_OPERATION: glDrawElements: It is undefined behaviour to have a used but unbound uniform buffer.Understand this warning
plugin.js:47 [3DObject] Dummy UBO for bones created and bound.
instance.js:71 Monkey patching C3 renderer...
instance.js:174 Uncaught (in promise) TypeError: this._ExtendQuadBatch is not a function
at C3.Gfx.WebGLRenderer.Quad3D2 (instance.js:174:12)
at i.Plugins.Shape3D.Instance._DrawFace (runtime.js:1:7650)
at i.Plugins.Shape3D.Instance.Draw (runtime.js:1:5856)
at C3.Instance.Draw (instance.js:1:4154)
at C3.Layer._DrawInstance (layer.js:1:29009)
at C3.Layer._DrawInstanceMaybeWithEffects (layer.js:1:28891)
at C3.Layer._DrawInstances_3DCamera (layer.js:1:27673)
at C3.Layer.Draw (layer.js:1:26158)
at C3.Layout._DrawLayerList (layout.js:1:24177)
at C3.Layout.DrawMain (layout.js:1:23029)
i add one GLB model file and nothing more, preview cause black screenexample you can download here: https://drive.google.com/file/d/1MRyHZvYAUpO6FdNsrtlAfDboju97Jbee/view?usp=shari...
The latest beta broke the plugin, my project won't preview unless I delete the 3d object plugin from my project. I looked at the patch notes, they changed the way that things are rendered in order to be more efficient.
The error code:
canvasManager.js:1Error creating WebGL renderer:Error: Error linking shader program: Types of varying 'vColor' differ between VERTEX and FRAGMENT shaders. FRAGMENT varying vColor does not match any VERTEX varying
Is there a way to increase the limit of model loads during runtime? I'm making a multiplayer game and want players to be able to change models. I can't use "load from prefab instance" because 1) other instances of the player object are treated as extra players and 2) when the host syncs instances to peers, the UIDs are different for peers. My current approach works great except for the one-load runtime limit. 
I'm also open to suggestions if you have any ideas! Thanks!
Thanks so much for the replies! This worked. I was using a 2d sprite for the controller originally, but I had it in a container with the model for ease of referencing so I couldn't destroy the model without destroying the player controller. Instead of using a container, I added an instance variable to the model representing which 2d player controller it should follow. This way, I can easily destroy and re-create the model without impacting a player's container. Your idea to destroy & create new works just as well as the "reload" I initially wanted.


Thanks again, and great plugin!
Hi! I have a question. Is it safe to release a game on Steam using this plugin? I need to clear this up before committing to developing a 3D game with it. Can I develop the game without any issues? My main concern is: once the game is released on Steam, do I need to worry about the SDK? Or once it's released, do I no longer need to worry about the SDK?
Thanks Mikal. I reuploaded the files and things are back to normal. However, is there a way to restart an animation. Currently there is only options to speed up, change rate, pause, resume animation. I also noticed upon start of layout, the 3D objects don't appear instantly (delay in spawning). Thanks!
Sorry as I'm a little new to this but where do you set the animation time? I saw set/delete node, blend time, animation speed, rate, pause and resume animation. Since the object keeps looping non-stop, I just want to restart the animation whenever I wanted it to. I'm sorry for being so bad at this. 😔
This add-on will not be ported to SDK V2 (but an LTS version of C3 that is compatible with it will be available for use for quite a while).
I am working on a new, similar addon with more capabilities, which is working with SDK V2 now. I will announce here when it is ready (it will take a bit to get to the same feature set, but it already supports PBR texture and normal maps.)
Yes, transparency/alpha in 3D, in general, is always a challenge. The better results for simple renderers like C3 are to render in order as much as possible.
Check that the render order is the distance from the camera and all layers are 3D.
If your 'world' is one big GLB/GLTF model, it will be hard to sort properly (near and far meshes will all be part of one model.)
An alternate option is the 'screendoor transparency' in the 3D effect, which has a particular 'look' but will make the rendering support out-of-order rendering better.
DAN
Hello,
Watching FoozleCC, he shows sample code to copy and use. I have no idea where this code is – which sample is he showing/using?
https://www.youtube.com/watch?v=p02bz6jax8Y&t=1105s
Construct 3 r416.2 stable
Installed addons: Frag Light 2.8.0, SSAO 1.6, 3DObject, Rotate 3D
Preview 3DObjectFragLight - Scene is completely black.
F12 – I now see I have an error:
main.js:98 Uncaught TypeError: Cannot set properties of undefined (setting 'GetDefaultVertexShaderSource') at main.js:98:57
(anonymous) @ main.js:98Understand this errorAI
c3runtime.js:280 Uncaught (in promise) Error: Error compiling fragment shader: ERROR: 0:11: 'pos' : redefinition
at C3.Gfx.WebGLShaderProgram.Compile (c3runtime.js:280:1243)
at async C3.Gfx.WebGLShaderProgram.Create (c3runtime.js:280:1904)
at async C3.Gfx.WebGLRenderer.CreateShaderProgram (c3runtime.js:460:9318)
at async Promise.all (3DObjectFragLight-8/index 1)
at async C3.CanvasManager._InitWebGL (c3runtime.js:1190:6728)
at async C3.CanvasManager._InitRenderer (c3runtime.js:1190:7050)
at async C3.CanvasManager.CreateCanvas (c3runtime.js:1190:4819)
at async C3.Runtime._InitialiseCanvas (c3runtime.js:1195:18300)
at async C3.Runtime.Init (c3runtime.js:1195:10955)
at async Q._InitDOM (main.js:26:12442)
Same error after publishing and running in chrome using IIS.
3DObjectVertexColor –
Project exported – running in Chrome.. Scene is completely black.
Error log:
main.js:99 Uncaught TypeError: Cannot set properties of undefined (setting 'GetDefaultVertexShaderSource') at main.js:99:57Understand this errorAI
c3runtime.js:280 Uncaught (in promise) Error: Error compiling fragment shader: ERROR: 0:11: 'pos' : redefinition
ERROR: 0:12: 'vColor' : redefinition
at C3.Gfx.WebGLShaderProgram.Compile (c3runtime.js:280:1243)
at async C3.Gfx.WebGLShaderProgram.Create (c3runtime.js:280:1904)
at async C3.Gfx.WebGLRenderer.CreateShaderProgram (c3runtime.js:460:9318)
at async Promise.all (3DObjectVertexColor/index 0)
at async C3.CanvasManager._InitWebGL (c3runtime.js:1190:6728)
at async C3.CanvasManager._InitRenderer (c3runtime.js:1190:7050)
at async C3.CanvasManager.CreateCanvas (c3runtime.js:1190:4819)
at async C3.Runtime._InitialiseCanvas (c3runtime.js:1195:18300)
at async C3.Runtime.Init (c3runtime.js:1195:10955)
at async Q._InitDOM (main.js:26:12442)
Hello, thank you for this great plugin, I have a doubt, when I import a 3d object with the texture embeded appears compresed in game.
If I search the texture manually in construct 3 it shows ok.
The problem is I can´t search the texture for a mesh with multiples materials, also if I set a mesh as "static" with the texture checkbox marked, the texture appears corrupted.
Any idea how to resolve it? Thank you so much