xxxxxxxxxx
1
<div class="controls">
2
<span>Hold the left mouse button to rotate the view.</span>
3
</div>
4
5
xxxxxxxxxx
1
body
2
{
3
overflow: hidden;
4
}
5
6
.controls
7
{
8
position: absolute;
9
z-index: 100;
10
margin: 3vmin;
11
}
12
13
.controls span
14
{
15
color: white;
16
padding: 0 3vmin 0 5vmin;
17
}
18
19
xxxxxxxxxx
1
var renderer, controls,scene, camera, light;
2
3
var waterSettings = {
4
base: 0.001,
5
size: {
6
x: 8,
7
y: 0,
8
z: 8
9
},
10
maxValue: 8,
11
selected: 0,
12
level: 1,
13
slosh: 0,
14
sloshRange: [0.5, 0.5],
15
sections: 10,
16
range: 0.05,
17
ranges: [0.06, 0.05],
18
spaceBetween: 20,
19
speed: 0.05
20
}
21
22
var timeline = new TimelineMax();
23
var sloshAnimation = new TimelineMax();
24
25
var waterBlocks = [{
26
title: 'One'
27
}];
28
29
function init() {
30
// renderer
31
32
renderer = new THREE.WebGLRenderer({
33
antialias: true,
34
alpha: true
35
});
36
renderer.setSize(window.innerWidth, window.innerHeight);
37
renderer.setClearColor(0x222428, 1);
38
document.body.appendChild(renderer.domElement);
39
40
// scene
41
42
scene = new THREE.Scene();
43
44
// camera
45
46
var aspect = window.innerWidth / window.innerHeight;
47
var d = 10;
48
camera = new THREE.PerspectiveCamera( 45, window.innerWidth / window.innerHeight, 1, 1000 );
49
controls = new THREE.OrbitControls(camera);
50
camera.position.set(20, 20, 20);
51
controls.update();
52
53
// materials
54
55
var waterSides = new THREE.MeshPhongMaterial({
56
color: 0x4DBFE1,
57
side: THREE.DoubleSide,
58
transparent: true,
59
opacity: 0.8,
60
shading: THREE.FlatShading,
61
specular: 0x4DBFE1,
62
shininess: 5,
63
});
64
65
var waterTop = new THREE.MeshPhongMaterial({
66
color: 0x14435C,
67
side: THREE.DoubleSide,
68
shading: THREE.FlatShading,
69
transparent: true,
70
opacity: 0.9,
71
specular: 0xFFFFFF,
72
shininess: 10,
73
});
74
75
var materials = [waterSides, waterSides, waterTop, waterSides, waterSides, waterSides];
76
77
78
//light
79
80
light = new THREE.PointLight(0xffffff, 2, 600, 5);
81
light.position.set(waterSettings.size.x + 1.5, waterSettings.maxValue * 2, (waterSettings.size.z + 1) - (waterSettings.spaceBetween * waterSettings.selected));
82
scene.add(light);
83
84
//grid
85
86
var grid = new THREE.GridHelper(200, 2);
87
grid.setColors(0x2B2A2F, 0x2B2A2F);
88
scene.add(grid);
89
90
// water blocks
91
92
for (var j = 0; j < waterBlocks.length; j++)
93
{
94
var group = new THREE.Group();
95
96
waterBlocks[j].group = group;
97
waterBlocks[j].water = null;
98
waterBlocks[j].waterMesh = null;
99
waterBlocks[j].sloshOffsets = [];
100
waterBlocks[j].topVertices = [];
101
waterBlocks[j].angles = [];
102
103
//floor
104
105
var floorGeometry = new THREE.BoxGeometry(waterSettings.size.x, 0.5, waterSettings.size.z);
106
floorGeometry.applyMatrix(new THREE.Matrix4().makeTranslation(0, 0.25, 0));
107
108
var floor = new THREE.Mesh(
109
floorGeometry,
110
new THREE.MeshLambertMaterial({
111
color: 0x333333
112
})
113
);
114
floor.position.y = 0;
115
floor.position.x = 0;
116
floor.position.z = 0;
117
118
group.add(floor);
119
120
//sphere
121
122
var geometry = new THREE.SphereGeometry( 2, 15, 15 );
123
var material = new THREE.MeshLambertMaterial( {color: 0xff5555} );
124
var sphere = new THREE.Mesh( geometry, material );
125
sphere.position.y = 5;
126
group.add( sphere );
127
128
// geometry
129
waterBlocks[j].water = new THREE.BoxGeometry(waterSettings.size.x, waterSettings.maxValue, waterSettings.size.z, waterSettings.sections, 1, waterSettings.sections);
130
131
var count = 0;
132
var pos = 0 - Math.floor(waterSettings.sections / 2);
133
var zeds = [];
134
135
for (var i = waterBlocks[j].water.vertices.length - 1; i >= 0; i--) {
136
137
if (waterBlocks[j].water.vertices[i].y >= (waterSettings.maxValue / 2))
138
{
139
waterBlocks[j].topVertices.push(waterBlocks[j].water.vertices[i]);
140
zeds.push(waterBlocks[j].water.vertices[i].z)
141
waterBlocks[j].angles.push(count + waterSettings.speed + (Math.random()*2));
142
waterBlocks[j].sloshOffsets.push( Math.random() / 2);
143
count++;
144
}
145
};
146
147
zeds = _.uniq(zeds);
148
zeds.sort(function(a, b)
149
{
150
return a - b
151
});
152
153
for (var i = waterBlocks[j].topVertices.length - 1; i >= 0; i--)
154
{
155
waterBlocks[j].topVertices[i].zPos = zeds.indexOf(waterBlocks[j].topVertices[i].z) - Math.floor(zeds.length / 2);
156
}
157
158
waterBlocks[j].water.applyMatrix(new THREE.Matrix4().makeTranslation(0, (waterSettings.maxValue / 2) - waterSettings.base, 0));
159
160
// mesh
161
waterBlocks[j].waterMesh = new THREE.Mesh(waterBlocks[j].water, new THREE.MeshFaceMaterial(materials));
162
waterBlocks[j].waterMesh.position.y = 0.51;
163
waterBlocks[j].waterMesh.position.x = 0;
164
waterBlocks[j].waterMesh.position.z = 0;
165
group.add(waterBlocks[j].waterMesh);
166
167
waterBlocks[j].wireframe = new THREE.WireframeHelper( waterBlocks[j].waterMesh, 0x00ff00 );
168
//group.add(waterBlocks[j].wireframe);
169
170
scene.add(group);
171
172
group.position.z = 0 - j * waterSettings.spaceBetween;
173
};
174
}
175
176
function render() {
177
controls.update();
178
renderer.render(scene, camera);
179
}
180
181
function animate() {
182
//
183
184
185
requestAnimationFrame(animate);
186
187
for (var i = 0; i < waterBlocks.length; i++)
188
{
189
waterBlocks[i].waterMesh.scale.y = waterSettings.size.y / 100;
190
191
for (var j = waterBlocks[i].topVertices.length - 1; j >= 0; j--)
192
{
193
var sloshAmount = waterBlocks[i].topVertices[j].zPos * waterSettings.slosh * waterBlocks[i].sloshOffsets[j];
194
waterBlocks[i].topVertices[j].y = sloshAmount + (waterSettings.maxValue + Math.sin(waterBlocks[i].angles[j]) * waterSettings.range);
195
waterBlocks[i].angles[j] += waterSettings.speed;
196
}
197
198
waterBlocks[i].water.verticesNeedUpdate = true;
199
}
200
201
render();
202
}
203
204
function next()
205
{
206
var toSelect = waterSettings.selected + 1;
207
if(toSelect >= waterBlocks.length) toSelect = 0;
208
selectBlock(toSelect, waterSettings.selected);
209
}
210
211
function prev()
212
{
213
var toSelect = waterSettings.selected - 1;
214
if(toSelect < 0) toSelect = waterBlocks.length - 1;
215
selectBlock(toSelect, waterSettings.selected);
216
}
217
218
function selectBlock(newPos, oldPos)
219
{
220
waterSettings.selected = newPos;
221
var targetSlosh = 0;
222
var sloshAmount = (((waterSettings.sloshRange[0] - waterSettings.sloshRange[1]) / 100) * (100 - waterSettings.size.y)) + waterSettings.sloshRange[1]
223
if (newPos > oldPos) targetSlosh = -sloshAmount
224
else if (newPos < oldPos) targetSlosh = sloshAmount
225
226
sloshAnimation.clear()
227
sloshAnimation.append(TweenMax.to(waterSettings, 0.4, {
228
slosh: targetSlosh,
229
ease: Power2.easeIn
230
}));
231
sloshAnimation.append(TweenMax.to(waterSettings, 2.5, {
232
slosh: 0,
233
ease: Elastic.easeOut
234
}));
235
sloshAnimation.restart();
236
237
TweenMax.to(sceneSettings, 1, {
238
cameraZ: 0 - (waterSettings.spaceBetween * newPos),
239
ease: Power4.easeInOut
240
});
241
TweenMax.to(light.position, 1, {
242
z: (waterSettings.size.z + 0.5) - (waterSettings.spaceBetween * waterSettings.selected),
243
ease: Power4.easeInOut
244
});
245
}
246
247
function setWaterLevel(percent)
248
{
249
waterSettings.oldlevel = waterSettings.level;
250
251
var level = (waterSettings.maxValue / 100) * percent;
252
var p = percent == 100 ? 105 : percent;
253
TweenLite.to(waterSettings.size, 0.5, {
254
y: level > 0.5 ? p : ((0.5 / waterSettings.maxValue) * 100),
255
ease: Power2.easeInOut
256
});
257
258
var diff = percent - waterSettings.level;
259
var disturbAmount = (diff / 100) * 0.5;
260
timeline.clear()
261
var r = (((waterSettings.ranges[0] - waterSettings.ranges[1]) / 100) * (100 - waterSettings.size.y)) + waterSettings.ranges[1]
262
timeline.append(TweenMax.to(waterSettings, 0.5, {
263
range: r + disturbAmount,
264
ease: Power2.easeIn
265
}));
266
timeline.append(TweenMax.to(waterSettings, 2.5, {
267
range: r,
268
ease: Elastic.easeOut
269
}));
270
271
timeline.restart();
272
273
waterSettings.level = percent;
274
}
275
276
function randomHeight()
277
{
278
setWaterLevel(Math.random() * 100);
279
}
280
281
init();
282
render();
283
animate();
284
setWaterLevel(100);
285
286
window.addEventListener( 'resize', function ()
287
{
288
camera.aspect = window.innerWidth / window.innerHeight;
289
camera.updateProjectionMatrix();
290
291
renderer.setSize( window.innerWidth, window.innerHeight );
292
document.body.appendChild( renderer.domElement );
293
}, true );
Console errors: 0