private void init(final Content c, final int x, final int y) { xLast = x; yLast = y; content = c; // some transforms c.getLocalToVworld(localToVWorld); localToVWorldInverse.invert(localToVWorld); canvas.getImagePlateToVworld(ipToVWorld); ipToVWorldInverse.invert(ipToVWorld); // calculate the canvas position in world coords c.getContent().getCenter(centerInVWorld); localToVWorld.transform(centerInVWorld); ipToVWorldInverse.transform(centerInVWorld, centerInIp); // get the eye point in world coordinates canvas.getCenterEyeInImagePlate(eyePtInVWorld); ipToVWorld.transform(eyePtInVWorld); // use picking to infer the radius of the virtual sphere which is rotated final Point3d p = univ.getPicker().getPickPointGeometry(c, x, y); float r = 0, dD = 0; if (p != null) { pickPtInVWorld.set(p); localToVWorld.transform(pickPtInVWorld); r = (float) pickPtInVWorld.distance(centerInVWorld); } else { c.getContent().getMin(p1); localToVWorld.transform(p1); r = (float) p1.distance(centerInVWorld); vec.sub(centerInVWorld, eyePtInVWorld); vec.normalize(); vec.scale(-r); pickPtInVWorld.add(centerInVWorld, vec); } dD = (float) pickPtInVWorld.distance(eyePtInVWorld); // calculate distance between eye and canvas point canvas.getPixelLocationInImagePlate(x, y, p1); ipToVWorld.transform(p1); final float dd = (float) p1.distance(eyePtInVWorld); // calculate the virtual distance between two neighboring pixels canvas.getPixelLocationInImagePlate(x + 1, y, p2); ipToVWorld.transform(p2); final float dx = (float) p1.distance(p2); // calculate the virtual distance between two neighboring pixels canvas.getPixelLocationInImagePlate(x, y + 1, p3); ipToVWorld.transform(p3); final float dy = (float) p1.distance(p3); final float dX = dD / dd * dx; final float dY = dD / dd * dy; anglePerPix = Math.atan2(dX, r); univ.getViewPlatformTransformer().getYDir(axisPerDx, ipToVWorld); univ.getViewPlatformTransformer().getXDir(axisPerDy, ipToVWorld); translationPerDx.set(axisPerDy); translationPerDx.scale(dX); translationPerDy.set(axisPerDx); translationPerDy.scale(dY); rotateTG = c.getLocalRotate(); translateTG = c.getLocalTranslate(); c.getContent().getCenter(vec); transl_inv.set(vec); vec.set(-vec.x, -vec.y, -vec.z); transl.set(vec); }