好吧-在这里发疯了。我正在做一些WebGL,我正在尝试制作一个等距立方体。我不想使用三.js。我想首先了解我的代码中出了什么问题。我一直在研究,我能找到的唯一教程似乎是OpenGL的
无论如何 - 这是我的 drawScene 函数:
function drawScene() {
this.gl.clear(this.gl.COLOR_BUFFER_BIT | this.gl.DEPTH_BUFFER_BIT);
mat4.perspective(45, this.gl.viewportWidth / this.gl.viewportHeight, 0.1, 100.0, pMatrix);
mvMatrix = mat4.lookAt([0,0,40], [0, 0, 0], [0, 1, 0]);
_globalNext = this._first;
while(_globalNext) {
_globalNext.render();
}
}
渲染函数是
function render() {
mvPushMatrix();
//transform. order matters.
mat4.translate(mvMatrix, [this._x, this._y, this._z]);
mat4.rotate(mvMatrix, 0.01745*this._rot, [this._axisX, this._axisY, this._axisZ]);
mat4.scale(mvMatrix, [this._scaleX,this._scaleY,this._scaleZ]);
//bind the buffers.
this.gl.bindBuffer(this.gl.ARRAY_BUFFER, this._positionBuff);
this.gl.vertexAttribPointer(this._shader.vertexPositionAttribute, this._positionBuff.itemSize, this.gl.FLOAT, false, 0, 0);
this.gl.bindBuffer(this.gl.ARRAY_BUFFER, this._colorBuff);
this.gl.vertexAttribPointer(this._shader.vertexColorAttribute, this._colorBuff.itemSize, this.gl.FLOAT, false, 0, 0);
this.gl.bindBuffer(this.gl.ELEMENT_ARRAY_BUFFER, this._indexBuff);
this.setMatrixUniforms(this.gl);
this.gl.drawElements(this.gl.TRIANGLES, this._indexBuff.numItems, this.gl.UNSIGNED_SHORT, 0);
if(this._usePopper == false) {
mvPopMatrix();
}
_globalNext = this._nextSib;
}
相当行人。我用它来画立方体。无论如何,在OpenGL示例中,它们似乎取消了透视功能,但是在这里,如果我省略它,我的场景是空白的。我知道 lookAt 函数工作正常,我必须对透视矩阵做一些事情。一点帮助将不胜感激。谢谢!
矩阵所做的只是将场景的坐标系映射到 X 轴和 Y 轴上的 [-1, 1] 范围,这是将片段渲染到窗口时使用的空间。可以以这样一种方式构建场景,使其直接渲染到该 [-1, 1] 空间,在这种情况下不需要投影矩阵(这可能是您在示例中省略它所指的,但通常情况并非如此。
使用透视矩阵作为投影矩阵时,X 和 Y 坐标按 Z 值缩放,使其具有深度外观。如果不希望产生这种效果,则可以使用正交矩阵消除深度缩放,如下所示:
mat4.ortho(left, right, bottom, top, 0.1, 100.0, pMatrix);
左/右/上/下是什么取决于你,但通常这些将以某种方式与你的WebGL视口的尺寸相对应。例如,如果你的WebGL窗口是640x480,你可以这样做:
mat4.ortho(0, 640, 0, 480, 0.1, 100.0, pMatrix);
这将导致放置在 (0, 0) 的任何顶点呈现在窗口的左下角,而放置在 (648, 480) 的任何顶点呈现在右上角。这些顶点的 z 分量将不起作用。这是一种常用的技术,用于渲染 GUI 元素、精灵或等轴测图形,就像您尝试的那样。
希望对您有所帮助!