光栅化三维场景的基本流程

摘要:
整个项目的一些“习惯”要提前定义,自上而下要坚决执行和统一。换句话说,这个范围的范围是-1到1。目前,所有点都已转换为这个齐次剪裁空间,所有未被立方体包围的点都已被剪裁。

数学上的规定:

由于习惯的不同,每个人对同一个事物的标准也不同。

应事先规定好整个项目的一些“习惯”,并坚决贯彻它们,上下统一。

世界坐标系:

场景中所有物体处于世界坐标系下,且所有的坐标系均为左手坐标系,左手坐标系三个轴的指向如图:

光栅化三维场景的基本流程第1张

以屏幕为基准,该坐标系X轴指向右,Y轴指向上,Z轴指向屏幕里面

以此坐标系我们可以创建一个世界空间。当然并没有真正创建出来,只是一个约定,便于日后的使用。就像地球的经纬度一样,有了这个我们就能描述什么东西在什么地方了。

物体坐标系:

而世界中有很多物体,比如游戏中的模型,玩家等等。

该世界里的每个物体都含有三个数据:

1)该物体中心处于世界的位置(x,y,z)

2)该物体旋转的角度(Pitch,Yaw,Roll)。分别对应绕x y z轴旋转的角度,并规定从各个轴的负方向看过去的顺时针方向为正。

  比如(0,0,90)代表该物体不沿x y轴旋转,只沿z轴旋转90度,且旋转方向为顺时针。

3)构成该物体的所有点的相对于物体中心的位置(xi, yi, zi) (i 为构成物体的各个点,比如正方体的 8 个顶点)

光栅化的基础思想

(假设世界坐标系下只有一个物体,简化描述):

1)将该物体的所有点根据该物体在世界的位置及朝向进行缩放、旋转和平移,这一步将把物体的所有点的坐标从物体坐标系转换到世界坐标系。

  比如某物体只有一个点,该点处于相对物体中心的 (1,0,0) 处,而该物体中心处于世界的 (0,1,0) 处,且没有经过旋转。那么该点经过缩放、旋转和平移的坐标转换后,可以得到该点在世界坐标系下的位置 (1,1,0) 。

2)将世界中的观察者(人、玩家、摄像机等等)简化成一个点,就像一个摄像机该摄像机便是观察的视线发出的地方。同时摄像机也有如物体一样的位置信息 (x,y,z) 及旋转角度信息 (pitch, yaw, roll)。通过这两组数据我们可以求出摄像机在世界坐标系下的位置以及视线的朝向。

  但将要进行的动作恰恰相反,我们将世界的所有点(经过第一步后这些点的坐标系已经从他们的物体坐标系转换到了世界坐标系)进行上述变换的逆变换,可以得到以摄像机为中心的所有点的坐标。这一步之后的世界空间改叫观察空间。

3)将观察空间转至齐次剪裁空间。在实际生活中摄像机(或者人类)看东西的范围是有限的。但是目前为止所有的点不论摄像机看不看得到,都经过了变换。所以还要将观察空间中的所有点转换到一个叫做齐次剪裁空间的空间。这个空间有一个长宽高均为2的人为划定的范围,且该立方体形的范围的中心处于原点(0,0,0)。

  也就是说,这个范围上下前后左右的范围是 -1 到 1 。经过一个特殊的矩阵乘法变换后,所有处于该 2x2x2 立方体形范围内的所有点,都将是看得到的,最终会被渲染出来的。所有不在该 2x2x2 大小的范围内的点,都处于视线之外,最后都将不会渲染出来。盗张图:

  光栅化三维场景的基本流程第2张

  左边是观察空间,原点处是我们的摄像机(这个坐标系不是我们使用的左手坐标系,这是右手坐标系,他的 z 轴朝向屏幕外)。右边是第三步转换后形成的齐次剪裁空间。

  目前已经把所有点都转换到了这个齐次剪裁空间,并且剪裁掉了一切不在该立方体包围内的点。

  这时候我们已经可以把各个点的x、y坐标拿来,经过插值匹配到显示器的分辨率后(即将每个点的x y坐标的数值从[-1,1]“拉伸”至譬如[0,1920]和[0,1080]),直接显示出来了。但是显示的结果会比较奇怪,远近不同的物体大小居然一样。该投影过程叫做正交投影,而日常生活中我们所看到的近大远小的世界是透视投影的结果。

  怎么进行透视投影?大致思路是将每个点的在观察空间下的z坐标拿来,除以该点在齐次剪裁空间下的x和y的值(x = x/z, y = y/z)。显示出来便是透视投影后的图像。

简短总结:

要想将构成三维世界的点转换到显示器这个二维平面上来,需要对每个点进行如下操作

1)物体空间转换至世界空间 (通过数个矩阵乘法)

2)世界空间转换至观察空间 (需求出摄像机变换的逆矩阵)

3)观察空间转换至齐次剪裁空间 (通过乘上特殊的变换矩阵)

4)进行透视除法 (除以特定 z 值)

但是以上变换只是得到了点最终的位置信息。要想显示在屏幕上,还需要填充点和线组成的面,甚至是赋上自定义的贴图。

免责声明:文章转载自《光栅化三维场景的基本流程》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇转:Nginx 日志文件切割Java毫秒转换成日期格式下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

关于Unity中的摄像机

摄像机是挂载Camera组件的能把3D世界物体拍摄成2D画面显示到屏幕上面的节点,角度不一样,位置不一样,拍摄出来的东西就不一样。 Clear Flags:没有物体的时候,摄像机拍摄出的屏幕要绘制什么东西。sky box天空盒,soild color蓝色背景,dont clear不做任何处理(黑色)等选项。一般选择sky box天空盒。 Culling M...

3DMAX中坐标解析

World:世界坐标系,又称世界空间。位于各视口左下角的图标,显示了世界坐标系的方向,其坐标原点位于视口中心。该坐标系永远不会变化。Screen:屏幕坐标系,此时将使用活动视口屏幕作为坐标系。在活动视口中,x轴将永远在视图的水平方向并且正向向右,y轴将永远在视图的垂直方向并且正向向上,z轴将永远垂直于屏幕并且正向指向用户。View:视图坐标系,它混合了世界...

VTK 模型的旋转与平移

当从外界读入STL等三维模型时,其会按照它内部的坐标位置进行显示。因此它的位置和大小是确定的。但是在实际应用中,有可能需要人为地对这个模型在空间中进行旋转、平移或缩放等操作。VTK中有许多和旋转、平移相关的函数,下面一一进行测试。 RotateX、RotateY、RotateZ(绕自身坐标轴旋转) Rotate the Prop3Din degreesab...

Unity基础知识

hierarchy视图选中,点击scene视图,按f键聚焦 persp相当于是透视视野 在persp模式下,物体在scene界面上所呈现的画面是给人一种距离摄像头近的物体显示的大,距离摄像头远的物体显示的小。  alt+左键方便旋转 ISO相当于是平行视野 在ISO模式下,不论物体距离摄像头远近都给人的感觉是一样大的。 center和pivot  中心和轴...

EasyNVR无插件直播服务如何配合EasyBMS使用以及实现流媒体管理功能概述

本文转自:https://blog.csdn.net/black_3717/article/details/79769195 功能概要: 1.摄像机的无插件直播; 2.摄像机的低延时直播; 3.摄像机兼容多客户端(web、微信、手机、pad等)直播; 4.摆脱单一内网限制,局域网的设备(摄像头)进行公网直播; 5.对于摄像机的鉴权播放。 背景分析: 相信...

openGL 函数 收集

glViewport()函数 在OpenGL初始化完成之后,我们应该进行一些视图设置。首先是设定视见区域,即告诉OpenGL应把渲染之后的图形绘制在窗体的哪个部位。当视见区域是整个窗体时,OpenGL将把渲染结果绘制到整个窗口。我们调用glViewPort函数来决定视见区域: procedureglViewPort(x:GLInt;y:GLInt;Widt...