2017-03-23 12 views
0

WebGLで回転キューブのコードを書きましたが、スライダを使って回転角度を変更したいと考えています。これは私のコードです:WebGLでキューブの回転角度を変更するスライダ

HTMLコード

<!DOCTYPE html> 
<html> 

<script id="vertex-shader" type="x-shader/x-vertex"> 

attribute vec4 vPosition; 
attribute vec4 vColor; 
varying vec4 fColor; 

uniform vec3 theta; 

void main() 
{ 
    // Compute the sines and cosines of theta for each of 
    // the three axes in one computation. 
    vec3 angles = radians(theta); 
    vec3 c = cos(angles); 
    vec3 s = sin(angles); 

    // Remeber: thse matrices are column-major 
    mat4 rx = mat4(1.0, 0.0, 0.0, 0.0, 
      0.0, c.x, s.x, 0.0, 
      0.0, -s.x, c.x, 0.0, 
      0.0, 0.0, 0.0, 1.0); 

    mat4 ry = mat4(c.y, 0.0, -s.y, 0.0, 
      0.0, 1.0, 0.0, 0.0, 
      s.y, 0.0, c.y, 0.0, 
      0.0, 0.0, 0.0, 1.0); 


    mat4 rz = mat4(c.z, s.z, 0.0, 0.0, 
      -s.z, c.z, 0.0, 0.0, 
      0.0, 0.0, 1.0, 0.0, 
      0.0, 0.0, 0.0, 1.0); 

    fColor = vColor; 
    gl_Position = rz * ry * rx * vPosition; 
    gl_Position.z = -gl_Position.z; 
} 
</script> 

<script id="fragment-shader" type="x-shader/x-fragment"> 

precision mediump float; 

varying vec4 fColor; 

void 
main() 
{ 
    gl_FragColor = fColor; 
} 
</script> 

<script type="text/javascript" src="../Common/webgl-utils.js"></script> 
<script type="text/javascript" src="../Common/initShaders.js"></script> 
<script type="text/javascript" src="../Common/MV.js"></script> 
<script type="text/javascript" src="Lab20170314_1.js"></script> 

<body> 
<canvas id="gl-canvas" width="512"" height="512"> 
Oops ... your browser doesn't support the HTML5 canvas element 
</canvas> 

<br/> 

<button id= "xButton">Rotate X</button> 
<button id= "yButton">Rotate Y</button> 
<button id= "zButton">Rotate Z</button> 
<button id= "stopAnimation"> Start/Stop Animation</button> 
<div> 
rotation angle 0 <input id="slide" type="range" 
min="0" max="10" step="1" value="5" /> 
10 </div> 

</body> 
</html> 

、これが私のJavascriptコードです:私は空白のページを取得し、私のスライダーで回転の角度を変更しようとすると

"use strict"; 

var canvas; 
var gl; 

var NumVertices = 36; 

var points = []; 
var colors = []; 

var xAxis = 0; 
var yAxis = 1; 
var zAxis = 2; 

var axis = 0; 
var theta = [ 0, 0, 0 ]; 

var thetaLoc; 
var stop = false; 
var degrees=5; 

window.onload = function init() 
{ 
    canvas = document.getElementById("gl-canvas"); 

    gl = WebGLUtils.setupWebGL(canvas); 
    if (!gl) { alert("WebGL isn't available"); } 

    colorCube(); 

    gl.viewport(0, 0, canvas.width, canvas.height); 
    gl.clearColor(1.0, 1.0, 1.0, 1.0); 

    gl.enable(gl.DEPTH_TEST); 

    // 
    // Load shaders and initialize attribute buffers 
    // 
    var program = initShaders(gl, "vertex-shader", "fragment-shader"); 
    gl.useProgram(program); 

    var cBuffer = gl.createBuffer(); 
    gl.bindBuffer(gl.ARRAY_BUFFER, cBuffer); 
    gl.bufferData(gl.ARRAY_BUFFER, flatten(colors), gl.STATIC_DRAW); 

    var vColor = gl.getAttribLocation(program, "vColor"); 
    gl.vertexAttribPointer(vColor, 4, gl.FLOAT, false, 0, 0); 
    gl.enableVertexAttribArray(vColor); 

    var vBuffer = gl.createBuffer(); 
    gl.bindBuffer(gl.ARRAY_BUFFER, vBuffer); 
    gl.bufferData(gl.ARRAY_BUFFER, flatten(points), gl.STATIC_DRAW); 


    var vPosition = gl.getAttribLocation(program, "vPosition"); 
    gl.vertexAttribPointer(vPosition, 4, gl.FLOAT, false, 0, 0); 
    gl.enableVertexAttribArray(vPosition); 

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

    //event listeners for buttons 

    document.getElementById("xButton").onclick = function() { 
     axis = xAxis; 
    }; 
    document.getElementById("yButton").onclick = function() { 
     axis = yAxis; 
    }; 
    document.getElementById("zButton").onclick = function() { 
     axis = zAxis; 
    }; 
    document.getElementById("stopAnimation").onclick= function() { 
     stop =! stop; 
    }; 
    document.getElementById("slide").onchange= function(){ 
     degrees = event.target.value; 
    }; 

    render(); 
} 

function colorCube() 
{ 
    quad(1, 0, 3, 2); 
    quad(2, 3, 7, 6); 
    quad(3, 0, 4, 7); 
    quad(6, 5, 1, 2); 
    quad(4, 5, 6, 7); 
    quad(5, 4, 0, 1); 
} 

function quad(a, b, c, d) 
{ 
    var vertices = [ 
     vec4(-0.5, -0.5, 0.5, 1.0), 
     vec4(-0.5, 0.5, 0.5, 1.0), 
     vec4( 0.5, 0.5, 0.5, 1.0), 
     vec4( 0.5, -0.5, 0.5, 1.0), 
     vec4(-0.5, -0.5, -0.5, 1.0), 
     vec4(-0.5, 0.5, -0.5, 1.0), 
     vec4( 0.5, 0.5, -0.5, 1.0), 
     vec4( 0.5, -0.5, -0.5, 1.0) 
    ]; 

    var vertexColors = [ 
     [ 0.0, 0.0, 0.0, 1.0 ], // black 
     [ 1.0, 0.0, 0.0, 1.0 ], // red 
     [ 1.0, 1.0, 0.0, 1.0 ], // yellow 
     [ 0.0, 1.0, 0.0, 1.0 ], // green 
     [ 0.0, 0.0, 1.0, 1.0 ], // blue 
     [ 1.0, 0.0, 1.0, 1.0 ], // magenta 
     [ 0.0, 1.0, 1.0, 1.0 ], // cyan 
     [ 1.0, 1.0, 1.0, 1.0 ] // white 
    ]; 

    // We need to parition the quad into two triangles in order for 
    // WebGL to be able to render it. In this case, we create two 
    // triangles from the quad indices 

    //vertex color assigned by the index of the vertex 

    var indices = [ a, b, c, a, c, d ]; 

    for (var i = 0; i < indices.length; ++i) { 
     points.push(vertices[indices[i]]); 
     //colors.push(vertexColors[indices[i]]); 

     // for solid colored faces use 
     colors.push(vertexColors[a]); 

    } 
} 

function render() 
{ 
    gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT); 

    if(stop) 
{ 
} 
    else 
{ 
    theta[axis] += degrees; 
} 
    gl.uniform3fv(thetaLoc, theta); 

    gl.drawArrays(gl.TRIANGLES, 0, NumVertices); 

    requestAnimFrame(render); 
} 

キューブが消えて、なぜ?

私は

+0

は、あなたがevent.target.value''の内容をデバッグしようとしたがありますか?多分それはNaNか何かファンキーなものです。 –

答えて

0

:)おかげで、私は問題が混在データ型に関連することができると信じて、あなたの助けをいただければ幸いです。最初に、5の値で整数を宣言します。スライド上で変更イベントを受け取ると、イベントのターゲット値を度にコピーします。度は文字列になり、度を文字列に変換します。したがって、thetaに追加すると、その角度が文字列になります。整数として文字列を解析し、これを修正するには

: `スライダーのための結合onchange`で

document.getElementById("slide").onchange= function(){ 
    degrees = parseInt(event.target.value, 10); 
}; 
+0

良い点。また、thetaは変更のデルタを取得する必要がありますか? 'theta [axis] + = degreesDelta'または' theta [axis] = degrees; ' –

+0

あなたのアプリケーションに依存します:)あなたのスライダが意味するものは1〜10のどれであるのか分かりません。円は360度を持っているので、ビジネスロジックをどのように処理するかはあなた次第です。私はあなたの質問の範囲外であるとも言います。 –

+0

ありがとうございました! –

関連する問題