可视范围
可视范围(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 |
---|---|---|
0.0 | near<=0.00 && far>=0.00 | |
-0.2 | near<=0.20 && far>=0.20 | |
-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) |