Ползунки с плавающей точкой HTML5 и Javascript

Я учусь, как сделать перспективный рендеринг, используя точки обзора и проекционные матрицы в WebGL. Я создал ползунки для изменения векторов "глаз", "вверх" и "вверх" в каждом из трех измерений, чтобы изменить фактические значения, однако ползунок скользит только по целым числам. Как мне заставить его перемещаться через все реалы между границами?

var gl;
var canvas;
var program;
var points = [];
var colors = [];
var numVertices = 18;

var near;
var far;
var fovy;
var aspect;
var VMatrixLoc, PMatrixLoc;
var vs_ViewMatrix, vs_ProjMatrix;

var eyePt;
var atPt;
var upVec;

var faceColors = [
    [ 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
];

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

    gl = WebGLUtils.setupWebGL(canvas);
    if (!gl){ alert("not available."); }

    buildTriangles();

    gl.viewport(0, 0, canvas.height, canvas.width);
    gl.clearColor(1, 1, 1, 1);
    gl.enable(gl.DEPTH_TEST);

    program = initShaders(gl, "vertex-shader", "fragment-shader");
    gl.useProgram(program);

    loadVerts(program);
    loadColors(program);

    eyex = document.getElementById("eyesliderx");
    eyey = document.getElementById("eyeslidery");
    eyez = document.getElementById("eyesliderz");
    atx = document.getElementById ("atsliderx" );
    aty = document.getElementById ("atslidery" );
    atz = document.getElementById ("atsliderz" );
    upx = document.getElementById ("upsliderx" );
    upy = document.getElementById ("upslidery" );
    upz = document.getElementById ("upsliderz" );

    render();
}

function loadVerts(program)
{
    // Load the vertices for the triangles and enable the attribute vPosition
    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 );
}

function loadColors(program)
{
    // Load the colors for the triangles and enable the attribute vColor
    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 );
}

function buildTriangles()
{
    var verts = [
        vec4( 0.75,  1.0, -4.0, 1.0),
        vec4( 0.25, -1.0, -4.0, 1.0),
        vec4( 1.25, -1.0, -4.0, 1.0),

        vec4( 0.75,  1.0, -2.0, 1.0),
        vec4( 0.25, -1.0, -2.0, 1.0),
        vec4( 1.25, -1.0, -2.0, 1.0),

        vec4( 0.75,  1.0,  0.0, 1.0),
        vec4( 0.25, -1.0,  0.0, 1.0),
        vec4( 1.25, -1.0,  0.0, 1.0),

        vec4(-0.75,  1.0, -4.0, 1.0),
        vec4(-0.25, -1.0, -4.0, 1.0),
        vec4(-1.25, -1.0, -4.0, 1.0),

        vec4(-0.75,  1.0, -2.0, 1.0),
        vec4(-0.25, -1.0, -2.0, 1.0),
        vec4(-1.25, -1.0, -2.0, 1.0),

        vec4(-0.75,  1.0,  0.0, 1.0),
        vec4(-0.25, -1.0,  0.0, 1.0),
        vec4(-1.25, -1.0,  0.0, 1.0)
    ];

    for (var i = 0; i < verts.length; ++i)
    {
        points.push(verts[i]);
        colors.push(faceColors[i%3]);
    }
}

function setViewProjection()
{
    VMatrixLoc = gl.getUniformLocation(program, "vs_ViewMatrix");
    PMatrixLoc = gl.getUniformLocation(program, "vs_ProjMatrix");

    if (!VMatrixLoc || !PMatrixLoc){ console.log("failed"); }

    eyePt = vec3(eyex.value, eyey.value, eyez.value);
    atPt = vec3(atx.value, aty.value, atz.value);
    upVec = vec3(upx.value, upy.value, upz.value);

    vs_ViewMatrix = lookAt(eyePt, atPt, upVec);

    fovy = 50;
    aspect = canvas.width/canvas.height;
    near = 1;
    far = 100;
    vs_ProjMatrix = perspective(fovy, aspect, near, far);

    gl.uniformMatrix4fv(VMatrixLoc, false, flatten(vs_ViewMatrix));
    gl.uniformMatrix4fv(PMatrixLoc, false, flatten(vs_ProjMatrix));
}

function render()
{
    gl.clear( gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
    gl.clearColor(0.0, 0.0, 0.0, 0.1);

    setViewProjection();

    gl.drawArrays( gl.TRIANGLES, 0, numVertices );
    requestAnimFrame( render );
};

Вот мой 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;
vec3 angles = radians( theta );
vec3 c = cos( angles );
vec3 s = sin( angles );
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 );

uniform    mat4 vs_ViewMatrix;
uniform    mat4 vs_ProjMatrix;
void main()
{       
    fColor = vColor;
    gl_Position = vs_ProjMatrix * vs_ViewMatrix * vPosition;
}

</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="../Blowhorn/webgl-utils.js"></script>
<script type="text/javascript" src="../Blowhorn/initShaders.js"></script>
<script type="text/javascript" src="../Blowhorn/MV.js"></script>
<script type="text/javascript" src="perspective.js"></script>

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

<br/>
//tried making values floats but still does not have intended effect
<input id="eyesliderx" type="range" min="-5.0"   max="5.0"   value="0.0" 
class="slider">
<input id="eyeslidery" type="range" min="-5"   max="5"   value="0" 
class="slider">
<input id="eyesliderz" type="range" min="-5"   max="5"   value="5" 
class="slider">
<input id="atsliderx"  type="range" min="-5"   max="5"   value="0" 
class="slider">
<input id="atslidery"  type="range" min="-5"   max="5"   value="0" 
class="slider">
<input id="atsliderz"  type="range" min="-100" max="100" value="0" 
class="slider">
<input id="upsliderx"  type="range" min="-1"   max="1"   value="0" 
class="slider">
<input id="upslidery"  type="range" min="-1"   max="1"   value="1" 
class="slider">
<input id="upsliderz"  type="range" min="-1"   max="1"   value="0" 
class="slider">
<button id="reset">Reset</button>

</body>
</html>

0 ответов

Другие вопросы по тегам