1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
|
////////////////////////////////////////////////////////////////////////
//
// This JavaScript file is a simple concatenation of the files
// `lights.js' and `turntable.js' from the `doc/javascript' directory.
//
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
//
// lights.js
//
// example JavaScript for use with `3Djscript' option of \includemovie
//
// * Adds light sources around the object for better illumination.
//
////////////////////////////////////////////////////////////////////////
//first remove any scene lights
for (var i = scene.lights.count - 1; i >= 0; i--) {
scene.lights.removeByIndex(i);
}
//new lights
//from left
l1 = scene.createLight();
l1.color.set(1,1,1);
l1.brightness = .4;
l1.direction.set(1,0,0);
//from right
l2 = scene.createLight();
l2.color.set(1,1,1);
l2.brightness = .4;
l2.direction.set(-1,0,0);
//from bottom
l3 = scene.createLight();
l3.color.set(1,1,1);
l3.brightness = .4;
l3.direction.set(0,0,1);
//from top
l4 = scene.createLight();
l4.color.set(1,1,1);
l4.brightness = .4;
l4.direction.set(0,0,-1);
//from front
l5 = scene.createLight();
l5.color.set(1,1,1);
l5.brightness = .4;
l5.direction.set(0,1,0);
//from back
l6 = scene.createLight();
l6.color.set(1,1,1);
l6.brightness = .4;
l6.direction.set(0,-1,0);
/////////////////////////////////////////////////////////////////////
//
// 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.
//
/////////////////////////////////////////////////////////////////////
// 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);
//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) {
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);
|