Mercurial > hg > Members > e085737 > sample
view Earth_x/universe_x.html @ 21:87850fc55445
save
author | <e085737> |
---|---|
date | Sun, 16 Jan 2011 00:57:53 +0900 |
parents | 0800fc0944ac |
children |
line wrap: on
line source
<html> <head> <title>Earth and Mars</title> <script src="jkl-parsexml.js"></script> <script src="exml.js"></script> <script src="resources/J3DI.js"> </script> <script src="resources/J3DIMath.js" type="text/javascript"> </script> <script id="vshader" type="x-shader/x-vertex"> uniform mat4 u_modelViewProjMatrix; uniform mat4 u_normalMatrix; uniform vec3 lightDir; attribute vec3 vNormal; attribute vec4 vTexCoord; attribute vec4 vPosition; varying float v_Dot; varying vec2 v_texCoord; void main() { gl_Position = u_modelViewProjMatrix * vPosition; v_texCoord = vTexCoord.st; vec4 transNormal = u_normalMatrix * vec4(vNormal,1); v_Dot = max(dot(transNormal.xyz, lightDir), 0.0); } </script> <script id="fshader" type="x-shader/x-fragment"> #ifdef GL_ES precision mediump float; #endif uniform sampler2D sampler2d; varying float v_Dot; varying vec2 v_texCoord; void main() { vec4 color = texture2D(sampler2d,v_texCoord); color += vec4(0.1,0.1,0.1,1); gl_FragColor = vec4(color.xyz * v_Dot, color.a); } </script> <script> function init() { var gl = initWebGL("example", "vshader", "fshader", [ "vNormal", "vTexCoord", "vPosition"], [ 0, 0, 0, 1 ], 10000); gl.uniform3f(gl.getUniformLocation(gl.program, "lightDir"), 0, 0, 1); gl.uniform1i(gl.getUniformLocation(gl.program, "sampler2d"), 0); gl.enable(gl.TEXTURE_2D); // xml_fileからtextureを読み込んでいる。 loadObjXml(gl, "./earth.xml"); loadObjXml(gl, "./moon.xml"); return gl; } width = -1; height = -1; function reshape(ctx) { var canvas = document.getElementById('example'); if (canvas.width == width && canvas.width == height) return; width = canvas.width; height = canvas.height; ctx.viewport(0, 0, width, height); ctx.perspectiveMatrix = new J3DIMatrix4(); ctx.perspectiveMatrix.perspective(30, width/height, 1, 10000); ctx.perspectiveMatrix.lookat(0,0,500, 0, 0, 0, 0, 1, 0); } function drawOne(ctx, glObj, star) { // setup VBOs ctx.enableVertexAttribArray(0); ctx.enableVertexAttribArray(1); ctx.enableVertexAttribArray(2); ctx.bindBuffer(ctx.ARRAY_BUFFER, glObj.vertexObject); ctx.vertexAttribPointer(2, 3, ctx.FLOAT, false, 0, 0); ctx.bindBuffer(ctx.ARRAY_BUFFER, glObj.normalObject); ctx.vertexAttribPointer(0, 3, ctx.FLOAT, false, 0, 0); ctx.bindBuffer(ctx.ARRAY_BUFFER, glObj.texCoordObject); ctx.vertexAttribPointer(1, 2, ctx.FLOAT, false, 0, 0); ctx.bindBuffer(ctx.ELEMENT_ARRAY_BUFFER, glObj.indexObject); var mvMatrix = new J3DIMatrix4(); var $siman2 = new J3DIMatrix4(); mvMatrix = star.mat; mvMatrix.rotate(star.angle, 0,1,0); // 親の変換行列を取得 mvMatrix.translate(star.x,star.y,star.z); mvMatrix.getAsArrayMatrix($siman2.$matrix); // 自身の変換行列を取得 for(num in star.cn){ star.cn.mat = $siman2; // 自分の子どもに変換行列を渡す。 } mvMatrix.scale(star.scale, star.scale, star.scale); var normalMatrix = new J3DIMatrix4(mvMatrix); normalMatrix.invert(); normalMatrix.transpose(); normalMatrix.setUniform(ctx, ctx.getUniformLocation(ctx.program, "u_normalMatrix"), false); var mvpMatrix = new J3DIMatrix4(ctx.perspectiveMatrix); mvpMatrix.multiply(mvMatrix); mvpMatrix.setUniform(ctx, ctx.getUniformLocation(ctx.program, "u_modelViewProjMatrix"), false); ctx.bindTexture(ctx.TEXTURE_2D, glObj.texture); ctx.drawElements(ctx.TRIANGLES, glObj.numIndices, ctx.UNSIGNED_SHORT, 0); } function drawPicture(ctx) { reshape(ctx); ctx.clear(ctx.COLOR_BUFFER_BIT | ctx.DEPTH_BUFFER_BIT); var Moon2 = new star( ctx.obj.Moon, null, currentAngle, 20, 0, 0, 0.3); var Moon = new star( ctx.obj.Moon, Moon2, currentAngle , 200, 0, 0, 0.6); var Earth = new star( ctx.obj.Earth, Moon, currentAngle, 0, 0, 0, 1.0); render(ctx,Earth); ctx.flush(); framerate.snapshot(); currentAngle += incAngle; if (currentAngle > 360) currentAngle -= 360; } function start() { var c = document.getElementById("example"); var w = Math.floor(window.innerWidth * 0.9); var h = Math.floor(window.innerHeight * 0.9); c.width = w; c.height = h; var ctx = init(); currentAngle = 0; incAngle = 0.4; var f = function() { drawPicture(ctx) }; setInterval(f, 10); framerate = new Framerate("framerate"); } function render(ctx,star){ var p = new Object(); for(p=star; p; p = p.cn ){ drawOne(ctx, p.texture, p); } } // 惑星の情報を格納している。 function star(texture,cn,angle,x,y,z,scale){ this.x = x; this.y = y; this.z = z; this.mat = new J3DIMatrix4(); this.angle = angle; this.scale = scale; this.texture = texture; this.cn = cn; // 子どもの名前 return this; } </script> <style type="text/css"> canvas { border: 2px solid black; } </style> </head> <body onload="start()"> <canvas id="example"> There is supposed to be an example drawing here, but it's not important. </canvas> <div id="framerate"></div> <div id="console"></div> </body> </html>