我看到每个人都将他的坐标标准化为[-1; 1]的范围。为什么这样做?这需要吗?这仅适用于ThreeJS,还是每个3D框架都很常见?
答案 0 :(得分:1)
Three.js基于WebGL,WebGL基于OpenGL ES (Embedded System)
在WebGL / OpenGL ES中有一个视口:
OpenGL管理一个矩形视口作为其状态的一部分,它定义了渲染结果在绘图缓冲区中的位置。创建WebGL上下文后,视口将初始化为原点为(0,0)且宽度和高度等于(canvas.width,canvas.height)的矩形。
视口指定x和y从规范化设备坐标到窗口坐标的仿射变换。绘图缓冲区的大小由HTMLCanvasElement确定。剪刀盒定义了一个约束绘图的矩形。当启用剪刀测试时,只能通过绘制命令修改位于剪刀盒内的像素。启用时,绘图只能出现在视口,画布区域和剪刀框的交叉点内。如果未启用剪刀测试,则只能在视口和画布区域的交叉点内进行绘制。
这意味着gl.viewport
定义了从规范化设备坐标到视口矩形的转换
因为绘制并且应该在视口上显示的所有内容都必须位于规范化的设备空间中,该空间在(-1,-1,-1)到(1,1,1)的范围内。 / p>
将几何转换为标准化设备坐标:
几何体通过其模型矩阵转换为世界坐标。
要从wolrd坐标转换为normaliced设备坐标,Three.js提供THREE.OrthographicCamera或THREE.PerspectiveCamera。相机定义了视图矩阵和投影矩阵。
视图矩阵描述了查看场景的方向和位置。视图矩阵从wolrd空间转换为视图(眼睛)空间。通常,世界坐标和视图坐标为Cartesian coordinates。
投影矩阵描述了从场景的3D点到视口的2D点的映射。投影矩阵从视图空间变换到剪辑空间。剪辑空间坐标为Homogeneous coordinates。通过除以剪辑的w
分量,剪辑空间中的坐标转换为范围(-1,-1,-1)到(1,1,1)范围内的规范化设备坐标(NDC)坐标。