summaryrefslogtreecommitdiff
path: root/texmf-dist/doc/latex/rmannot/examples/rm3da/js/turntable.js
diff options
context:
space:
mode:
Diffstat (limited to 'texmf-dist/doc/latex/rmannot/examples/rm3da/js/turntable.js')
-rw-r--r--texmf-dist/doc/latex/rmannot/examples/rm3da/js/turntable.js63
1 files changed, 63 insertions, 0 deletions
diff --git a/texmf-dist/doc/latex/rmannot/examples/rm3da/js/turntable.js b/texmf-dist/doc/latex/rmannot/examples/rm3da/js/turntable.js
new file mode 100644
index 00000000..62d62752
--- /dev/null
+++ b/texmf-dist/doc/latex/rmannot/examples/rm3da/js/turntable.js
@@ -0,0 +1,63 @@
+/////////////////////////////////////////////////////////////////////
+//
+// turntable.js
+//
+// JavaScript for use with `3Djscript' option of \includemovie
+//
+// * Greatly improves the rotational behaviour of the 3D object,
+// prevents it from tilting to the side while dragging the mouse.
+// This is achieved by suppressing the rolling of the camera about
+// its optical axis.
+//
+/////////////////////////////////////////////////////////////////////
+console.println("turntable.js");
+// maximum pitch (degrees from horizontal) of the camera
+var max_alpha = 88;
+var min_beta = 90 - max_alpha; // the complement
+var cos_min_beta = Math.cos(min_beta * Math.PI/180);
+var tan_min_beta = Math.tan(min_beta * Math.PI/180);
+
+var camera = scene.cameras.getByIndex(0);
+camera.axis_up = camera.up.subtract(camera.position);
+camera.axis_up.normalize();
+
+//updates the vertical axis of rotation whenever a predefined view
+//is selected from the drop down list in the 3D toolbar
+var cameraEventHandler = new CameraEventHandler();
+cameraEventHandler.onEvent = function (e) {
+ camera.axis_up = camera.up.subtract(camera.position);
+ camera.axis_up.normalize();
+}
+runtime.addEventHandler(cameraEventHandler);
+
+//suppresses camera rolling and limits camera pitch
+var mouseEventHandler = new MouseEventHandler();
+mouseEventHandler.onMouseMove = true;
+mouseEventHandler.onEvent = function (e) {
+ runtime.setCurrentTool(runtime.TOOL_NAME_ROTATE);
+ var c2c = camera.position.subtract(camera.targetPosition);
+ var roo = c2c.length;
+ c2c.normalize();
+ cos_beta = c2c.dot(camera.axis_up); //cos of enclosed angle
+
+ //correct the camera position if it is too high or too low
+ if(Math.abs(cos_beta) > cos_min_beta) {
+ //auxiliary vectors a & b
+ var a = camera.axis_up.scale(cos_beta);
+ var b = c2c.subtract(a);
+ b.normalize();
+ b.scaleInPlace(tan_min_beta * a.length);
+
+ c2c.set(a.add(b));
+ c2c.normalize();
+
+ camera.position.set(camera.targetPosition.add(c2c.scale(roo)));
+ cos_beta = c2c.dot(camera.axis_up);
+ }
+
+ //suppress rolling
+ camera.up.set(
+ camera.position.add(camera.axis_up).add(c2c.scale(-cos_beta))
+ );
+};
+runtime.addEventHandler(mouseEventHandler);