//************************************** // 3D POSES // Written by Jarek Rossignac, June 2006 //************************************* pt mark = new pt(0,0,0); pt eye = new pt(0,-3,10); vec up = new vec(0,-1,0); pt Origin=new pt(0,0,0); cam C = new cam(eye, Origin); cam C1 = new cam(eye, Origin); cam C2 = new cam(eye, Origin); void initView() {C.F.setTo(mark); C.E.setTo(eye); C.recomputeD(); C.U.setTo(up); C.computePose();} class cam { float D=10, sD=D; pt E = new pt(0,0,D); pt sE = new pt(0,0,D); pt F = new pt(0,0,0); pt sF = new pt(0,0,0); vec U = new vec(0,1,0); vec I = new vec(1,0,0); vec J = new vec(0,1,0); vec K = new vec(0,0,1); int px=0, py=0; cam (pt pE, pt pF) {E.setTo(pE); F.setTo(pF); D=E.disTo(F);}; void apply() { camera(E.x,E.y,E.z,F.x,F.y,F.z,U.x,U.y,U.z); }; void setMark() { float x=float(mouseX-width/2)*2/width; float y=float(mouseY-height/2)*2/height; mark.setTo(F); mark.addScaledVec(x*D,I); mark.addScaledVec(y*D,J); eye.setTo(E); }; void write() {print("camera:"); println("D="+D); print("E="); E.write(); print("F="); F.write(); print("U="); U.write(); println();}; void anchor() {px=mouseX; py=mouseY; sE.setTo(E); sF.setTo(F); sD=D;}; void snap() {E.setTo(sE); F.setTo(sF); D=sD;}; void snapD() {D=sD; println(">> snapped D="+D); }; void computePose() { vec nK=F.vecTo(E); if (nK.norm()>0.0001) {K.setTo(nK);} else {println("keep K");}; K.makeUnit(); vec nI=cross(U,K); if (nI.norm()<0.0001) {nI.setTo(I); println("I=UxJ");}; nI.makeUnit(); I.setTo(nI); J.setTo(cross(K,I)); J.makeUnit(); } void showPose() {vec II = I.make(); II.mul(100); stroke(250,20,20); II.show(F); vec JJ = U.make(); JJ.mul(100); stroke(0,200,50); JJ.show(F); } void pullF() {float cD=F.disTo(E); if (abs(cD)<0.001) {F.setTo(E); F.addScaledVec(D,K);} else {F.moveTowards((cD-D)/cD,E);};}; void pullE() {float cD=F.disTo(E); if (abs(cD)<0.001) {E.setTo(F); E.addScaledVec(D,K);} else {E.moveTowards((cD-D)/cD,F);};}; void recomputeD() {D=E.disTo(F);}; void fly(float s) { float r=width*2; float x=(mouseX-width/2)/r; float y=(mouseY-height/2)/r; F.addScaledVec(x,I); F.addScaledVec(y,J); F.addScaledVec(-s,K); }; void Turn() { float x=-(mouseX-width/2)*D/width/100; float y=-(mouseY-height/2)*D/height/100; F.addScaledVec(x,I); F.addScaledVec(y,J); if (cross(U,F.vecTo(E)).norm()<0.1) { F.addScaledVec(-x/10.0,I); F.addScaledVec(-y/10.0,J); }; }; void turn() { float x=-(mouseX-px)*D/width; float y=-(mouseY-py)*D/height; F.setTo(sF); F.addScaledVec(x,I); F.addScaledVec(y,J); if (cross(U,F.vecTo(E)).norm()<0.1) { F.addScaledVec(-x/10.0,I); F.addScaledVec(-y/10.0,J); }; }; void Pan() { float r=16*width/D; float x=(mouseX-width/2)/r; float y=(mouseY-height/2)/r; E.addScaledVec(x,I); E.addScaledVec(y,J); // if (cross(U,F.vecTo(E)).norm()<0.1) { F.addScaledVec(-x/10.0,I); F.addScaledVec(-y/10.0,J); }; }; void pan() { float r=width/D/2; float x=(mouseX-px)/r; float y=(mouseY-py)/r; E.setTo(sE); E.addScaledVec(x,I); E.addScaledVec(y,J); if (cross(U,F.vecTo(E)).norm()<0.1) { F.addScaledVec(-x/10.0,I); F.addScaledVec(-y/10.0,J); }; }; void zoom() {float y=-(mouseY-py)*20/width; D=sD+y; }; void track (cam K) {float s=0.25; E.moveTowards(s,K.E); F.moveTowards(s,K.F); this.recomputeD(); U.addScaled(s,K.U); U.makeUnit(); this.computePose(); this.anchor();} void setToCam (cam K) {E.setTo(K.E); F.setTo(K.F); this.recomputeD(); U.setTo(K.U); U.makeUnit(); this.computePose(); this.anchor();} }