public ObjectViewer(URL url) { setLayout(new BorderLayout()); Canvas3D canvas3D = new Canvas3D(SimpleUniverse.getPreferredConfiguration()); add("Center", canvas3D); BoundingSphere bounds = new BoundingSphere(new Point3d(), 1000); BranchGroup root = new BranchGroup(); BranchGroup scene = createSceneGraph(url); scene.setBoundsAutoCompute(true); System.out.println(scene.getBounds()); BoundingSphere sceneBounds = new BoundingSphere(scene.getBounds()); SimpleUniverse univ = new SimpleUniverse(canvas3D); ViewingPlatform view = univ.getViewingPlatform(); view.setNominalViewingTransform(); Transform3D t = new Transform3D(); TransformGroup viewTransform = view.getViewPlatformTransform(); t.set(new Vector3d(0, 0, 3 * sceneBounds.getRadius())); viewTransform.setTransform(t); BranchGroup lights = new BranchGroup(); Light light = new AmbientLight(); light.setInfluencingBounds(bounds); lights.addChild(light); light = new DirectionalLight(); light.setInfluencingBounds(bounds); lights.addChild(light); root.addChild(lights); TransformGroup tg = new TransformGroup(); tg.setCapability(TransformGroup.ALLOW_TRANSFORM_READ); tg.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE); tg.addChild(scene); root.addChild(tg); MouseRotate mouse = new MouseRotate(); mouse.setTransformGroup(tg); mouse.setSchedulingBounds(bounds); root.addChild(mouse); MouseZoom mousezoom = new MouseZoom(); mousezoom.setTransformGroup(tg); mousezoom.setSchedulingBounds(bounds); root.addChild(mousezoom); Background background = new Background(1, 1, 1); background.setApplicationBounds(bounds); root.addChild(background); root.compile(); univ.addBranchGraph(root); }
public void zoomAll() { bounds = new BoundingSphere(); boolean first = true; for (VisualShape v : drawModel.getPicture()) { Bounds b = getBounds(v); if (first) bounds.set(b); else bounds.combine(getBounds(v)); first = false; } bounds.getCenter(center); scale = 1.0f / 1.3f / (float) bounds.getRadius(); updateView(); }
public float getViewPlatformDistance(BranchGroup scene, Component canvas, View view) { BoundingSphere sceneSphere = getBoundingSphere(scene); double sceneRadius = sceneSphere.getRadius(); double borderFactor = 1.3; double ratioFactor = 1.0; int canvasWidth = canvas.getWidth(); int canvasHeight = canvas.getHeight(); if (canvasWidth > canvasHeight) { ratioFactor = (double) canvasWidth / canvasHeight; } double distance = ratioFactor * borderFactor * sceneRadius / Math.tan(view.getFieldOfView() / 2); return (float) distance; }
protected void createViewBranch() { TransformGroup viewTG = new TransformGroup(); viewTG.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE); ViewPlatform viewPlatform = new ViewPlatform(); view = new View(); view.setBackClipDistance(30000); view.addCanvas3D(canvas); view.setPhysicalBody(new PhysicalBody()); view.setPhysicalEnvironment(new PhysicalEnvironment()); view.attachViewPlatform(viewPlatform); float halfRadius = (float) (getBoundingSphere(sceneBranchGroup).getRadius() / 2f); Point3d center = new Point3d(); getBoundingSphere(sceneBranchGroup).getCenter(center); BoundingSphere globalBounds = new BoundingSphere(); globalBounds.setRadius(Double.MAX_VALUE); orbitBehaviorInterim = new OrbitBehaviorInterim( canvas, viewTG, OrbitBehaviorInterim.REVERSE_ROTATE | OrbitBehaviorInterim.REVERSE_TRANSLATE); orbitBehaviorInterim.setRotationCenter(center); orbitBehaviorInterim.setViewingTransform( new Point3d( halfRadius, getViewPlatformDistance(sceneBranchGroup, canvas, view), halfRadius), center, new Vector3d(0, -1, 0), true); orbitBehaviorInterim.setVpView(view); orbitBehaviorInterim.setTransFactors(3.0, 3.0); orbitBehaviorInterim.setSchedulingBounds(globalBounds); viewTG.addChild(viewPlatform); viewTG.addChild(orbitBehaviorInterim); viewBranchGroup.addChild(viewTG); }
public double getObjRadius() { return bs.getRadius(); }
public Point3d getObjCenter() { Point3d objCenter = new Point3d(); bs.getCenter(objCenter); return objCenter; }
private MyPickResult getMouseIntersection(MouseEvent e, boolean withSnap) { MyPickResult myResult = new MyPickResult(); Point3d closestObjectPos = null; Point3d closestMarkPos = null; Node closestObject = null; Node closestMark = null; // 0: closest object; 1: closest mark pickCanvas.setShapeLocation(e); PickResult[] allResults = null; try { allResults = pickCanvas.pickAllSorted(); } catch (AssertionError ex) { } if (allResults != null) { for (PickResult result : allResults) { Shape3D s = (Shape3D) result.getNode(PickResult.SHAPE3D); if (s != null) { // only pick a Shape3D object if (closestObjectPos != null && closestMarkPos != null) { break; } try { PickIntersection intersection = result.getClosestIntersection(cameraPos); if (!(s.getParent().getParent().getParent() instanceof Mark) && !((s.getParent().getParent().getParent() instanceof Marker))) { // markdot/markline/label -> TG -> BG -> Mark/Marker try { closestObjectPos = intersection.getPointCoordinatesVW(); closestObject = s; } catch (NullPointerException ex) { } } else if ((s.getParent().getParent().getParent() instanceof Mark)) { try { closestMarkPos = intersection.getPointCoordinatesVW(); closestMark = s; } catch (NullPointerException ex) { } } } catch (NullPointerException ex) { } } } Point3d resultPos = null; Node resultNode = null; if (closestMark != null) { resultPos = closestMarkPos; // priority of result -> mark resultNode = closestMark; } else if (closestObject != null) { resultPos = closestObjectPos; resultNode = closestObject; } if (withSnap) { // snap resultPos to correct position // start trying to if cursor are inside object bounding sphere if ((closestObjectPos != null && bs.intersect(closestObjectPos)) || closestMarkPos != null && bs.intersect(closestMarkPos)) { Point3d closestObjectPos2 = null; Point3d closestMarkPos2 = null; Node closestObject2 = null; Node closestMark2 = null; // initiate snap bounds if hasn't been initiated before // "snappable" targets to be considered are the ones inside threshold if (cursorBound == null) { cursorBound = new BoundingSphere(resultPos, CURSOR_THRESHOLD); } if (thresholdBound == null) { thresholdBound = new BoundingSphere(resultPos, SNAP_THRESHOLD); } // update the bounds // only if the cursor is no longer inside current cursor bounds if (!cursorBound.intersect(resultPos)) { cursorBound.setCenter(resultPos); thresholdBound.setCenter(resultPos); } // snap to nearest point in the list of snap targets double nearestDistance = FARTHEST; double distance; Point3d nearestTarget = null; // snap to vertex. all vertexes listed in snapList if (snapList.size() > 0) { for (Point3d snapTarget : snapList) { if (thresholdBound.intersect(snapTarget)) { distance = snapTarget.distance(resultPos); if (distance < nearestDistance) { nearestDistance = distance; nearestTarget = snapTarget; } if (nearestTarget != null) { resultPos.set(nearestTarget); // snap! // pick the snapped node Vector3d camToSnapped = new Vector3d(); camToSnapped.x = resultPos.x - cameraPos.x; camToSnapped.y = resultPos.y - cameraPos.y; camToSnapped.z = resultPos.z - cameraPos.z; pickCanvas.setShapeRay(cameraPos, camToSnapped); PickResult[] allResultsSnapped = null; try { allResultsSnapped = pickCanvas.pickAllSorted(); } catch (AssertionError ex) { } if (allResultsSnapped != null) { for (PickResult result : allResultsSnapped) { Shape3D s = (Shape3D) result.getNode(PickResult.SHAPE3D); if (s != null) { // only pick a Shape3D object if (closestObjectPos2 != null && closestMarkPos2 != null) { break; } try { PickIntersection intersection = result.getClosestIntersection(cameraPos); if (!(s.getParent().getParent().getParent() instanceof Mark) && !((s.getParent().getParent().getParent() instanceof Marker))) { // markdot/markline/label -> TG -> BG -> Mark/Marker try { closestObjectPos2 = intersection.getPointCoordinatesVW(); closestObject2 = s; } catch (NullPointerException ex) { } } else if ((s.getParent().getParent().getParent() instanceof Mark)) { try { closestMarkPos2 = intersection.getPointCoordinatesVW(); closestMark2 = s; } catch (NullPointerException ex) { } } } catch (NullPointerException ex) { } } } if (closestMark2 != null) { resultPos = closestMarkPos2; // priority of result -> mark resultNode = closestMark2; } else if (closestObject2 != null) { resultPos = closestObjectPos2; resultNode = closestObject2; } } } } } } } } myResult.setPoint(resultPos); myResult.setNode(resultNode); } return myResult; }