WebGL旋转表格和立方体

时间:2018-10-12 12:11:56

标签: webgl

我需要旋转表格和多维数据集X Y和Z的帮助,这是我的JavaScript代码 我是WebGL的新手 旋转它的最佳方法是什么? 如何使用轴? 对我来说这很难 我的html页面有一个蓝色立方体和一个红色地板 周一到期的作业 即时通讯在使用thetaloc和xposition和yposition和z位置时遇到问题 我正在获取文档getelementbyID为空

"use strict";

var gl;
var canvas;
var shaderProgram;
var floorVertexPositionBuffer;
var floorVertexIndexBuffer;
var cubeVertexPositionBuffer;
var cubeVertexIndexBuffer;

var modelViewMatrix;
var projectionMatrix;
var modelViewMatrixStack;
var axis = 0;
var xAxis = 0;
var yAxis = 1;
var zAxis = 2;
var theta = [0, 0, 0];
var thetaLoc;


window.onload = function init() {
  canvas = document.getElementById("gl-canvas");
  gl = WebGLUtils.setupWebGL(canvas);
  gl = WebGLDebugUtils.makeDebugContext(gl);
  if (!gl) { alert("WebGL isn't available"); }
  setupShaders();
  setupBuffers();
  gl.clearColor(1.0, 1.0, 1.0, 1.0);
    gl.enable(gl.DEPTH_TEST);

    document.getElementById("xButton").onclick = function () {
        axis = xAxis;
    };

    document.getElementById("yButton").onclick = function () {
        axis = yAxis;
    };

    document.getElementById("zButton").onclick = function () {
        axis = zAxis;
    };

  draw();
}

function setupShaders() {
  //
  //  Load shaders and initialize attribute buffers
  //
  shaderProgram = initShaders(gl, "vertex-shader", "fragment-shader");
  gl.useProgram(shaderProgram);

  shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition");
  shaderProgram.vertexColorAttribute = gl.getAttribLocation(shaderProgram, "aVertexColor");
  shaderProgram.uniformMVMatrix = gl.getUniformLocation(shaderProgram, "uMVMatrix");
  shaderProgram.uniformProjMatrix = gl.getUniformLocation(shaderProgram, "uPMatrix");

  gl.enableVertexAttribArray(shaderProgram.vertexPositionAttribute);

  modelViewMatrix = mat4.create();
  projectionMatrix = mat4.create();
  modelViewMatrixStack = [];
}

function pushModelViewMatrix() {
  var copyToPush = mat4.create(modelViewMatrix);
  modelViewMatrixStack.push(copyToPush);
}

function popModelViewMatrix() {
  if (modelViewMatrixStack.length == 0) {
    throw "Error popModelViewMatrix() - Stack was empty ";
  }
  modelViewMatrix = modelViewMatrixStack.pop();
}


function setupFloorBuffers() {
  floorVertexPositionBuffer = gl.createBuffer();
  gl.bindBuffer(gl.ARRAY_BUFFER, floorVertexPositionBuffer);

  var floorVertexPosition = [
    // Plane in y=0
    5.0, 0.0, 5.0,  //v0
    5.0, 0.0, -5.0,  //v1
    -5.0, 0.0, -5.0,  //v2
    -5.0, 0.0, 5.0]; //v3

  gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(floorVertexPosition),
    gl.STATIC_DRAW);

  floorVertexPositionBuffer.itemSize = 3;
  floorVertexPositionBuffer.numberOfItems = 4;

  floorVertexIndexBuffer = gl.createBuffer();
  gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, floorVertexIndexBuffer);
  var floorVertexIndices = [0, 1, 2, 3];

  gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Uint16Array(floorVertexIndices),
    gl.STATIC_DRAW);
  floorVertexIndexBuffer.itemSize = 1;
  floorVertexIndexBuffer.numberOfItems = 4;
}


function setupCubeBuffers() {
  cubeVertexPositionBuffer = gl.createBuffer();
    gl.bindBuffer(gl.ARRAY_BUFFER, cubeVertexPositionBuffer);

    thetaLoc = gl.getUniformLocation(shaderProgram, "theta");

  var cubeVertexPosition = [
    // Front face
    1.0, 1.0, 1.0, //v0
    -1.0, 1.0, 1.0, //v1
    -1.0, -1.0, 1.0, //v2
    1.0, -1.0, 1.0, //v3

    // Back face
    1.0, 1.0, -1.0, //v4
    -1.0, 1.0, -1.0, //v5
    -1.0, -1.0, -1.0, //v6
    1.0, -1.0, -1.0, //v7

    // Left face
    -1.0, 1.0, 1.0, //v8
    -1.0, 1.0, -1.0, //v9
    -1.0, -1.0, -1.0, //v10
    -1.0, -1.0, 1.0, //v11

    // Right face
    1.0, 1.0, 1.0, //12
    1.0, -1.0, 1.0, //13
    1.0, -1.0, -1.0, //14
    1.0, 1.0, -1.0, //15

    // Top face
    1.0, 1.0, 1.0, //v16
    1.0, 1.0, -1.0, //v17
    -1.0, 1.0, -1.0, //v18
    -1.0, 1.0, 1.0, //v19

    // Bottom face
    1.0, -1.0, 1.0, //v20
    1.0, -1.0, -1.0, //v21
    -1.0, -1.0, -1.0, //v22
    -1.0, -1.0, 1.0, //v23
  ];



  gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(cubeVertexPosition), gl.STATIC_DRAW);
  cubeVertexPositionBuffer.itemSize = 3;
  cubeVertexPositionBuffer.numberOfItems = 24;

  cubeVertexIndexBuffer = gl.createBuffer();
  gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, cubeVertexIndexBuffer);

  var cubeVertexIndices = [
    0, 1, 2, 0, 2, 3,    // Front face
    4, 6, 5, 4, 7, 6,    // Back face
    8, 9, 10, 8, 10, 11,  // Left face
    12, 13, 14, 12, 14, 15, // Right face
    16, 17, 18, 16, 18, 19, // Top face
    20, 22, 21, 20, 23, 22  // Bottom face
  ];

  gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Uint16Array(cubeVertexIndices), gl.STATIC_DRAW);
  cubeVertexIndexBuffer.itemSize = 1;
  cubeVertexIndexBuffer.numberOfItems = 36;
}

function setupBuffers() {
  setupFloorBuffers();
  setupCubeBuffers();
}

function uploadModelViewMatrixToShader() {
  gl.uniformMatrix4fv(shaderProgram.uniformMVMatrix, false, modelViewMatrix);
}

function uploadProjectionMatrixToShader() {
  gl.uniformMatrix4fv(shaderProgram.uniformProjMatrix,
    false, projectionMatrix);
}

function drawFloor(r, g, b, a) {
  // Disable vertex attrib array and use constant color for the floor.
  gl.disableVertexAttribArray(shaderProgram.vertexColorAttribute);
  // Set color
  gl.vertexAttrib4f(shaderProgram.vertexColorAttribute, r, g, b, a);

  // Draw the floor
  gl.bindBuffer(gl.ARRAY_BUFFER, floorVertexPositionBuffer);
  gl.vertexAttribPointer(shaderProgram.vertexPositionAttribute,
    floorVertexPositionBuffer.itemSize,
    gl.FLOAT, false, 0, 0);

  gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, floorVertexIndexBuffer);
  gl.drawElements(gl.TRIANGLE_FAN, floorVertexIndexBuffer.numberOfItems,
    gl.UNSIGNED_SHORT, 0);
}



function drawCube(r, g, b, a) {

  // Disable vertex attrib array and use constant color for the cube.
  gl.disableVertexAttribArray(shaderProgram.vertexColorAttribute);
  // Set color
  gl.vertexAttrib4f(shaderProgram.vertexColorAttribute, r, g, b, a);
  gl.bindBuffer(gl.ARRAY_BUFFER, cubeVertexPositionBuffer);
  gl.vertexAttribPointer(shaderProgram.vertexPositionAttribute, cubeVertexPositionBuffer.itemSize, gl.FLOAT, false, 0, 0);
  gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, cubeVertexIndexBuffer);
  gl.drawElements(gl.TRIANGLES, cubeVertexIndexBuffer.numberOfItems, gl.UNSIGNED_SHORT, 0);
}

function draw() {
  gl.viewport(0, 0, canvas.width, canvas.height);
  gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
  mat4.perspective(projectionMatrix, 65, canvas.width / canvas.height, 0.1, 100.0);

  //the view transform: the viewer is located at the position (8,5,10)
  //the view direction is towards the origin (0,0,0)
  //the up direction is positive y-axis (0,1,0)
  //what happens if you change 10 to -10?
  mat4.lookAt(modelViewMatrix, [8, 5, 10], [0, 0, 0], [0, 1, 0]);

  uploadModelViewMatrixToShader();
  uploadProjectionMatrixToShader();

  // Draw floor in red color
  drawFloor(1.0, 0.0, 0.0, 1.0);
  // Draw box
  pushModelViewMatrix();
  mat4.translate(modelViewMatrix, modelViewMatrix, [0.0, 2.7, 0.0]);
  mat4.scale(modelViewMatrix, modelViewMatrix, [0.25, 0.25, 0.25]);

  uploadModelViewMatrixToShader();
  drawCube(0.0, 0.0, 1.0, 1.0);
    popModelViewMatrix();

    theta[axis] += 2.0;
    gl.uniform3fv(thetaLoc, theta);

requestAnimFrame(draw);

}

0 个答案:

没有答案