

url "vrmlscript: function initialize() { setWindowRect(Browser.windowAspect); pos = orgPos; correctPosition(); } function aspectRatio(value,time) { setWindowRect(value); correctPosition(); } function setWindowRect(aspect) { if(aspect>1) { // if aspect>1, Y is constant, so X is relative to AspectRatio node = Browser.boundViewpoint; //print (' 1: ratio == ' + aspect); //yfovx = node.fieldOfView; //print (' 1: yfovx == ' + yfovx); if (yfov==0) { yfov = 0.785398; } //xfov = Math.atan(aspect*(Math.tan(yfov/2)))*2; right = (aspect*(Math.tan(yfov/2))) * 2.0 + 0.1; top = 0.95; } else { // if aspect<1, X is constant, so Y is relative to AspectRatio //xfov = Browser.boundViewpoint.fieldOfView; if(xfov==0) { xfov = 0.785398; } //yfov = Math.atan((Math.tan(yfov/2))/aspect)*2; right = 0.95; top = ((Math.tan(xfov/2))/aspect) * 2.0 + 0.1; } //print ('ratio == ' + aspect); //print ('yfov == ' + yfov); //print ('xfov == ' + xfov); //print ('angleRatio == ' + angleRatio); left = -right; bottom = -top; } function setRotateTrans (value,time) { rotA = new SFRotation(0,1,0, value.x*10); rotB = new SFRotation(1,0,0,-value.y*10); rotation_changed = rotA.multiply(rotB); } function doDrag(value,time) { if(!value) { orgPos = pos; } else { pos = orgPos; correctionRot = orgRot; } } function correctPosition() { // Snap position to edge of screen dx = 0; dy = 0; if(pos.x > xCenter) { dx = right-pos.x; } else { dx = pos.x-left; } if(pos.y < yCenter) { dy = pos.y-bottom; } else { dy = top-pos.y; } if(dx<dy) { if(pos.x > xCenter) { armRotation = new SFRotation(0,0,1,0); correctionRotation = new SFRotation(0,0,1,0); orgRot = new SFRotation(0,0,1,0); pos.x = right; } else { armRotation = new SFRotation(0,0,1, 3.14); correctionRotation = new SFRotation(0,0,1,-3.14); orgRot = new SFRotation(0,0,1, 3.14); pos.x = left; } } else /* dy<dx */ { if(pos.y < yCenter) { armRotation = new SFRotation(0,0,1,-1.57); correctionRotation = new SFRotation(0,0,1, 1.57); orgRot = new SFRotation(0,0,1,-1.57); pos.y = bottom; } else { armRotation = new SFRotation(0,0,1, 1.57); correctionRotation = new SFRotation(0,0,1,-1.57); orgRot = new SFRotation(0,0,1, 1.57); pos.y = top; } } // Limit position to screen if(pos.y < bottom) { pos.y = bottom; } if(pos.y > top) { pos.y = top; } if(pos.x < left) { pos.x = left; } if(pos.x > right) { pos.x = right; } newPos = pos; } function setDragTrans (value,time) { rotVal = correctionRot.multVec(value); pos = new SFVec3f(); pos.x = orgPos.x + rotVal.x; pos.y = orgPos.y + rotVal.y; pos.z = orgPos.z; correctPosition(); } " }