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
120
121
122
123
124
|
MX.MobileMovements = function (cam) {
var touching = true,
moving = false,
startTime = null,
v = 12,
vr = Math.PI * 0.012,
vx = vy = vz = 0;
var directionLocked = false,
directionLockThreshold = 5
var pos = { x: 0, y: viewHeight, z: 0, rotationX: 0, rotationY: 0 }
var pointX, pointY, deltaX, deltaY, distX = 0, distY = 0, absDistX = 0, absDistY = 0, startTime
return {
init: function () {
document.addEventListener("touchstart", function(e){
if (e.touches.length == 1) {
touching = true
startTime = Date.now()
var point = event.touches[0]
pointX = point.pageX
pointY = point.pageY
distX = distY = 0
pos.x = cam.x
pos.z = cam.z
pos.rotationY = cam.rotationY
}
})
document.addEventListener("touchmove", function(e){
e.preventDefault()
if (e.touches.length == 1) {
var timestamp = Date.now()
var point = event.touches[0]
deltaX = point.pageX - pointX
deltaY = point.pageY - pointY
pointX = point.pageX
pointY = point.pageY
distX += deltaX
distY += deltaY
absDistX = abs(distX)
absDistY = abs(distY)
}
})
document.addEventListener("touchend", function(e){
e.preventDefault()
if (e.touches.length == 0) {
touching = directionLocked = false
var timestamp = Date.now()
var duration = startTime - timestamp
if (duration < 300) {
}
}
})
},
update: function () {
if (distX || distY) {
var oldDistY = absDistY, oldDistX = absDistX
absDistY = avg(absDistY, 0, 5)
var dy = (oldDistY - absDistY) * sign(distY) * 2
absDistX = avg(absDistX, 0, 5)
var dx = (oldDistX - absDistX) * sign(distX) * 2
distY = sign(distY) * absDistY
distX = sign(distX) * absDistX
pos.x -= dy * Math.cos(pos.rotationY + Math.PI / 2)
pos.z -= dy * Math.sin(pos.rotationY + Math.PI / 2)
pos.rotationY += dx / (window.innerWidth) * Math.PI / 2
cam.rotationY = pos.rotationY
app.tube("move", pos)
}
},
lock: function(){ locked = true },
unlock: function(){ locked = false },
scale: function(n){ if (n) scale = n; return scale },
resetScale: function(n){ scale = DEFAULT_SCALE },
gravity: function(g){ return typeof g == "boolean" ? gravity = g : gravity },
velocity: function(n){ v = clamp(n, 1, 50) },
jumpVelocity: function(n){ jumpV = clamp(n, 1, 50) },
}
}
// function momentum (current, start, time, lowerMargin, wrapperSize, deceleration) {
// var distance = current - start,
// speed = Math.abs(distance) / time,
// destination,
// duration;
//
// deceleration = deceleration === undefined ? 0.0006 : deceleration;
//
// destination = current + ( speed * speed ) / ( 2 * deceleration ) * ( distance < 0 ? -1 : 1 );
// duration = speed / deceleration;
//
// if ( destination < lowerMargin ) {
// destination = wrapperSize ? lowerMargin - ( wrapperSize / 2.5 * ( speed / 8 ) ) : lowerMargin;
// distance = Math.abs(destination - current);
// duration = distance / speed;
// } else if ( destination > 0 ) {
// destination = wrapperSize ? wrapperSize / 2.5 * ( speed / 8 ) : 0;
// distance = Math.abs(current) + destination;
// duration = distance / speed;
// }
//
// return {
// destination: Math.round(destination),
// duration: duration
// };
// }
|