Hey fellow PlayCanvas Developers 
I have an application where I load a 3D Model (GLB) externally with an URL and then show that Model in my Application. The Model was created in Blender with some hirarchy. When my 3D Model is loaded I scan through it’s internal Children (GraphNodes) to reconstruct the hirarchy in my UI and assign the corresponing MeshInstances to each GraphNode entry. I make the list in my UI clickable to highlight the selected objects within the hirarchy of the object.
I would also like to make the different Hirarchy “Parts” selectable by clicking directly on them. Meaning I added collision to the model and a Camera-Raycast script. Of course since the GLB is loaded from one file I always get the same entity in my RaycastResult. I also get a point and normal Vector to where the collision occured. Now to my question. Is it possible to determine which Graphnode I hit ? Maybe from the point Vector I get ?
When I first apporached my project I was using an FBX as Model which I uploaded to my editor with Hirarchy import, but I coulnd’t find anything on loading it externaly and also creating its hirarchy with the associated Render Components. Or would that have been possible ?
Thank you and best regards!
http://playcanvas.github.io/#/graphics/model-asset
// create an entity with render assets
const entity = assets.statue.resource.instantiateModelEntity({
castShadows: true
});
Adding the independent collision components is going to be tricker but doable. No example though.
Could you use the pc.Picker instead in this case?
1 Like
Thank you for your reply!
I got it to work with the pc.Picker =)
Here’s my code for anyone wanting to do the same:
var PickWithFramebuffer = pc.createScript('pickWithFramebuffer');
PickWithFramebuffer.prototype.initialize = function () {
this.mouse = this.app.mouse;
this.canvas = document.querySelector('#application-canvas');
this.canvasWidth = this.canvas.clientWidth;
this.canvasHeight = this.canvas.clientHeight;
this.picker = new pc.Picker(this.app, this.canvasWidth, this.canvasHeight);
this.mouse.on("mousedown", this.handleClick, this);
this.camera = this.entity.camera;
this.scene = this.app.scene;
this.app.graphicsDevice.on('resizecanvas', function(){
this.picker.resize(this.canvas.clientWidth, this.canvas.clientHeight);
this.canvasWidth = this.canvas.clientWidth;
this.canvasHeight = this.canvas.clientHeight;
}.bind(this), this);
this.selection = null;
};
PickWithFramebuffer.prototype.handleClick = function(e) {
var picker = this.picker;
picker.prepare(this.camera,this.scene);
this.selection = picker.getSelection(e.x, e.y, 1, 1);
if(this.selection[0] != undefined){
if(this.selection[0].hasOwnProperty("node")){
this.app.fire("selectHirarchyItemByGraphNode", this.selection[0].node);
}
}
};
2 Likes