设为首页 - 加入收藏
广告 1000x90
您的当前位置:黄大仙78345救世报网 > 局部坐标系 > 正文

OpenGL坐标系解析(顶点从对象坐标系到屏幕的计算流程)

来源:未知 编辑:admin 时间:2019-07-28

  上篇博客(OpenGL专有名词解析)讲到了物体变换位置有一种方法通过坐标系变化,但由于OpenGL中坐标系统不是简短几句话能描述的,因此我们专门开篇梳理一下OpenGL的坐标系统。

  要详细了解OpenGL中多重坐标系, 首先我们需要了解从我们开发者构造的坐标系(Local/Object Space)转换到屏幕上坐标系 (Screen Coordinates)显示的具体过程。

  上图描绘了物体从局部对象坐标系统到屏幕坐标系转换的详细流程, 列举一下OpenGL中的坐标系。

  [Tips]以上变换流程中, 哪些是开发者需要做的,哪些是OpenGL会自动处理的呢?

  顶点计算过程中(参考上图)模型变换、视变换,投影变换,这些变换可以由用户根据需要自行指定,这些内容在顶点着色器中完成;

  透视除法、视口变换,这两个步骤是OpenGL自动执行的,在顶点着色器处理后的阶段完成。

  1. 从模型坐标系(局部/对象坐标系 Object Coordinates)到世界坐标系(World Coordinates)

  模型坐标系主要用于设计模型,在此阶段我们无需关心最终对象显示在屏幕哪个位置(因为决定显示在哪还需要加上摄像机来决定)。

  在OpenGL中缓存对象(buffer object)中保存,以及旧版本中使用的glVertex3f等函数指定的都是局部坐标系中的坐标。

  简单来说,这个过程主要做的事情就是我们在做仿射变化时通过调用modelViewMatrix的translation,Rotate,Scale等方法,将物体变化记录到模型视图矩阵当中。当然,如果不进行变化, 那就是默认情况。

  在固定功能绘制管线下,默认情况下OpenGL里model-view 和projection矩阵都是单位阵。如果没有应用任何变换,对象坐标系和世界坐标系是相同的。同时默认情形下,对象坐标系、照相机坐标系和裁剪坐标系3个坐标系是重合的。

  默认情况下,OpenGL执行正交投影;照相机位于世界坐标系原点,照相机指向-Z轴方向,照相机正向为+Y轴方向。

  自己总结一个观点。因为最终的成像要通过照相机模型来进行(不添加是为默认情况,参考上述),我们将世界坐标系中位置转换到照相机坐标系来进行,能够简化物体移动的实现。实际上这个转换可以理解为,从照相机/人眼看到的世界坐标系中场景是什么样子。

  我们要形成的一个观点就是: 场景不动时,移动照相机等价于照相机不动,以逆变换的形式变换场景。 这种变换在OpenGL中比在第一个过程中通过模型视图矩阵变换要简单许多, 例如

  //MoveForward 平移 cameraFrame.MoveForward(0.1f); //RotateWorld 旋转 cameraFrame.RotateWorld(angular, 0.0f, 1.0f, 0.0f);

  3.从照相机坐标系(Eye Coordinates)到裁剪坐标系(Clip Coordinates)

  OpenGL中我们使用视景体GLFrustum来创建投影矩阵,设置投影方式。

  投影就是将物体投影到投影平面的过程。因为OpenGL使用的是虚拟相机成像模型,因此也使用了正交投影和透视投影两种方式。

  实际上,投影有很多种类,这里稍微整理下常见的平行投影(正投影)和透视投影。

  平行投影的投影线相互平行,投影的结果与原物体的大小相等,因此广泛地应用于工程制图等方面。正交投影是平行投影的一种特殊情形,正交投影的投影线垂直于观察平面。物体不会因为远近而缩小。

  透视投影的投影线相交于一点,因此投影的结果与原物体的实际大小并不一致,而是会近大远小。因此透视投影更接近于真实世界的投影方式。

  这个过程就是透视除法的过程,在OpenGL中无须我们自己处理。它会在顶点着色器处理后的阶段完成。

  这个过程也就是视口变换,我们在glViewport指定后OpenGL自动处理。同过程4, 也是在顶点着色器处理后的阶段完成。

  两个函数来指定。其中(sxsx,sysy)表示窗口的左下角,nsns和 fsfs指定远近剪裁平面到屏幕坐标的映射关系。视口变换矩阵的推导可以参考前面的投影矩阵和视口变换矩阵一节。用上面的glViewport和glDepthRangef函数指定参数后,视口变换由OpenGL自动执行,不需要额外代码。

本文链接:http://sesdagreat.com/jubuzuobiaoxi/439.html

相关推荐:

网友评论:

栏目分类

现金彩票 联系QQ:24498872301 邮箱:24498872301@qq.com

Copyright © 2002-2011 DEDECMS. 现金彩票 版权所有 Power by DedeCms

Top