blob: db6da0f81a0ef4eb84e9215aab84f80f37cb4508 (
plain)
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
|
// double, double => rotation matrix
// require https://cdn.rawgit.com/humbletim/glm-js/31fd034b/build/glm-js.min.js
var arcballLib = {
arcball: function(oldmouse, newmouse) {
let oldMouseNew = [0, 0, 0];
let newMouseNew = [0, 0, 0];
let testNorm = this.twonorm(oldmouse);
if (testNorm > 1) {
oldMouseNew[0] = oldmouse[0] / testNorm;
oldMouseNew[1] = oldmouse[1] / testNorm;
} else {
oldMouseNew[0] = oldmouse[0];
oldMouseNew[1] = oldmouse[1];
}
let testNorm2 = this.twonorm(newmouse);
if (testNorm2 > 1) {
newMouseNew[0] = newmouse[0] / testNorm2;
newMouseNew[1] = newmouse[1] / testNorm2;
} else {
newMouseNew[0] = newmouse[0];
newMouseNew[1] = newmouse[1];
}
var z1squared = 1 - (oldMouseNew[1] ** 2) - (oldMouseNew[0] ** 2);
if (z1squared < 0 && z1squared > -0.00001) {
z1squared = 0;
}
var z2squared = 1 - (newMouseNew[1] ** 2) - (newMouseNew[0] ** 2);
if (z2squared < 0 && z2squared > -0.00001) {
z2squared = 0;
}
oldMouseNew[2] = Math.sqrt(z1squared);
newMouseNew[2] = Math.sqrt(z2squared);
if (isNaN(oldMouseNew[2]) || isNaN(newMouseNew[2])) {
alert('Error!');
}
let oldMouseVec = glm.vec3(...oldMouseNew);
let newMouseVec = glm.vec3(...newMouseNew);
let axis = glm.normalize(glm.cross(oldMouseVec, newMouseVec));
// console.log(axis[0], axis[1], axis[2]);
let angle = Math.acos(glm.dot(oldMouseVec, newMouseVec));
return [angle, axis]
},
twonorm: function(v) {
let normSq = 0
for (let i = 0; i < v.length; i++) {
normSq += (v[i] ** 2);
}
return Math.sqrt(normSq);
}
}
|