Matching mouse clicks to 3D co-ords

Started by Hrolf1, February 05, 2005, 10:57:16 PM

Previous topic - Next topic

Hrolf1

Hi!

I'm writing an applet where an insect follows mouse clicks.
The camera follows the insect from behind (height -240, distance 300).
To save valuable processing time the flat (ie Y=0) landscape is rendered as one big square with a texture on it.
I can use Interact2D to find the landscape, but how do I get more precise x,y,z 3D co-ords from the 2D (x,y)  where the user clicked? I know the y will be 0 but I'm not good enough at maths to work out how to get x & z!
The only way I can think of is breaking the landscape into lots of polys and using Interact2D, but this would play havoc with my processing time!
Can you help?

rolz

should be somewhere in examples


   /**
    * get 3d coordinate of srcPoint on object's surface from 2d coordinates.
    *
    * @param camera scene camera
    * @param buffer
    * @param x      screen (mouse) X coordinate
    * @param y      screen (mouse) Y coordinate
    * @param object to check against
    * @return
    */
   public static SimpleVector getAbsoluteCoordinate(Camera camera, FrameBuffer buffer, int x, int y, Object3D object) {
       SimpleVector rezult = null;
       if (camera != null && buffer != null) {
           SimpleVector rayTemp = Interact2D.reproject2D3D(camera, buffer, x, y);

           rayTemp.normalize();
           Matrix orient = camera.getFront();
           float[] dump = orient.getDump();
           SimpleVector ray = new SimpleVector();
           ray.x = dump[0] * rayTemp.x + dump[1] * rayTemp.y + dump[2] * rayTemp.z + dump[3] * 1;
           ray.y = dump[4] * rayTemp.x + dump[5] * rayTemp.y + dump[6] * rayTemp.z + dump[7] * 1;
           ray.z = dump[8] * rayTemp.x + dump[9] * rayTemp.y + dump[10] * rayTemp.z + dump[11] * 1;

           float distance = object.rayIntersectsAABB(camera.getPosition(), ray);

           if (distance != Object3D.RAY_MISSES_BOX) {
               rezult = new SimpleVector(camera.getPosition());
               ray.scalarMul(distance);
               rezult.add(ray);
           }
       }
       return rezult;
   }
Regards,
Andrei

Hrolf1

Thanks Andrei!

This works great (but I needed to add 'isNormalized=true' to the end of rayIntersectsAABB to get y=0).

If you're ever in the UK I'll buy you a beer!

Cheers!