Sign in to follow this  
Lord_Evil

[java] Java3D unprojection

Recommended Posts

Hi, I have another question on Java3D. For my camera class I want to provide a screenToWorld() method that takes the mouse position and a depth and returns the corresponding world coordinates. The problem is that I can't find any proper methods/functionality in Java3D to do this. There is a getInverseVworldProjection(...) method in Canvas3D but the returned matrix seems very odd. As an example, if I transform (0,0,1) with that matrix I get something like (0, 10000, 10000) with my camera being located at (0,20,20) looking at (0,0,0) and far plane distance = 100). If the camera moves the values for y and z seem to change exponentially. I found a workaround that does the job but I'd like to have a proper calculation. The workaround is as follows:
public Point3d screenToWorld(Point2d pPoint, double pDepth) {
        //get the only canvas
        Canvas3D tCanvas3D = view.getCanvas3D(0);
        
        //get eye position
        Point3d tEyePos = new Point3d();
        tCanvas3D.getCenterEyeInImagePlate(tEyePos);
        
        //get the screen coords of the point
        Point3d tMouseCoords = new Point3d();
        tCanvas3D.getPixelLocationInImagePlate(pPoint, tMouseCoords);

        //project eye and screen pos to world
        Transform3D tTransform = new Transform3D();
        tCanvas3D.getImagePlateToVworld(tTransform);
        tTransform.transform(tMouseCoords);
        tTransform.transform(tEyePos);

        //create a direction vector from eye to screen with the desired length (depth * distance of far plane)  
        Vector3d tDir = new Vector3d(tMouseCoords);
        tDir.sub(tEyePos);
        tDir.normalize();
        tDir.scale(pDepth * view.getBackClipDistance());
        
        //world pos is eye + direction vector
        Point3d tWorldCoords = new Point3d(tEyePos);
        tWorldCoords.add(tDir);

        return tWorldCoords;
    }


Does anyone know how to correctly and efficiently unproject screen coordinates in Java3D?

Share this post


Link to post
Share on other sites
Considering Java3D is pretty much dead (sun stopped supporting it) I think you'll have trouble getting answers for your question.. If you want you could take a look at newer and more supported engines like jMonkeyEngine, jPCT, or Xith3D.

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

Sign in to follow this