-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathheightfield.js
More file actions
125 lines (103 loc) · 3.25 KB
/
heightfield.js
File metadata and controls
125 lines (103 loc) · 3.25 KB
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
125
var BOX_HEIGHT = 4.0;
var BOX_SIDE_WIDTH = 0.5;
var scene = new THREE.Scene();
var camera = new THREE.PerspectiveCamera(75, window.innerWidth/window.innerHeight, 0.1, 1000);
var renderer = new THREE.WebGLRenderer();
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);
var boxMaterial = new THREE.MeshPhongMaterial( { color: 0xaaaacc } );
var ground = new THREE.PlaneGeometry( 10, 10, 1, 1 );
ground.applyMatrix( new THREE.Matrix4().makeRotationX( - Math.PI / 2 ) );
var groundMesh = new THREE.Mesh(ground, boxMaterial);
scene.add(groundMesh);
var sideLeft = new THREE.CubeGeometry(BOX_SIDE_WIDTH, BOX_HEIGHT, 10);
var sideLeftMesh = new THREE.Mesh(sideLeft, boxMaterial);
sideLeftMesh.translateX(-5.25);
scene.add(sideLeftMesh);
var r = new THREE.Mesh(sideLeft, boxMaterial);
r.translateX(5.25);
scene.add(r);
var sideBack = new THREE.CubeGeometry(10 + 2 * BOX_SIDE_WIDTH, BOX_HEIGHT, BOX_SIDE_WIDTH);
var r2 = new THREE.Mesh(sideBack, boxMaterial);
r2.translateZ(-5.25);
scene.add(r2);
var r3 = new THREE.Mesh(sideBack, boxMaterial);
r3.translateZ(5.25);
scene.add(r3);
var quality = 50
var plane = new THREE.PlaneGeometry( 10, 10, quality - 1, quality - 1 );
plane.applyMatrix( new THREE.Matrix4().makeRotationX( - Math.PI / 2 ) );
var waterMat = new THREE.MeshPhongMaterial( { opacity: 0.3, transparent: true, color: 0x0000ff, specular: 0xffffff } );
var waterMesh = new THREE.Mesh(plane, waterMat);
waterMesh.receiveShadow = true;
waterMesh.castShadow = true;
scene.add(waterMesh);
// Lights
scene.add( new THREE.AmbientLight( 0x333333 ) );
var light = new THREE.PointLight( 0xffffff);
light.position.set( 2, 6, -1 );
scene.add( light );
var light2 = new THREE.PointLight( 0xffffff, 0.1);
light2.position.set( -30, 150, 100 );
scene.add( light2 );
camera.position.x = 0.0;
camera.position.y = 10;
camera.position.z = 8;
camera.lookAt( scene.position );
// Initialize height and velocity fields
var u = [];
var v = [];
for(var i=0; i < quality; i++) {
u[i] = [];
v[i] = [];
for(var j=0; j < quality; j++) {
u[i][j] = 0.5;
v[i][j] = 0;
}
}
function clamp(x) {
if (x < 0) return 0;
if (x >= quality) return quality - 1;
return x;
}
setInterval(function () {
var x = ~~(Math.random() * (quality-1));
var y = ~~(Math.random() * (quality-1));
for(var i=0; i < quality; i++) {
for(var j=0; j < quality; j++) {
var dx = i - x;
var dy = j - y;
var d = dx * dx + dy * dy;
u[i][j] += 1.5 * Math.exp(-d / 2);
}
}
}, 1000);
function render() {
requestAnimationFrame(render);
// Update velocities
for(var i=0; i < quality; i++) {
for(var j=0; j < quality; j++) {
v[i][j] += ( u[clamp(i-1)][j]
+ u[clamp(i+1)][j]
+ u[i][clamp(j-1)]
+ u[i][clamp(j+1)] ) / 4 - u[i][j];
v[i][j] *= 0.99;
}
}
// Update heights
for(var i=0; i < quality; i++) {
for(var j=0; j < quality; j++) {
u[i][j] += v[i][j];
}
}
for ( var i = 0, l = plane.vertices.length; i < l; i ++ ) {
var x = i % quality, y = ~~ ( i / quality );
plane.vertices[i].y = u[x][y];
}
plane.computeFaceNormals();
plane.computeVertexNormals();
plane.normalsNeedUpdate = true;
plane.verticesNeedUpdate = true;
renderer.render(scene, camera);
}
render();