max123

scene.pickWithRay blues

Recommended Posts

I have a character, a target (a box attached to a camera) and wall. For some reason, when Target is behind Wall, Character can still see the bloody Target!

What's the correct way of using pickWithRay? Is there a way to visualize rays, e.g. draw a line?

Share this post


Link to post
Share on other sites

It is better if you send a Playground of your bloody shooting demo ;)

 

There is a predicate function with this method. And you have in parameter the mesh hitten.

function predicate (mesh){

return mesh === target;

}

It will return true if the wall is not between in theory.

http://www.html5gamedevs.com/topic/2114-exclude-some-meshes-when-scenepicking/

 

Check that your ray is well positioned (y > 0), make a big wall to test.

 

I had some issues when I tried to pick a character's mesh. When he turned, the result was false because he's skinny.

So I attached an invisible box to him and it was ok.

Sometimes the ray touched the character even behind wall but maybe it's over now.

A debug function to draw the ray could be cool.

-------

 

I have a little question :

is there a function to pick multiple objects with a ray and return an array of pickedMesh ? (like a bullet passing through several things)

Share this post


Link to post
Share on other sites

Heya getzel, max, and any other bloody readers.  ;)

G... I don't think there IS a multi-hit ray... but... are you thinking what I am thinking?

You mentioned predicate.  What if... you kept targeting the same mesh, but you repeatedly change the ray's origin/source mesh... to be the most recently-hit mesh?  Keep moving the ray launch-point... to the hit mesh... and fire again.  :)

I think rays ALWAYS stop at the first hit.  But then... store that hit in a "whichMeshHitSoFar" array, then change the ray origin to the hit mesh, and fire again.  Rinse and repeat... until the origin and the target are the same mesh.  No need to fire any more rays, then.

Can you imagine this?  5 mesh in a line, try to fire ray from 1 to 5.  Ray hits mesh 2 (a blocker).  Push mesh2 into array, move ray origin to mesh2, and fire again.  Hits mesh3 (a blocker).  Store, make it origin, and fire again.... etc etc.  Lily pad hopping!  :)  Might work.  Sort of demented, so likely fun!

Carpenter 1 needs the distance to carpenter 5.  But while he is extending his tape measure towards C5, it hits carpenter 2 and is blocked.  So C1 asks C2 to pull the measuring tape (and spool) to himself, and continue measuring "down the line".  C2 gathers the tape and spool, and then extends the tape measure towards C5, but it hits carpenter 3... etc, etc, etc.  heh.  Goofy.  Hand-along tape measuring.  :)

Share this post


Link to post
Share on other sites

Thx Wingnut.

I already thought about that.
A function pickAllWithRay in Babylon would be cool. There is already one doing this in Three.js.
I dont know if its with your algorithm or something else more obscure.

Share this post


Link to post
Share on other sites

Hey, bloody babylonians :)

@getzel, I'll try to put together a PG - might take time though: in my game a Blender scene is loaded and then loads of objects get instanced and placed based on a json config with a bunch of coordinates. The Charecter (shooter) is then set to lookAt the camera's box and runs PickWithRay to check if the target is in 'line of sight'. Maybe here I'm doing something fishy?

@Wingnut, a cleaner solution would be an all-penetrating ray returning an array of pickedMesh objects ordered on hit-first basis. And that would be one bloody useful feature too!

Share this post


Link to post
Share on other sites

Try first on your side to make a simple scene with basic meshes (not loaded) and check if you have the same problem.

 

Quote

a cleaner solution would be an all-penetrating ray returning an array of pickedMesh objects ordered on hit-first basis. And that would be one bloody useful feature too!

Yea :)

Share this post


Link to post
Share on other sites

:)

Max123... um... you didn't give many details but... could your parented-to-camera wall be see-through... because camera.minZ is set to high?  (just checking).

Nah, that doesn't sound correct.  Target is parented to camera, not wall.  hmm

Yep, Max needs to build us a playground... or go searching for picking ray examples with a bloody playground search.  :)

Share this post


Link to post
Share on other sites

Hello dear friends !

 

Here is a PG with a ray working :

http://www.babylonjs-playground.com/#1LZJEK#3

It is without predicate so it picks the first mesh.

At the beginning, it touches box2 before the elements get positionned so we can wait before launching the raycast() if we need.

After, wall get touched, then box2 and finally nothing once all mesh have moved away.

I don't know if my math method is the best.

 

I made a raycast2 function with another method :

function raycast2(){

    var vector1 = new BABYLON.Vector3(0,0,6);
    var vector2 = new BABYLON.Vector3(0,0,1);
    
    var ray = new BABYLON.Ray(vector1, vector2, 100);
    ray = BABYLON.Ray.Transform(ray, box1.getWorldMatrix());    // new method, there is an another one to create a ray
    
    var raycast = scene.pickWithRay(ray, null, false);
    
    if (raycast.hit){
      console.log(raycast.pickedMesh.name);
    }else{
      console.log('no');
    }

} // raycast2()

-----------------

Is it possible to make a draw ray function please (to debug) ?

How the Text2d works ? I can't display it. A simple example is welcome.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now


  • Recently Browsing   0 members

    No registered users viewing this page.