可视范围(visible range)
在 LookAtTrianglesWithKeys 程序中,三角形的一角被残忍地咬掉了。

这是因为没有设置 可视范围,
WebGL只显示可视范围内的区域。
可视范围(正射类型)
不绘制可视范围外的对象,是基本的降低程序开销的手段。
为什么要设置可视范围?
因为大型网游earth Online最初就是这么设计的(大雾)!earth Online设计者考虑到这一点,给了你视线范围,要不让你随便朝天上扫一眼,就能看到月球上跳舞的小人吗?
心外无物,心外无事,心外无理
虽然earth Online中的哲学分支可谓复杂纷纭,
但是要理解WebGL世界中的可视距离机制,主观唯心主义观点可能会对你有所启发:
存在即被感知 ——【英】贝克莱
人类本身也只能看到眼前的东西,水平视角大约200度左右。

可视空间(view volume)
有两类常用的可视空间:
正射投影
orthographic projection
- 长方形可视(盒状)空间
- 物体看上去大小与其所在位置没有关系
- 可以方便地比较场景中物体大小
- 常用于平面绘图等技术
透视投影
perspective projection
- 四棱锥(金字塔)可视空间
- 使三维场景看上去更有深度感,更自然
- 真实世界也是透视投影
盒状可视空间

近裁剪面 与 远裁剪面 之间的空间就是 盒状可视空间。
只有在此空间内的物体会被显示出来。
如果裁剪面和canvas画布的宽高比不同会怎么样?
答: 会按照canvas的宽高对画面进行压缩,物体会被扭曲。
定义盒状可视空间 Matrix4.setOrtho()

设置投影的矩阵被称为 正射投影矩阵(orthographic projection matrix)。
OrthoView
该案例支持键盘控制可视空间深度大小。
OrthoView Code



1 |
|
1 | let VSHADER_SOURCE = ` |
near、far与三角形消失的关系
Js中对固定位小数特殊的处理方式
1 | // 方法1:Math.round |
1 | // 方法2 toFix |
Shape | Z Vaule | Show Condition |
---|---|---|
<img class=”lazy” src=”/images/wiki/WebGL/Ortho_1.png” data-src=”/images/wiki/WebGL/Ortho_1.png”onerror=”this.src="data:image/svg+xml,%3Csvg xmlns=’http://www.w3.org/2000/svg‘ width=’2rem’ height=’2rem’ viewBox=’0 0 24 24’%3E%3C!– Icon from Solar by 480 Design - https://creativecommons.org/licenses/by/4.0/ –%3E%3Cpath fill=’%23F44336’ d=’M22 12.698c-.002 1.47-.013 2.718-.096 3.743c-.097 1.19-.296 2.184-.74 3.009a4.2 4.2 0 0 1-.73.983c-.833.833-1.893 1.21-3.237 1.39C15.884 22 14.2 22 12.053 22h-.106c-2.148 0-3.83 0-5.144-.177c-1.343-.18-2.404-.557-3.236-1.39c-.738-.738-1.12-1.656-1.322-2.795c-.2-1.12-.236-2.512-.243-4.241Q1.999 12.737 2 12v-.054c0-2.148 0-3.83.177-5.144c.18-1.343.557-2.404 1.39-3.236s1.893-1.21 3.236-1.39c1.168-.157 2.67-.175 4.499-.177a.697.697 0 1 1 0 1.396c-1.855.002-3.234.018-4.313.163c-1.189.16-1.906.464-2.436.994S3.72 5.8 3.56 6.99C3.397 8.2 3.395 9.788 3.395 12v.784l.932-.814a2.14 2.14 0 0 1 2.922.097l3.99 3.99a1.86 1.86 0 0 0 2.385.207l.278-.195a2.79 2.79 0 0 1 3.471.209l2.633 2.37c.265-.557.423-1.288.507-2.32c.079-.972.09-2.152.091-3.63a.698.698 0 0 1 1.396 0’ opacity=’.5’/%3E%3Cpath fill=’%23F44336’ fill-rule=’evenodd’ d=’M17.5 11c-2.121 0-3.182 0-3.841-.659S13 8.621 13 6.5s0-3.182.659-3.841S15.379 2 17.5 2s3.182 0 3.841.659S22 4.379 22 6.5s0 3.182-.659 3.841S19.621 11 17.5 11m-1.47-7.03a.75.75 0 1 0-1.06 1.06l1.47 1.47l-1.47 1.47a.75.75 0 0 0 1.06 1.06l1.47-1.47l1.47 1.47a.75.75 0 1 0 1.06-1.06L18.56 6.5l1.47-1.47a.75.75 0 0 0-1.06-1.06L17.5 5.44z’ clip-rule=’evenodd’/%3E%3C/svg%3E"”/> | 0.0 | near<=0.00 && far>=0.00 |
<img class=”lazy” src=”/images/wiki/WebGL/Ortho_2.png” data-src=”/images/wiki/WebGL/Ortho_2.png”onerror=”this.src="data:image/svg+xml,%3Csvg xmlns=’http://www.w3.org/2000/svg‘ width=’2rem’ height=’2rem’ viewBox=’0 0 24 24’%3E%3C!– Icon from Solar by 480 Design - https://creativecommons.org/licenses/by/4.0/ –%3E%3Cpath fill=’%23F44336’ d=’M22 12.698c-.002 1.47-.013 2.718-.096 3.743c-.097 1.19-.296 2.184-.74 3.009a4.2 4.2 0 0 1-.73.983c-.833.833-1.893 1.21-3.237 1.39C15.884 22 14.2 22 12.053 22h-.106c-2.148 0-3.83 0-5.144-.177c-1.343-.18-2.404-.557-3.236-1.39c-.738-.738-1.12-1.656-1.322-2.795c-.2-1.12-.236-2.512-.243-4.241Q1.999 12.737 2 12v-.054c0-2.148 0-3.83.177-5.144c.18-1.343.557-2.404 1.39-3.236s1.893-1.21 3.236-1.39c1.168-.157 2.67-.175 4.499-.177a.697.697 0 1 1 0 1.396c-1.855.002-3.234.018-4.313.163c-1.189.16-1.906.464-2.436.994S3.72 5.8 3.56 6.99C3.397 8.2 3.395 9.788 3.395 12v.784l.932-.814a2.14 2.14 0 0 1 2.922.097l3.99 3.99a1.86 1.86 0 0 0 2.385.207l.278-.195a2.79 2.79 0 0 1 3.471.209l2.633 2.37c.265-.557.423-1.288.507-2.32c.079-.972.09-2.152.091-3.63a.698.698 0 0 1 1.396 0’ opacity=’.5’/%3E%3Cpath fill=’%23F44336’ fill-rule=’evenodd’ d=’M17.5 11c-2.121 0-3.182 0-3.841-.659S13 8.621 13 6.5s0-3.182.659-3.841S15.379 2 17.5 2s3.182 0 3.841.659S22 4.379 22 6.5s0 3.182-.659 3.841S19.621 11 17.5 11m-1.47-7.03a.75.75 0 1 0-1.06 1.06l1.47 1.47l-1.47 1.47a.75.75 0 0 0 1.06 1.06l1.47-1.47l1.47 1.47a.75.75 0 1 0 1.06-1.06L18.56 6.5l1.47-1.47a.75.75 0 0 0-1.06-1.06L17.5 5.44z’ clip-rule=’evenodd’/%3E%3C/svg%3E"”/> | -0.2 | near<=0.20 && far>=0.20 |
<img class=”lazy” src=”/images/wiki/WebGL/Ortho_3.png” data-src=”/images/wiki/WebGL/Ortho_3.png”onerror=”this.src="data:image/svg+xml,%3Csvg xmlns=’http://www.w3.org/2000/svg‘ width=’2rem’ height=’2rem’ viewBox=’0 0 24 24’%3E%3C!– Icon from Solar by 480 Design - https://creativecommons.org/licenses/by/4.0/ –%3E%3Cpath fill=’%23F44336’ d=’M22 12.698c-.002 1.47-.013 2.718-.096 3.743c-.097 1.19-.296 2.184-.74 3.009a4.2 4.2 0 0 1-.73.983c-.833.833-1.893 1.21-3.237 1.39C15.884 22 14.2 22 12.053 22h-.106c-2.148 0-3.83 0-5.144-.177c-1.343-.18-2.404-.557-3.236-1.39c-.738-.738-1.12-1.656-1.322-2.795c-.2-1.12-.236-2.512-.243-4.241Q1.999 12.737 2 12v-.054c0-2.148 0-3.83.177-5.144c.18-1.343.557-2.404 1.39-3.236s1.893-1.21 3.236-1.39c1.168-.157 2.67-.175 4.499-.177a.697.697 0 1 1 0 1.396c-1.855.002-3.234.018-4.313.163c-1.189.16-1.906.464-2.436.994S3.72 5.8 3.56 6.99C3.397 8.2 3.395 9.788 3.395 12v.784l.932-.814a2.14 2.14 0 0 1 2.922.097l3.99 3.99a1.86 1.86 0 0 0 2.385.207l.278-.195a2.79 2.79 0 0 1 3.471.209l2.633 2.37c.265-.557.423-1.288.507-2.32c.079-.972.09-2.152.091-3.63a.698.698 0 0 1 1.396 0’ opacity=’.5’/%3E%3Cpath fill=’%23F44336’ fill-rule=’evenodd’ d=’M17.5 11c-2.121 0-3.182 0-3.841-.659S13 8.621 13 6.5s0-3.182.659-3.841S15.379 2 17.5 2s3.182 0 3.841.659S22 4.379 22 6.5s0 3.182-.659 3.841S19.621 11 17.5 11m-1.47-7.03a.75.75 0 1 0-1.06 1.06l1.47 1.47l-1.47 1.47a.75.75 0 0 0 1.06 1.06l1.47-1.47l1.47 1.47a.75.75 0 1 0 1.06-1.06L18.56 6.5l1.47-1.47a.75.75 0 0 0-1.06-1.06L17.5 5.44z’ clip-rule=’evenodd’/%3E%3C/svg%3E"”/> | -0.4 | near<=0.40 && far>=0.40 |
补上三角形缺掉的角
简述:即推远远裁剪面,本例主要介绍视图矩阵与正射投影矩阵的混合使用
正射矩阵和视图投影矩阵的使用顺序
1 | gl_Position = ProjMatrix * ViewMatrix * a_Position; |
- 得到顶点在视图坐标系下的坐标
- 使用正射投影矩阵计算可视范围
LookAtTrianglesWithKeys_ViewVolume


可视空间与canvas的比例冲突
比例冲突会导致压缩变形
画布大小不变,可视空间横截面缩减一半
运行效果: 图形变为原来大小的两倍,超出可视空间部分被裁剪。
1 | projMatrix.setOrtho(-0.5,0.5,-0.5,0.5,0.0,1.0) |

画布大小不变,可视空间比例改变
运行效果: 图形在宽度上被拉伸导致变形,超出可视空间部分被裁剪。
1 | projMatrix.setOrtho(-0.3,0.3,-1.0,1.0,0.0,1.0) |
