Просмотр исходного кода

a cube! rotating! and stuff.

exciting. i don't yet understand how rotation works, but it's fun! that
is, i understand the matrix magic, but not how the sin & cos values
really work.

but it's a cube. and it rotates.
Lucas Stadler лет назад: 12
Родитель
Сommit
0e869f2326
1 измененных файлов с 193 добавлено и 17 удалено
  1. 193 17
      js/pixl/public/trixl.html

+ 193 - 17
js/pixl/public/trixl.html

@ -19,32 +19,27 @@
19 19
		investigate the third dimension.
20 20
	</canvas>
21 21
	<script type="gl/vertex-shader">
22
		attribute vec2 pos;
22
		attribute vec3 pos;
23
		varying vec3 world_pos;
24
25
		uniform mat4 transform;
23 26
24 27
		void main() {
25
			gl_Position = vec4(pos, 0, 1);
28
			world_pos = pos;
29
			//gl_Position = clipspace(dim.x, dim.y) * vec4(pos + translation, 1);
30
			gl_Position = vec4(transform * vec4(pos, 1));
26 31
		}
27 32
	</script>
28 33
	<script type="gl/fragment-shader">
29 34
		precision mediump float;
35
		varying vec3 world_pos;
30 36
31 37
		void main() {
32
			gl_FragColor = vec4(0.2, 0.2, 0.2, 1);
38
			//gl_FragColor = vec4(gl_FragCoord.x / 901.0, gl_FragCoord.y / 688.0, 0.5, 1);
39
			gl_FragColor = vec4(world_pos.x, world_pos.y, world_pos.z, 1);
33 40
		}
34 41
	</script>
35 42
	<script>
36
		window.trixl = {};
37
		trixl.stage = document.querySelector("#stage");
38
		trixl.window = {w: window.innerWidth, h: window.innerHeight};
39
		trixl.stage.width = trixl.window.w;
40
		trixl.stage.height = trixl.window.h;
41
		var gl = trixl.gl = trixl.stage.getContext("webgl");
42
43
		var vertexPosBuffer = gl.createBuffer();
44
		gl.bindBuffer(gl.ARRAY_BUFFER, vertexPosBuffer);
45
		var vertices = [-0.5, -0.5, 0.5, -0.5, 0.0, 0.5];
46
		gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertices), gl.STATIC_DRAW);
47
48 43
		var createShader = function(src, type) {
49 44
			var shader = gl.createShader(type);
50 45
			gl.shaderSource(shader, src);
@ -68,14 +63,195 @@
68 63
			return program;
69 64
		}
70 65
66
		var geometry = {};
67
		geometry.cube = function() {
68
			return [
69
				// front
70
				0, 0, 0,
71
				1, 0, 0,
72
				0, 1, 0,
73
				0, 1, 0,
74
				1, 0, 0,
75
				1, 1, 0,
76
77
				// back
78
				1, 0, 1,
79
				0, 0, 1,
80
				1, 1, 1,
81
				1, 1, 1,
82
				0, 0, 1,
83
				0, 1, 1,
84
85
				// left
86
				0, 0, 1,
87
				0, 0, 0,
88
				0, 1, 1,
89
				0, 1, 1,
90
				0, 0, 0,
91
				0, 1, 0,
92
93
				// right
94
				1, 0, 0,
95
				1, 0, 1,
96
				1, 1, 0,
97
				1, 1, 0,
98
				1, 0, 1,
99
				1, 1, 1,
100
101
				// top
102
				0, 1, 0,
103
				1, 1, 0,
104
				0, 1, 1,
105
				0, 1, 1,
106
				1, 1, 0,
107
				1, 1, 1,
108
109
				// bottom
110
				0, 0, 1,
111
				1, 0, 1,
112
				0, 0, 0,
113
				0, 0, 0,
114
				1, 0, 1,
115
				1, 0, 0
116
			];
117
		};
118
119
		var matrix = {};
120
		matrix.multiply = function(a, dim_a, b, dim_b) {
121
			if (dim_a[1] != dim_b[0]) {
122
				throw new Error("cols a != rows b");
123
			} else {
124
				var c = [];
125
				var s = dim_a[1];
126
				var n = dim_a[0],
127
				    m = dim_b[1];
128
				for (var i = 0; i < n; i++) {
129
					for (var j = 0; j < m; j++) {
130
						var sum = 0;
131
						for (var k = 0; k < s; k++) {
132
							sum += a[i * s + k] * b[k * m + j];
133
						}
134
						c[i * m + j] = sum;
135
					}
136
				}
137
				return c;
138
			}
139
		};
140
141
		matrix.multiplyMany4x4 = function() {
142
			var m = arguments[0];
143
			for(var i = 1; i < arguments.length; i++) {
144
				m = matrix.multiply(m, [4, 4], arguments[i], [4, 4]);
145
			}
146
			return m;
147
		}
148
149
		matrix.transpose = function(m, dim) {
150
			var t = [];
151
			for(var i = 0; i < dim[0]; i++) {
152
				for(var j = 0; j < dim[1]; j++) {
153
					t[j * dim[0] + i] = m[i * dim[1] + j];
154
				}
155
			}
156
			return t;
157
		}
158
159
		matrix.translate = function(tx, ty, tz) {
160
			var tx = tx || 0.0, ty = ty || 0.0, tz = tz || 0.0;
161
			return [
162
				1, 0, 0, tx,
163
				0, 1, 0, ty,
164
				0, 0, 1, tz,
165
				0, 0, 0,  1
166
			];
167
		}
168
169
		matrix.scale = function(sx, sy, sz) {
170
			var sx = sx || 1.0, sy = sy || 1.0, sz = sz || 1.0;
171
			return [
172
				sx, 0,  0,  0,
173
				0,  sy, 0,  0,
174
				0,  0,  sz, 0,
175
				0,  0,  0,  1
176
			];
177
		}
178
179
		matrix.rotateX = function(angle) {
180
			var s = Math.sin(angle);
181
			var c = Math.cos(angle);
182
			return [
183
				1,  0, 0, 0,
184
				0,  c, s, 0,
185
				0, -s, c, 0,
186
				0,  0, 0, 1
187
			];
188
		}
189
190
		matrix.rotateY = function(angle) {
191
			var s = Math.sin(angle);
192
			var c = Math.cos(angle);
193
			return [
194
				c, 0, -s, 0,
195
				0, 1,  0, 0,
196
				s, 0,  c, 0,
197
				0, 0,  0, 1
198
			];
199
		}
200
201
		matrix.rotateZ = function(angle) {
202
			var s = Math.sin(angle);
203
			var c = Math.cos(angle);
204
			return [
205
				 c, s, 0, 0,
206
				-s, c, 0, 0,
207
				 0, 0, 1, 0,
208
				 0, 0, 0, 1
209
			];
210
		}
211
	</script>
212
	<script>
213
		window.trixl = {};
214
		trixl.stage = document.querySelector("#stage");
215
		trixl.window = {w: window.innerWidth, h: window.innerHeight};
216
		trixl.stage.width = trixl.window.w;
217
		trixl.stage.height = trixl.window.h;
218
		var gl = trixl.gl = trixl.stage.getContext("webgl");
219
		//gl.enable(gl.CULL_FACE);
220
		gl.enable(gl.DEPTH_TEST);
221
222
		var vertexPosBuffer = gl.createBuffer();
223
		gl.bindBuffer(gl.ARRAY_BUFFER, vertexPosBuffer);
224
		gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(geometry.cube()), gl.STATIC_DRAW);
225
71 226
		var vs = document.querySelector("script[type='gl/vertex-shader']").textContent;
72 227
		var fs = document.querySelector("script[type='gl/fragment-shader']").textContent;
73 228
		var program = createProgram(vs, fs);
74 229
		gl.useProgram(program);
230
75 231
		program.vertexPosAttrib = gl.getAttribLocation(program, 'pos');
76 232
		gl.enableVertexAttribArray(program.vertexPosAttrib);
77
		gl.vertexAttribPointer(program.vertexPosBuffer, 2, gl.FLOAT, false, 0, 0);
78
		gl.drawArrays(gl.TRIANGLES, 0, 3);
233
		gl.vertexAttribPointer(program.vertexPosBuffer, 3, gl.FLOAT, false, 0, 0);
234
235
		var angle = {x: 0, y: 0, z: 0};
236
		setInterval(function() {
237
			program.transform = gl.getUniformLocation(program, 'transform');
238
			var transform = matrix.multiplyMany4x4(
239
				matrix.rotateX(angle.x / 5),
240
				matrix.rotateY(angle.y / 5),
241
				matrix.rotateZ(angle.z / 5),
242
				//matrix.translate(-0.5, -0.5, 0),
243
				matrix.translate(-0.5, -0.5, -0.5),
244
				matrix.scale(0.5, 0.5, 0.5)
245
			);
246
			gl.uniformMatrix4fv(program.transform, false, matrix.transpose(transform, [4, 4]));
247
248
			gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
249
			gl.drawArrays(gl.TRIANGLES, 0, 6 * 6);
250
251
			angle.x += Math.PI / 10;
252
			angle.y += Math.PI / 30;
253
			angle.z += Math.PI / 50;
254
		}, 50);
79 255
	</script>
80 256
</body>
81 257
</html>