mat4.lookAt()
给了我意想不到的结果。
请参阅与3个测试示例相关的图像。第一个例子是"正确",其他似乎被修剪,但我无法理解为什么。相机的视角和距离似乎都是正确的,但除了第一个,我没有得到我想要的整个视图。你能建议我需要做些什么调整吗?
function draw() {
gl.clearColor(bgcolor[0],bgcolor[1],bgcolor[2],1);
gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
if (document.getElementById("persproj").checked) {
mat4.perspective(projection, Math.PI/4, 1, 4, 8);
}
else {
mat4.ortho(projection,-2.5, 2.5, -2.5, 2.5, 4, 8);
}
gl.uniformMatrix4fv(uProjection, false, projection );
mat4.lookAt(modelview, [0,0,6], [0,0,0], [0,1,0]); // This is the key line
mat4.rotateX(modelview, modelview, rotateX);
mat4.rotateY(modelview, modelview, rotateY);
gl.uniformMatrix4fv(uModelview, false, modelview );
mat3.normalFromMat4(normalMatrix, modelview);
gl.uniformMatrix3fv(uNormalMatrix, false, normalMatrix);
gl.uniform1i( uLit, 0 ); // The lines representing the coordinate axes are not lit.
gl.lineWidth(4);
drawPrimitive( gl.LINES, [1,0,0,1], [ -2,0,0, 2,0,0] );
drawPrimitive( gl.LINES, [0,1,0,1], [ 0,-2,0, 0,2,0] );
drawPrimitive( gl.LINES, [0,0,1,1], [ 0,0,-2, 0,0,2] );
gl.lineWidth(1);
if (leftColors.length>0){
drawTurtles(linecolors,moves,leftColors,rightColors,backColors,bottoms,lefts,rights,backs,bottomNs,leftNs,rightNs,backNs);
}
}
mat4.lookAt(modelview,[0,0,6],[0,0,0],[0,1,0])
mat4.lookAt(modelview,[0,0,8],[0,0,0],[0,1,0])
mat4.lookAt(modelview,[0,0,4],[0,0,0],[0,1,0])
答案 0 :(得分:2)
问题来自mat4.Ortho
设置的裁剪距离:
mat4.lookAt(modelview,[0,0,8],[0,0,0],[0,1,0])
这将设置您的眼睛位置,例如远平面将通过(0,0,0),将可视内容限制在(0,0,0)上的视图平面。
mat4.lookAt(modelview,[0,0,4],[0,0,0],[0,1,0])
这会将你的眼睛位置设置在近平面的极限位置,当完全相等时会产生不可预测的结果。
所以解决方案是调整mat4.Ortho中的近和远裁剪:
mat4.ortho(projection,-2.5, 2.5, -2.5, 2.5, 4 - x, 8 + x);
其中x可能是最小位移。