首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >上下翻译对象

上下翻译对象
EN

Stack Overflow用户
提问于 2015-10-12 07:30:41
回答 1查看 392关注 0票数 0

随着时间的推移,我试图弄清楚如何在画布中上下转换用TRIANGLE_FAN绘制的圆圈对象。

object.js

代码语言:javascript
复制
var canvas;
var gl;
var bufferId;
var theta = 0.0;
var thetaLoc;
window.onload = function init() {
canvas = document.getElementById("gl-canvas");

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

//
//  Configure WebGL
//
gl.viewport(0, 0, canvas.width, canvas.height);
gl.clearColor(0.3921, 0.5843, 0.9294, 1.0);

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

var numTris = 100;

var vertices = [
     0.0, 0.0, 0.0,
     1.0, 0.0, 0.0
];

var degPerTri = (2 * Math.PI) / numTris;

for (var i = 0; i < numTris; i++) {
    var index = 2 * 3 + i * 3;
    var angle = degPerTri * (i + 1);

    vertices[index] = Math.cos(angle);
    vertices[index + 1] = Math.sin(angle);
    vertices[index + 2] = 0;
}

// Load the data into the GPU
bufferId = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, bufferId);
gl.bufferData(gl.ARRAY_BUFFER, flatten(vertices), gl.STATIC_DRAW);
bufferId.itemSize = 3;
bufferId.numItems = numTris + 2;

// Associate out shader variables with our data buffer
var vPosition = gl.getAttribLocation(program, "vPosition");
gl.vertexAttribPointer(vPosition, bufferId.itemSize, gl.FLOAT, false, 0, 0);
gl.enableVertexAttribArray(vPosition);

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

render();
};


function render() {

gl.clear(gl.COLOR_BUFFER_BIT);

theta += 0.01;
gl.uniform1f(thetaLoc, theta);

gl.drawArrays(gl.TRIANGLE_FAN, 0, bufferId.numItems);

window.requestAnimFrame(render);
}

HTML:

代码语言:javascript
复制
<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html;charset=utf-8">

    <script id="vertex-shader" type="x-shader/x-vertex">
        attribute vec4 vPosition;
        uniform float theta;

        void main() {

            float s = -theta;
            float c = theta;

            if (vPosition.y > 1.0) {
                gl_Position.y = vPosition.y - s;
            } else if (vPosition.y <= 0.0) {
                gl_Position.y = vPosition.y + c;
            }

            gl_Position.x = vPosition.x;
            gl_Position.z = vPosition.z;
            gl_Position.w = vPosition.w;
        }
    </script>

    <script id="fragment-shader" type="x-shader/x-fragment">
        precision mediump float;

        void main() {
        gl_FragColor = vec4( 1.0, 1.0, 1.0, 1.0 );
        }
    </script>
</head>
<body>
    <canvas id="gl-canvas" width="500" height="500">
        Oops ... your browser doesn't support the HTML5 canvas element
    </canvas>
</body>
</html>

很明显,我的目标永远不会向下移动??它只是向上移动。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-10-12 23:01:14

因为这个

代码语言:javascript
复制
float s = -theta;
float c = theta;

if (vPosition.y > 1.0) {
    gl_Position.y = vPosition.y - s;
} else if (vPosition.y <= 0.0) {
    gl_Position.y = vPosition.y + c;
}

基本上是这样

代码语言:javascript
复制
if (vPosition.y > 1.0) {
    gl_Position.y = vPosition.y + theta; // vPosition.y - (-theta) 
} else if (vPosition.y <= 0.0) {
    gl_Position.y = vPosition.y + theta;
}

而且你总是在增加theta

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33075503

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档