html5鼠标点击旋转,HTML5+WEBGL入门程序(鼠标事件,三维旋转)

WebGL中文教程

/>

src="Oak3D_v_0_5_5.js">

precision mediump

float;

varying vec2

vTextureCoord;

uniform sampler2D

uSampler;

void main(void) {

gl_FragColor = texture2D(uSampler,

vTextureCoord);

}

attribute vec3

aVertexPosition;

attribute vec2

aTextureCoord;

uniform mat4

uMVMatrix;

uniform mat4

uPMatrix;

varying vec2

vTextureCoord;

void main(void) {

gl_Position = uPMatrix * uMVMatrix *

vec4(aVertexPosition, 1.0);

vTextureCoord = aTextureCoord;

}

var gl;

function initGL(canvas)

{

try {

gl =

canvas.getContext("experimental-webgl");

gl.viewportWidth = canvas.width;

gl.viewportHeight = canvas.height;

} catch (e) {

}

if (!gl) {

alert("抱歉,不能初始化webGL!");

}

}

function getShader(gl,

id) {

var shaderScript =

document.getElementByIdx_x(id);

if (!shaderScript) {

return

null;

}

var str = "";

var k = shaderScript.firstChild;

while (k) {

if

(k.nodeType == 3) {

str += k.textContent;

}

k =

k.nextSibling;

}

var shader;

if (shaderScript.type == "x-shader/x-fragment")

{

shader =

gl.createShader(gl.FRAGMENT_SHADER);

} else if (shaderScript.type ==

"x-shader/x-vertex") {

shader =

gl.createShader(gl.VERTEX_SHADER);

} else {

return

null;

}

gl.shaderSource(shader, str);

gl.compileShader(shader);

if (!gl.getShaderParameter(shader,

gl.COMPILE_STATUS)) {

alert(gl.getShaderInfoLog(shader));

return

null;

}

return shader;

}

var shaderProgram;

function initShaders()

{

var fragmentShader = getShader(gl,

"shader-fs");

var vertexShader = getShader(gl,

"shader-vs");

shaderProgram = gl.createProgram();

gl.attachShader(shaderProgram,

vertexShader);

gl.attachShader(shaderProgram,

fragmentShader);

gl.linkProgram(shaderProgram);

if (!gl.getProgramParameter(shaderProgram,

gl.LINK_STATUS)) {

alert("Could not initialise shaders");

}

gl.useProgram(shaderProgram);

shaderProgram.vertexPositionAttribute =

gl.getAttribLocation(shaderProgram, "aVertexPosition");

gl.enableVertexAttribArray(shaderProgram.vertexPositionAttribute);

shaderProgram.textureCoordAttribute =

gl.getAttribLocation(shaderProgram, "aTextureCoord");

gl.enableVertexAttribArray(shaderProgram.textureCoordAttribute);

shaderProgram.pMatrixUniform =

gl.getUniformLocation(shaderProgram, "uPMatrix");

shaderProgram.mvMatrixUniform =

gl.getUniformLocation(shaderProgram, "uMVMatrix");

shaderProgram.samplerUniform =

gl.getUniformLocation(shaderProgram, "uSampler");

}

function handleLoadedTexture(texture) {

gl.bindTexture(gl.TEXTURE_2D, texture);

gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL,

true);

gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA,

gl.RGBA, gl.UNSIGNED_BYTE, texture.image);

gl.texParameteri(gl.TEXTURE_2D,

gl.TEXTURE_MAG_FILTER, gl.NEAREST);

gl.texParameteri(gl.TEXTURE_2D,

gl.TEXTURE_MIN_FILTER, gl.NEAREST);

gl.bindTexture(gl.TEXTURE_2D, null);

}

var neheTexture;

function initTexture()

{

neheTexture = gl.createTexture();

neheTexture.image = new Image();

neheTexture.image.onload = function () {

handleLoadedTexture(neheTexture)

}

neheTexture.image.src = "nehe.gif";

}

function

setMatrixUniforms() {

gl.uniformMatrix4fv(shaderProgram.pMatrixUniform, false,

pMatrix.toArray());

gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false,

mvMatrix.toArray());

}

var mouseDown = false;

var lastMouseX = null;

var lastMouseY = null;

var moonRotationMatrix = new okMat4();

function handleMouseDown(event) {

mouseDown =

true;

lastMouseX =

event.clientX;

lastMouseY =

event.clientY;

}

function handleMouseUp(event) {

mouseDown =

false;

}

function handleMouseMove(event) {

if (!mouseDown)

{

return;

}

var newX =

event.clientX;

var newY =

event.clientY;

var deltaX = newX -

lastMouseX

var newRotationMatrix = new

okMat4();

newRotationMatrix.rotY(OAK.SPACE_LOCAL, deltaX / 10,

true);

var deltaY = newY -

lastMouseY;

newRotationMatrix.rotX(OAK.SPACE_LOCAL, deltaY / 10,

true);

moonRotationMatrix =

okMat4Mul(newRotationMatrix, moonRotationMatrix);

lastMouseX =

newX

lastMouseY =

newY;

}

var

cubeVertexPositionBuffer;

var

cubeVertexTextureCoordBuffer;

var

cubeVertexIndexBuffer;

function initBuffers()

{

cubeVertexPositionBuffer= gl.createBuffer();

gl.bindBuffer(gl.ARRAY_BUFFER,

cubeVertexPositionBuffer);

vertices = [

//

前表面

-1.0,

-1.0,  1.0,

1.0, -1.0,  1.0,

1.0,  1.0,

1.0,

-1.0,

1.0,  1.0,

//

后表面

-1.0,

-1.0, -1.0,

-1.0,

1.0, -1.0,

1.0,  1.0, -1.0,

1.0, -1.0, -1.0,

//

上表面

-1.0,

1.0, -1.0,

-1.0,

1.0,  1.0,

1.0,  1.0,

1.0,

1.0,  1.0, -1.0,

//

下表面

-1.0,

-1.0, -1.0,

1.0, -1.0, -1.0,

1.0, -1.0,  1.0,

-1.0,

-1.0,  1.0,

//

右表面

1.0, -1.0, -1.0,

1.0,  1.0, -1.0,

1.0,  1.0,

1.0,

1.0, -1.0,  1.0,

//

左表面

-1.0,

-1.0, -1.0,

-1.0,

-1.0,  1.0,

-1.0,

1.0,  1.0,

-1.0,

1.0, -1.0

];

gl.bufferData(gl.ARRAY_BUFFER, new

Float32Array(vertices), gl.STATIC_DRAW);

cubeVertexPositionBuffer.itemSize = 3;

cubeVertexPositionBuffer.numItems = 24;

cubeVertexTextureCoordBuffer =

gl.createBuffer();

gl.bindBuffer(gl.ARRAY_BUFFER,

cubeVertexTextureCoordBuffer);

var textureCoords = [

// 前表面

0.0, 0.0,

1.0, 0.0,

1.0, 1.0,

0.0, 1.0,

// 后表面

1.0, 0.0,

1.0, 1.0,

0.0, 1.0,

0.0, 0.0,

// 上表面

0.0, 1.0,

0.0, 0.0,

1.0, 0.0,

1.0, 1.0,

// 下表面

1.0, 1.0,

0.0, 1.0,

0.0, 0.0,

1.0, 0.0,

// 右表面

1.0, 0.0,

1.0, 1.0,

0.0, 1.0,

0.0, 0.0,

// 左表面

0.0, 0.0,

1.0, 0.0,

1.0, 1.0,

0.0, 1.0,

];

gl.bufferData(gl.ARRAY_BUFFER, new

Float32Array(textureCoords), gl.STATIC_DRAW);

cubeVertexTextureCoordBuffer.itemSize = 2;

cubeVertexTextureCoordBuffer.numItems =

24;

cubeVertexIndexBuffer = gl.createBuffer();

gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER,

cubeVertexIndexBuffer);

var cubeVertexIndices = [

0, 1, 2,

0, 2, 3,

// 前表面的顶点索引数组

4, 5, 6,

4, 6, 7,

// 后表面的顶点索引数组

8, 9, 10,

8, 10, 11,  // 上表面的顶点索引数组

12, 13,

14,  12, 14, 15, // 下表面的顶点索引数组

16, 17,

18,  16, 18, 19, // 右表面的顶点索引数组

20, 21,

22,  20, 22, 23  //

左表面的顶点索引数组

];

gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new

Uint16Array(cubeVertexIndices), gl.STATIC_DRAW);

cubeVertexIndexBuffer.itemSize = 1;

cubeVertexIndexBuffer.numItems = 36;

}

var rCube = 0;

function drawScene()

{

gl.viewport(0, 0, gl.viewportWidth,

gl.viewportHeight);

gl.clear(gl.COLOR_BUFFER_BIT |

gl.DEPTH_BUFFER_BIT);

pMatrix = okMat4Proj(45, gl.viewportWidth /

gl.viewportHeight, 0.1, 100.0);

mvMatrix = okMat4Trans(0.0, 0.0, -5.0);

mvMatrix = okMat4Mul(mvMatrix,

moonRotationMatrix);

gl.bindBuffer(gl.ARRAY_BUFFER,

cubeVertexPositionBuffer);

gl.vertexAttribPointer(shaderProgram.vertexPositionAttribute,

cubeVertexPositionBuffer.itemSize, gl.FLOAT, false, 0, 0);

gl.bindBuffer(gl.ARRAY_BUFFER,

cubeVertexTextureCoordBuffer);

gl.vertexAttribPointer(shaderProgram.textureCoordAttribute,

cubeVertexTextureCoordBuffer.itemSize, gl.FLOAT, false, 0,

0);

gl.activeTexture(gl.TEXTURE0);

gl.bindTexture(gl.TEXTURE_2D,

neheTexture);

gl.uniform1i(shaderProgram.samplerUniform,

0);

gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER,

cubeVertexIndexBuffer);

setMatrixUniforms();

gl.drawElements(gl.TRIANGLES,

cubeVertexIndexBuffer.numItems, gl.UNSIGNED_SHORT, 0);

}

function tick() {

okRequestAnimationFrame(tick);

drawScene();

}

function webGLStart()

{

var canvas =

document.getElementByIdx_x("lesson08-canvas");

initGL(canvas);

initShaders();

initBuffers();

initTexture();

gl.clearColor(0.0, 0.0, 0.0, 1.0);

gl.enable(gl.DEPTH_TEST);

canvas.onmousedown =

handleMouseDown;

document.onmouseup =

handleMouseUp;

document.onmousemove =

handleMouseMove;

tick();

}

οnlοad="webGLStart();">

id="lesson08-canvas" style="border: none;" width="500"

height="500">

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
关于学习oak必备的库,另加一个实例源码: <html lang="zh-CN"> <head> <title>WebGL中文教程 - 由HiWebGL翻译整理,感谢Oak3D提供图形库支持!</title> <meta charset="UTF-8" /> [removed][removed] [removed] precision mediump float; void main(void) { gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0); } [removed] [removed] attribute vec3 aVertexPosition; uniform mat4 uMVMatrix; uniform mat4 uPMatrix; void main(void) { gl_Position = uPMatrix * uMVMatrix * vec4(aVertexPosition, 1.0); } [removed] [removed] var gl; function initGL(canvas) { try { gl = canvas.getContext("experimental-webgl"); gl.viewportWidth = canvas.width; gl.viewportHeight = canvas.height; } catch (e) { } if (!gl) { alert("Could not initialise WebGL, sorry :-("); } } function getShader(gl, id) { var shaderScript = document.getElementById(id); if (!shaderScript) { return null; } var str = ""; var k = shaderScript.firstChild; while (k) { if (k.nodeType == 3) { str += k.textContent; } k = k.nextSibling; } var shader; if (shaderScript.type == "x-shader/x-fragment") { shader = gl.createShader(gl.FRAGMENT_SHADER); } else if (shaderScript.type == "x-shader/x-vertex") { shader = gl.createShader(gl.VERTEX_SHADER); } else { return null; } gl.shaderSource(shader, str); gl.compileShader(shader); if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) { alert(gl.getShaderInfoLog(shader)); return null; } return shader; } var shaderProgram; function initShaders() { var fragmentShader = getShader(gl, "shader-fs"); var vertexShader = getShader(gl, "shader-vs"); shaderProgram = gl.createProgram(); gl.attachShader(shaderProgram, vertexShader); gl.attachShader(shaderProgram, fragmentShader); gl.linkProgram(shaderProgram); if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { alert("Could not initialise shaders"); } gl.useProgram(shaderProgram); shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); gl.enableVertexAttribArray(shaderProgram.vertexPositionAttribute); shaderProgram.pMatrixUniform = gl.getUniformLocation(shaderProgram, "uPMatrix"); shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); } var mvMatrix; var pMatrix; function setMatrixUniforms() { gl.uniformMatrix4fv(shaderProgram.pMatrixUniform, false, pMatrix.toArray()); gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mvMatrix.toArray()); } var triangleVertexPositionBuffer; var squareVertexPositionBuffer; function initBuffers() { triangleVertexPositionBuffer = gl.createBuffer(); gl.bindBuffer(gl.ARRAY_BUFFER, triangleVertexPositionBuffer); var vertices = [ 0.0, 1.0, 0.0, -1.0, -1.0, 0.0, 1.0, -1.0, 0.0 ]; gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertices), gl.STATIC_DRAW); triangleVertexPositionBuffer.itemSize = 3; triangleVertexPositionBuffer.numItems = 3; squareVertexPositionBuffer = gl.createBuffer(); gl.bindBuffer(gl.ARRAY_BUFFER, squareVertexPositionBuffer); vertices = [ 1.0, 1.0, 0.0, -1.0, 1.0, 0.0, 1.0, -1.0, 0.0, -1.0, -1.0, 0.0 ]; gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertices), gl.STATIC_DRAW); squareVertexPositionBuffer.itemSize = 3; squareVertexPositionBuffer.numItems = 4; } function drawScene() { gl.viewport(0, 0, gl.viewportWidth, gl.viewportHeight); gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT); pMatrix = okMat4Proj(45, gl.viewportWidth / gl.viewportHeight, 0.1, 100.0); mvMatrix = okMat4Trans(-1.5, 0.0, -7.0); gl.bindBuffer(gl.ARRAY_BUFFER, triangleVertexPositionBuffer); gl.vertexAttribPointer(shaderProgram.vertexPositionAttribute, triangleVertexPositionBuffer.itemSize, gl.FLOAT, false, 0, 0); setMatrixUniforms(); gl.drawArrays(gl.TRIANGLES, 0, triangleVertexPositionBuffer.numItems); mvMatrix = okMat4Trans(1.5, 0.0, -7.0); gl.bindBuffer(gl.ARRAY_BUFFER, squareVertexPositionBuffer); gl.vertexAttribPointer(shaderProgram.vertexPositionAttribute, squareVertexPositionBuffer.itemSize, gl.FLOAT, false, 0, 0); setMatrixUniforms(); gl.drawArrays(gl.TRIANGLE_STRIP, 0, squareVertexPositionBuffer.numItems); } function webGLStart() { var canvas = document.getElementById("lesson01-canvas"); initGL(canvas); initShaders(); initBuffers(); gl.clearColor(0.0, 0.0, 0.0, 1.0); gl.enable(gl.DEPTH_TEST); drawScene(); } [removed] </head> <body WebGL中文教程,由HiWebGL翻译整理,感谢<a href="http://www.oak3d.com">Oak3D</a>提供图形库支持!<br/> <a href="http://www.hiwebgl.com/?p=93"><< 回到Lesson 1</a><br /> <canvas id="lesson01-canvas" none;" width="500" height="500"></canvas> <br/> <a href="http://www.hiwebgl.com/?p=93"><< 回到Lesson 1</a><br /> [removed][removed]<noscript><a href="http://www.linezing.com"><img src="http://img.tongji.linezing.com/2578423/tongji.gif"/></a></noscript> </body> </html>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值