You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
This repository has been archived by the owner on May 28, 2019. It is now read-only.
The current version of famous lacks an Event model for GL objects, see one issue posted in the famous repo. Famous#466
There is a solution that has been in a pull request for over a month that uses the picking method. Picking is really limited and I don't particularly like the implementation proposed here.
Ive come up with a Ray class that detects hits on 3D objects, so far theres support for plane, sphere but I am working on box and triangle. It can be used generically like this:
var ray = new Ray(cameraNode.getPosition(),[0, 0, -1]); //first arg is origin, send arg is direction of ray
var hit = ray.intersectsSphere(meshNode.getPosition(),radius);
// hit returns a vector with the distance of the hit Vec3 {x: -0, y: -0, z: 400} or null if no hit
Raycasting is superior to picking because now developers have a Vec3 to use to update rotation, position, etc. This method alone doesn't map events from mouse or touch to Rays. To do that, we would need to create a DOMElement and use a GestureHandler to propagate UIEvents to a node that contains a Mesh. Something like this could be useful and is just a proposal ATM. What do you think?
This works out of the box with a GestureHandler and DOMElement that is the full width and height of the scene:
var gestureNode = scene.addChild()
.setOrigin(0.5, 0.5, 0.5)
.setMountPoint(0.5, 0.5, 0.5)
.setAlign(0.5, 0.5, 0.5)
.setSizeMode(1, 1, 1)
.setAbsoluteSize(window.innerWidth,window.innerHeight);
var gestureElem = new DOMElement(gestureNode);
gestureElem.setProperty('background-color', 'transparent');
var gestures = new GestureHandler(gestureNode);
function callback(e) {
ray = new Ray([e.center.x, e.center.y, -1000],[0, 0, 1]);
hit = ray.intersectsBox(meshNode.getPosition(),[100,100,100]);
console.log(hit);
if(hit){
sphere.setBaseColor(new Color('#FFAA00'));
} else {
sphere.setBaseColor(new Color('#454545'));
}
}
gestures.on('drag', callback);
It may be nice if some of this functionality was built into GestureHandler and users had to register nodes that needed to receive events via Components.
var gesture = new GestureHandler(node, events, {gl: true});
// setting the gl option would create a DOMElement for you that is the width and height of the scene, more options could let you size the width and height of the gesture area.
gesture.on('drag', function(e,p){
this.raycast(e.centerDelta.x,e.center.y);
// internally calls a raycast method that shoots a ray into 3D space and if it hits a node
// update first node it hit with Event, optionally propagate to other nodes.
});
var meshNode = scene.addChild();
meshNode.addComponent({
onMount: function(){
// register node with GestureHandler?
},
onReceive: function (ev) {
console.log(‘received event!');
}
});
The current version of famous lacks an Event model for GL objects, see one issue posted in the famous repo. Famous#466
There is a solution that has been in a pull request for over a month that uses the picking method. Picking is really limited and I don't particularly like the implementation proposed here.
Ive come up with a Ray class that detects hits on 3D objects, so far theres support for plane, sphere but I am working on box and triangle. It can be used generically like this:
Raycasting is superior to picking because now developers have a Vec3 to use to update rotation, position, etc. This method alone doesn't map events from mouse or touch to Rays. To do that, we would need to create a DOMElement and use a GestureHandler to propagate UIEvents to a node that contains a Mesh. Something like this could be useful and is just a proposal ATM. What do you think?
This works out of the box with a GestureHandler and DOMElement that is the full width and height of the scene:
It may be nice if some of this functionality was built into GestureHandler and users had to register nodes that needed to receive events via Components.
A preview of this work is in the https://github.com/infamous/engine/tree/infamous-feat-raycast branch. There are two methods intersectBox and intersectSphere. The last example is not implemented, just an idea. Both the top two examples work right now.
The text was updated successfully, but these errors were encountered: