// Example.java // Sean Cier, 29 July 1997 // Port of main.c, place8_2.c, and frame8_4.c from the PRMan tutorial // (The latter two are listings 8.2 and 8.4, respectively, from // The RenderMan Companion) import com.PostHorizon.renderMan.*; import com.PostHorizon.renderMan.rib.*; import java.util.Hashtable; public abstract class Example { protected abstract void go() throws RMException; protected abstract String getFilename(); protected abstract int getXRes(); protected abstract int getYRes(); protected abstract double getCamZoom(); protected abstract double getCamRoll(); protected abstract Point getCameraFrom(); protected abstract Point getCameraTo(); public RenderMan renderer; public Example() { renderer = new RIBOutASCII(System.out, true, 2); ((RIBOut)renderer).setStrictParamTyping(true); } protected void execute() throws RMException { Point cameraTo, cameraFrom, cameraDir; renderer.begin(); renderer.display(getFilename(), RenderMan.FILE, RenderMan.RGBA, null); renderer.format(getXRes(), getYRes(), -1.0); renderer.shadingRate(1.0); renderer.cropWindow(0.0, 1.0, 0.0, 1.0); frameCamera(getXRes()*getCamZoom(), getXRes(), getYRes()); cameraTo = getCameraTo(); cameraFrom = getCameraFrom(); cameraDir = new Point(cameraTo.getX() - cameraFrom.getX(), cameraTo.getY() - cameraFrom.getY(), cameraTo.getZ() - cameraFrom.getZ()); placeCamera(cameraFrom, cameraDir, getCamRoll()); renderer.worldBegin(); go(); renderer.worldEnd(); renderer.end(); } protected void frameCamera(double focalLength, double frameWidth, double frameHeight) throws RMException { double fov; Hashtable params = new Hashtable(); if (focalLength != 0.0) { fov = 2 * Math.atan((Math.min(frameWidth, frameHeight) * 0.5) / focalLength) * 180.0/Math.PI; params.put(RenderMan.FOV, new Double(fov)); renderer.projection(RenderMan.PERSPECTIVE, params); params.clear(); } else renderer.projection(RenderMan.ORTHOGRAPHIC, null); renderer.frameAspectRatio(frameWidth/frameHeight); } protected void placeCamera(Point position, Point direction, double roll) throws RMException { renderer.identity(); renderer.rotate(-roll, 0.0, 0.0, 1.0); aimZ(direction); renderer.translate(-position.getX(), -position.getY(), -position.getZ()); } protected void aimZ(Point direction) throws RMException { double xzlen, yzlen, yrot, xrot; if ((direction.getX() == 0) && (direction.getY() == 0) && (direction.getZ() == 0)) return; xzlen = Math.sqrt(direction.getX()*direction.getX() + direction.getZ()*direction.getZ()); if (xzlen == 0) yrot = (direction.getY() < 0) ? 180 : 0; else yrot = 180*Math.acos(direction.getZ() / xzlen) / Math.PI; yzlen = Math.sqrt(direction.getY()*direction.getY() + xzlen*xzlen); xrot = 180*Math.acos(xzlen/yzlen)/Math.PI; if (direction.getY() > 0) renderer.rotate( xrot, 1.0, 0.0, 0.0); else renderer.rotate(-xrot, 1.0, 0.0, 0.0); if (direction.getX() > 0) renderer.rotate(-yrot, 0.0, 1.0, 0.0); else renderer.rotate( yrot, 0.0, 1.0, 0.0); } }