如何将模型空间转换为视图空间?3D点转2D屏幕点实现方法
3D模型顶点转2D屏幕坐标实现步骤
你从OBJ文件提取的v开头数值是模型的局部空间坐标,要转成屏幕像素坐标必须走完4步标准坐标变换流程,没有捷径:
- 第一步:局部坐标转世界坐标
给顶点乘模型矩阵,把顶点从立方体自身的局部坐标系转到全局统一的世界坐标系。模型矩阵存储立方体的位移、旋转、缩放参数,如果只是测试渲染不需要动立方体,直接用单位矩阵当模型矩阵即可,输出结果为世界空间坐标(world_x, world_y, world_z)。 - 第二步:世界坐标转观察空间坐标
给上一步输出的世界坐标乘视图矩阵(相机矩阵),把坐标原点挪到相机位置,得到站在相机视角下的顶点相对位置。构造视图矩阵只需要三个参数:相机在世界空间的坐标、相机对准的目标点坐标、相机的上方向向量(默认用(0,1,0)即竖直向上即可),输出结果为观察空间坐标(view_x, view_y, view_z)。 - 第三步:投影变换得到归一化设备坐标
给观察空间坐标乘投影矩阵得到裁剪空间坐标(clip_x, clip_y, clip_z, clip_w),之后每个分量除以clip_w得到范围固定在[-1, 1]的归一化设备坐标(NDC)。投影矩阵二选一即可:- 要真实近大远小的3D效果选透视投影矩阵,构造参数为视场角FOV(常规取60°~90°)、渲染窗口宽高比、近裁剪面距离(常规取0.1)、远裁剪面距离(常规取100)
- 要无透视变形的平面效果选正交投影矩阵,直接定义可视区域的上下左右近远边界即可
这一步要做裁剪判断:如果顶点的view_z小于近裁剪面或者大于远裁剪面,说明顶点不在相机可视范围内,直接丢弃不用参与后续计算。
- 第四步:NDC坐标映射为屏幕像素坐标
把[-1,1]范围的NDC坐标映射到实际窗口像素范围,直接套公式:
这里// 以窗口左上角为屏幕坐标原点的写法 screen_x = (ndc_x + 1) * 0.5 * window_width screen_y = (1 - ndc_y) * 0.5 * window_heightndc_y取反是因为屏幕坐标系Y轴默认从上到下递增,和NDC坐标系Y轴方向相反。
常见坑点:
- 矩阵乘法顺序不能乱,列优先规则下变换顺序固定为
投影矩阵 × 视图矩阵 × 模型矩阵 × 局部顶点坐标,顺序错了渲染结果会完全错位- 部分建模软件导出OBJ时会做坐标轴映射,比如把竖直向上的Y轴存成Z轴,如果渲染出来立方体是躺倒的,先核对顶点坐标的轴对应关系
- 不要自己手写矩阵构造的三角函数逻辑,直接用现成的图形学数学库实现矩阵生成和乘法,避免角度弧度转换、正负号写错的低级问题
内容的提问来源于stack exchange,提问作者creepersaur
相关产品推荐
相关产品推荐

