深度探讨透视投影坐标系.
测绘技术中的坐标系和投影方式介绍

测绘技术中的坐标系和投影方式介绍测绘技术是现代科技的一个重要分支,它涉及到地理空间信息的获取、处理和分析。
而在测绘技术中,坐标系和投影方式是非常重要的概念,它们决定了地理位置的表示和测量的精度。
本文将以深入浅出的方式介绍坐标系和投影方式在测绘技术中的应用。
一、坐标系坐标系是用来表示地点或位置的一种数学概念。
在地球上,利用经纬度坐标系可以描述地球上的各个点的位置。
经度表示东西方向的位置,纬度则表示南北方向的位置。
经度的起点称为本初子午线,通常选取零经度经过英国伦敦的本初子午线。
而纬度的基准线则是赤道。
在坐标系中,经纬度通常以度为单位表示,东经和北纬分别用正值表示,西经和南纬则用负值表示。
这种坐标系在大地测量、地图制作、卫星定位等领域广泛使用,是最基本的测绘坐标系。
除了经纬度坐标系外,还有许多其他坐标系,在不同的应用领域中得到广泛应用。
如笛卡尔坐标系、高程坐标系、地心坐标系等。
这些坐标系根据不同的测绘需求和应用目的而定,为地理空间信息提供了更精确和便捷的表示方式。
二、投影方式在地理空间信息的表达中,一个非常关键的问题是将地球表面上的三维空间映射为平面,这就是投影方式的作用。
由于地球表面是一个椭球体,而平面是一个二维空间,所以无法完美地将地球表面的所有特征映射到平面上。
因此,选择合适的投影方式就显得非常重要。
常见的投影方式包括等角、等积和等距投影等。
等角投影保持地球上两点间的角度关系,适用于海图和飞行导航等领域;等积投影则保持地球上面积的比例,适用于土地管理和资源评价等领域;而等距投影则保持地球上两点间的距离比例,适用于城市规划和测绘制图等领域。
此外,还有许多常用的投影方式,如墨卡托投影、极射投影、兰伯特投影等。
每一种投影方式都有其适用的范围和局限性,根据测绘需求和应用背景的不同,选择合适的投影方式可以使得测绘结果更准确和可用。
三、测绘技术中的应用测绘技术在现代社会中具有广泛的应用,涉及各个领域。
坐标系和投影方式作为测绘技术的重要组成部分,也在种种测绘应用中发挥着重要作用。
测绘技术中的坐标系与投影方式

测绘技术中的坐标系与投影方式在测绘技术领域中,坐标系与投影方式是两个重要的概念。
它们在地理信息系统(GIS)、地图制作、航空航天等领域中发挥着重要的作用。
本文将针对这两个概念展开深入探讨。
一、坐标系坐标系是地球表面上点的位置表示方法。
它是通过确定一个基准点、确定基准面和确定坐标轴来定义的。
常见的坐标系有地心坐标系(ECEF)、地心地固坐标系(ENU)和大地坐标系(LLH)。
地心坐标系是以地球中心为原点建立的坐标系,通常用于全球定位系统(GPS)中。
地心地固坐标系是以地球上某一固定点为原点,建立的坐标系,通常用于航天飞行器定位。
而大地坐标系则是以地球形状变化较小的球体为基准面建立的坐标系,通常用于地图制作和地理信息系统中。
在测绘技术中,选择合适的坐标系非常重要。
不同的坐标系适用于不同的应用领域。
例如,在地图制作中,大地坐标系常用于表示地理位置,可以将经度和纬度作为地点的坐标。
而在GPS定位中,地心坐标系和地心地固坐标系则更为常用。
因此,根据具体的需求和应用场景,选择合适的坐标系至关重要。
二、投影方式投影方式是将地球表面上的点在二维平面上显示的一种方式。
由于地球是一个三维球体,将其展示在一个平面上是不可避免的问题。
常用的投影方式有等角圆锥投影、等间隔柱状投影和等距杯状投影等。
等角圆锥投影是将地球表面展示在一个圆锥上,再将圆锥展开为一个平面。
这种投影方式在地图制作中广泛应用,因为它能够保持角度的一致性,使地图上的方向保持准确。
等间隔柱状投影则是将地球表面展示在一个柱体上,并将柱体展开为一个平面。
它主要用于大规模的地理测量和军事目的。
等距杯状投影则是将地球表面展示在一个杯状体上,并将杯状体展开为一个平面。
它主要用于航空航天领域,能够有效地保持距离的一致性。
每种投影方式都有其适用的范围和缺点。
选择合适的投影方式取决于地图制作的目的和要求。
在实际应用中,通常会根据地图的使用场景和使用者的需求,进行合理的选择。
测绘技术中的坐标系统与投影方法解析

测绘技术中的坐标系统与投影方法解析在现代测绘技术中,坐标系统和投影方法是非常重要的概念与工具。
它们为地理空间数据的存储、分析和表达提供了基础,并且在各个领域都有广泛的应用。
在本文中,我们将深入探讨测绘技术中的坐标系统与投影方法,剖析其原理和应用。
一、坐标系统坐标系统是用来描述地球上的点在地图上位置的一种方式。
地球是一个三维空间,而地图则是二维的平面,在将地球上的现象映射到地图上时,需要通过坐标系统来进行映射和转换。
常见的坐标系统有经纬度坐标系统和平面坐标系统。
经纬度坐标系统采用经度和纬度两个参数来确定地球上的点的位置。
经度是指位于东经0度到180度之间的线,纬度则是指位于北纬0度到90度之间的线。
经纬度坐标系统非常直观,易于理解和运用,被广泛应用于航海、航空等领域。
然而,由于地球不是一个完美的球体,经纬度坐标系统在大范围上会存在一些误差。
平面坐标系统是将地球表面划分为一系列平面,然后用X轴和Y轴来描述地球上的点的位置。
平面坐标系统具有较高的精度和准确性,适用于小范围地理空间数据的处理和分析。
在平面坐标系统中,常用的包括UTM(通用横轴墨卡托投影)和高斯-克吕格投影等。
二、投影方法投影方法是将三维的地球表面映射到二维的地图上的一种技术。
由于地球是一个球体,而地图是一个平面,二者之间的映射会引入一定的形变,投影方法的目标就是最小化这些形变。
常见的投影方法有圆柱投影、锥形投影和平面投影等。
圆柱投影是通过将一个圆柱体包裹在地球上,再将圆柱体展开成一个平面来进行映射。
这种投影方法的形变是从地球的赤道到两极逐渐增大的。
典型的圆柱投影包括墨卡托投影和笛卡尔投影等。
锥形投影是通过将一个锥体覆盖在地球上,并将锥面展开成一个平面来进行映射。
这种投影方法的形变主要发生在覆盖锥体的纬度范围内,而离中心纬线越远,形变越大。
典型的锥形投影包括兰勃托投影和极点方位等。
平面投影是将地球表面投影到一个平面上,形变主要在地球表面上。
投影坐标系的详细介绍

投影坐标系的详细介绍投影坐标系是地理空间信息系统中常用的一种坐标系统,它将地球表面的地理坐标映射到一个二维平面上,便于进行地图制作、测量和分析等操作。
投影坐标系的选择对地图质量和数据分析结果具有重要影响,因此对投影坐标系进行详细的介绍具有重要意义。
首先,投影坐标系的基本原理是将三维的地理坐标转换为二维的平面坐标。
由于地球是一个近似地球椭球体,而地图是在平面上展示地球表面,因此必须进行一定的数学转换。
投影坐标系通过一种数学模型将地球上的点按照一定规则映射到平面上,使得地球表面上的线段、面积和角度等地理特征在平面上能够得到合理、准确的表示。
投影坐标系有很多种类,常见的包括等面积投影、等距投影、等角投影等。
等面积投影保持地球表面上的面积比例关系,适用于需要准确测量面积的地图制作;等距投影保持地球表面上的距离比例关系,适用于需要准确测量距离的地图制作;等角投影保持地球表面上的角度关系,适用于需要准确测量角度的地图制作。
此外,还有一些特殊的投影坐标系,如墨卡托投影、兰勃托投影、极射投影等,它们在特定应用领域具有优势。
投影坐标系不仅仅是一个数学转换模型,还需要考虑到使用的地图范围、地图形状、地图形变以及地图使用目的等因素。
在选择投影坐标系时,需要权衡不同因素之间的取舍,以达到最优的地图效果。
例如,选择投影坐标系时需要考虑地图的纬度范围,选择全球性的坐标系还是局部性的坐标系;还需要考虑地图形状,选择圆形、椭圆形还是其他形状;同时还需要考虑地图形变,平行线是否保持平行、面积是否保持一致等问题;最后还要考虑地图使用目的,是制作导航地图、气象图、行政区划图还是其他类型的地图。
投影坐标系选择的准则主要包括地图形变、图形一致、适用范围、计算复杂度等因素。
地图形变是指由于地球表面三维形状与二维平面的转换而引起的失真现象。
不同的投影坐标系对应不同的形变性质,因此需要根据地图使用需要选择合适的坐标系。
图形一致是指地图中的地理特征在平面上的表示与实际地表特征的一致性。
08--透视投影

H-基面,承载物体的平面,一般看作投影H面
K-画面,绘制透视的投影面,一般将画面垂直基面
OX-基线,画面与基面的交线 S-视点,投影中心 s-站点,视点S在基面的正投影 Ss-视高,视点S与s间的距离 s′-主点,视点S在画面上的正投影 Ss′-主视线,也是视距 hh-视平线,过主点所作的水平线 SA-视线 A0-透视,视线与画面的交点
太大
适中
偏小
前楚地看到物体的视角范围约为
200-600,而以300-400为佳。
视点位置:对于产品,视点的位置应能使产 品正面和侧面的比例符合实际的长度比,且能 最大限度的反映产品造型特征;对于室内整体 透视,视点的位置宜在画面宽度中间1/3范围 内,特别不应在中央,把图形一分为二。
第一种方法是先确定站点,然后再确定画面。 第二种方法是先确定画面,然后再确定站点。
视距:视距大,透视图形大,水平线的透视 方向平缓;视距愈小,透视图形也愈小,透视 方向愈陡。视距的大小映根据产品的形态特征 以及视角(通常应小于600)综合考虑。
只有视距D等于画面宽度B的1.5~2.0倍时, 视角为28°~37°,符合人的视觉要求。
视高:视高一般取相当于人站立眼睛的高度, 级1.5~1.7米。对于高度较小的产品,视高应 相应降低。表现室内时,视高一般可取1.5~ 1.7米,当要强调天花或突出其宏伟高大时,可 取较低的视高,相反,重在表现地面或家具陈 设布置时,常选用较高的视高。
当视高高于形体高度时,能够看到大范围 的景观的透视图称为鸟瞰图。
4、画面平行线的透视P307 图15-7
1)一切与画面平行的直线没有灭点。其 透视的特征:
画面平行线的透视与直线本身平行; 两条平行的画面平行线的透视仍相互平行; 画面平行线上各段长度之比,等于这些线段 透视长度之比。
关于坐标系和投影的相关知识探讨

关于坐标系和投影的相关知识探讨坐标系和投影是地理学和地理信息系统(GIS)中的基础概念。
坐标系是用于定位地球上任意点位置的一种方案,而投影则是将地球的曲面表达在平面上的方法。
本文将探讨坐标系和投影的相关知识,包括定义、分类、应用以及优缺点等。
首先,坐标系是地理空间数据基准的一部分,用于描述地球上一些点的位置。
常见的坐标系包括地心坐标系、大地坐标系和平面坐标系等。
其中,地心坐标系以地球的中心作为起点,以地球的表面为参照进行定位。
大地坐标系则以地球表面上的一个点作为起点,以地球的形状和大小为参照进行定位。
平面坐标系是将地球表面投影到平面上的一种方法,常用于地图制作和空间分析中。
投影是将地球的曲面表达在平面上的一种方法。
由于地球是一个近似于椭球体的三维对象,将其表达在平面上时会出现形变。
根据存储项目,地图投影可以分为正形投影和等面积投影。
正形投影是指将地球上各点间的角度关系保持不变的投影方法,可以保持形状的相对准确。
等面积投影则是指将地球上的面积比例保持不变的投影方法,可以保持面积的相对准确。
常见的投影方法包括墨卡托投影、正轴等积圆柱投影和兰勃托投影等。
在GIS应用中,坐标系和投影的选择是非常重要的。
不同的应用需要不同的坐标系和投影方案来满足精度和准确性的要求。
例如,在地图制作中,通常使用平面坐标系和等面积投影来保持地图上各个地区的相对面积准确。
而在空间分析中,通常使用大地坐标系和正形投影来保持地图上各个地区的角度关系准确。
尽管各个坐标系和投影方法都有自己的优点和局限性,但基于特定的应用需求选择合适的坐标系和投影方法是非常重要的。
此外,随着技术的进步和研究的不断深入,也涌现出了一些新的坐标系和投影方法,以更好地满足各种不同应用的需求。
总之,坐标系和投影是地理学和GIS中的基础概念,对于地球定位和地图制作非常重要。
通过理解和应用合适的坐标系和投影方法,可以更准确地表达地球的空间信息,从而支持各种地理空间应用和决策。
透视投影的原理和实现

透视投影的原理和实现透视投影的原理和实现摘要:透视投影是3D渲染的基本概念,也是3D程序设计的基础。
掌握透视投影的原理对于深⼊理解其他3D渲染管线具有重要作⽤。
本⽂详细介绍了透视投影的原理和算法实现,包括透视投影的标准模型、⼀般模型和屏幕坐标变换等,并通过VC实现了⼀个演⽰程序。
1 概述在计算机三维图像中,投影可以看作是⼀种将三维坐标变换为⼆维坐标的⽅法,常⽤到的有正交投影和透视投影。
正交投影多⽤于三维健模,透视投影则由于和⼈的视觉系统相似,多⽤于在⼆维平⾯中对三维世界的呈现。
透视投影(Perspective Projection)是为了获得接近真实三维物体的视觉效果⽽在⼆维的纸或者画布平⾯上绘图或者渲染的⼀种⽅法,也称为透视图[1]。
它具有消失感、距离感、相同⼤⼩的形体呈现出有规律的变化等⼀系列的透视特性,能逼真地反映形体的空间形象。
透视投影通常⽤于动画、视觉仿真以及其它许多具有真实性反映的⽅⾯。
2 透视投影的原理基本的透视投影模型由视点E和视平⾯P两部分构成(要求 E不在平⾯P上)。
视点可以认为是观察者的位置,也是观察三维世界的⾓度。
视平⾯就是渲染三维对象透视图的⼆维平⾯。
如图1所⽰。
对于世界中的任⼀点X,构造⼀条起点为E并经过X点的射线R,R与平⾯P的交点Xp即是X点的透视投影结果。
三维世界的物体可以看作是由点集合 { Xi} 构成的,这样依次构造起点为E,并经过点Xi的射线Ri,这些射线与视平⾯P的交点集合便是三维世界在当前视点的透视图,如图2所⽰。
图1 透视投影的基本模型图2 透视图成像原理基本透视投影模型对视点E的位置和视平⾯P的⼤⼩都没有限制,只要视点不在视平⾯上即可。
P⽆限⼤只适⽤于理论分析,实际情况总是限定P为⼀定⼤⼩的矩形平⾯,透视结果位于P之外的透视结果将被裁减。
可以想象视平⾯为透明的玻璃窗,视点为玻璃窗前的观察者,观察者透过玻璃窗看到的外部世界,便等同于外部世界在玻璃窗上的透视投影(总感觉不是很恰当,但想不出更好的⽐喻了)。
三维图像投影变换——透视投影

三维图像投影变换——透视投影⼆、投影变换1、平⾯⼏何投影投影变换就是把三维物体投射到投影⾯上得到⼆维平⾯图形。
【计算机绘图是产⽣三维物体的⼆维图象,但屏幕上绘制图形的时候,必须在三维坐标系下考虑画法。
】常⽤的投影法有两⼤类两种投影法的本质区别在于【透视投影】的投影中⼼到投影⾯之间的距离是【有限的】,⽽【平⾏投影】的投影中⼼到投影⾯之间的距离是【⽆限的】。
(1)中⼼(透视)投影透视投影是3D渲染的基本概念,也是3D程序设计的基础。
其中的[p,q,r]能产⽣透视变换的效果1、透视基本原理因为⼀条直线段是由两点确定,多边形平⾯由围城该多边形的各顶点和边框线段确定,⽽任何⽴体也可以看成是由它的顶点和各棱边所构成的⼀个框体。
也就是说,可以通过求出这些【顶点的透视投影】⽽获得空间【任意⽴体的透视投影】。
三维世界的物体可以看作是由点集{X i}构成的,这样依次构造起点为E,并经过点X i的射线R i,这些射线与投影⾯P的交点集合便是三维世界在当前视点的透视图。
投影线均通过投影中⼼,在投影中⼼【相对】投影⾯【确定的】情况下,空间的⼀个点在投影⾯上只存在【唯⼀⼀个】投影。
2、⼀点透视先假设q≠0,p=r=0。
然后对点(x,y,z)进⾏变换图70对其结果进⾏齐次化处理得:A、当y=0时,有说明处于y=0平⾯内的点,经过变换以后没有发⽣变化B、当y→∞时,有说明当y→∞时,所有点的变换结果都集中到了y轴上的1/q处,即所有平⾏于y轴的直线将延伸相较于(0,1/q,0),该点称为【灭点】,⽽像这样形成⼀个灭点的透视变换称为【⼀点透视】。
同理可知,当p≠0,q=r=0时,则将在x轴上的1/p处产⽣⼀个灭点,坐标为(1/p,0,0),在这种情况下,所有平⾏于x轴的直线将延伸交于该点。
同理,当r≠0,q=p=0时,则将在z轴上的1/r处产⽣⼀个灭点,其坐标为(0,0,1/r),这种情况下,所有平⾏于z轴的直线将延伸交于该点。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
3d图形程序,就一定会做坐标变换。
而谈到坐标变换,就不得不提起投影变换,因为它是所有变换中最不容易弄懂的。
但有趣的是,各种关于透视变换的文档却依然是简之又简,甚至还有前后矛盾的地方。
看来如此这般光景,想要弄清楚它,非得自己动手不可了。
所以在下面的文章里,作者尝试推导一遍这个难缠的透视变换,然后把它套用到DX和PS2lib 的实例中去。
1.一般概念所谓透视投影变换,就是view 空间到project 空间的带透视性质的坐标变换步骤(这两个空间的定义可以参考其他文档和书籍)。
我们首先来考虑它应该具有那些变换性质。
很显然,它至少要保证我们在view空间中所有处于可视范围内的点通过变换之后,统统落在project空间的可视区域内。
好极了,我们就从这里着手——先来看看两个空间的可视区域。
由于是透视变换,view空间中的可见范围既是常说的视平截体(view frustum)。
如图,(图1)它就是由前后两个截面截成的这个棱台。
从view空间的x正半轴看过去是下图这个样子。
(图2)接下来是project空间的可视范围。
这个空间应当是处于你所见到的屏幕上。
实际上将屏幕表面视作project空间的xoy平面,再加一条垂直屏幕向里(或向外)的z轴(这取决于你的坐标系是左手系还是右手系),这样就构成了我们想要的坐标系。
好了,现在我们可以用视口(view port)的大小来描述这个可视范围了。
比如说全屏幕640*480的分辨率,原点在屏幕中心,那我们得到的可视区域为一个长方体,它如下图(a)所示。
(图3)但是,这样会带来一些设备相关性而分散我们的注意力,所以不妨先向DirectX文档学学,将project空间的可视范围定义为x∈[-1,1], y∈[-1,1], z∈[0,1]的一个立方体(上图b)。
这实际上可看作一个中间坐标系,从这个坐标系到上面我们由视口得出的坐标系,只需要对三个轴向做一些放缩和平移操作即可。
另外,这个project坐标系对clip操作来说,也是比较方便的。
2.推导过程先从project空间的x正半轴看看我们的变换目标。
(图4)这个区域的上下边界为y’=±1, 而图2中的上下边界为y = ±z * tan(fov/2),要实现图2到图4的变换,我们有y’= y * cot(fov/2) / z。
这下完了,这是一个非线性变换,怎么用矩阵计算来完成呢?还好我们有w这个分量。
注意到我们在做投影变换之前所进行的两次坐标变换——world变换和view变换,他们只是一系列旋转平移和缩放变换的叠加。
仔细观察这些变换矩阵,你会发现它们其实不会影响向量的w分量。
换句话说,只要不是故意,一个w分量等于1的向量,再来到投影变换之前他的w分量仍旧等于1。
好的,接下来我们让w’= w*z, 新的w就记录下了view空间中的z值。
同时在y分量上我们退而求其次,只要做到y’= y * cot(fov/2)。
那么,在做完线性变换之后,我们再用向量的y除以w,就得到了我们想要的最终的y值。
x分量的变换可以如法炮制,只是fov要换一换。
事实上,很多用以生成投影变换矩阵的函数都使用了aspect这个参数。
这个参数给出了视平截体截面的纵横比(这个比值应与view port的纵横比相等,否则变换结果会失真)。
如果我们按照惯例,定义aspect = size of X / size of Y。
那么我们就可以继续使用同一个fov而给出x分量的变换规则:x’= x * cot(fov/2) / aspect。
现在只剩下z分量了。
我们所渴望的变换应将z = Znear 变换到z = 0,将z = Zfar变换到z = 1。
这个很简单,但是等等,x, y最后还要除以w,你z怎能例外。
既然也要除,那么z = Zfar 就不能映射到z = 1了。
唔,先映射到z = Zfar试试。
于是,有z’= Zfar*(z-Znear)/(Zfar –Znear)。
接下来,看看z’/z的性质。
令f(z) = z’/z = Zfar*(z-Znear)/(z*(Zfar –Znear))。
则f’(z) = Zfar * Znear / ( z^2 * (Zfar –Znear )), 显而易见f’(z) > 0。
所以除了z = 0是一个奇点,函数f(z)是一个单调增的函数。
因此,当Znear≤z≤Zfar时,f(Znear)≤f(z)≤f(Zfar),即0≤f(z)≤1。
至此,我们可以给出投影变换的表达式了。
x’= x*cot(fov/2)/aspecty’= y*cot(fov/2)z’= z*Zfar / ( Zfar –Znear ) –Zfar*Znear / ( Zfar –Znear )w’= z以矩阵表示,则得到变换矩阵如下,cot(fov/2)/aspect 0 0 00 cot(fov/2) 0 00 0 Zfar/(Zfar-Znear) 10 0 -Zfar*Znear/(Zfar-Znear) 0。
做完线性变换之后,再进行所谓的“归一化”,即用w分量去除结果向量。
现在我们考虑一下这个变换对全view空间的点的作用。
首先是x和y分量,明了地,当z>0时,一切都如我们所愿;当z<0时,x和y的符号在变换前后发生了变化,从图象上来说,view 空间中处于camera后面的图形经过变换之后上下颠倒,左右交换;当z= 0 时,我们得到的结果是无穷大。
这个结果在实际中是没有意义的,以后我们得想办法弄掉它。
再来看z,仍旧拿我们上面定义的f(z)函数来看,我们已经知道当z≥Zfar时,f(z)≥1;同时当z→+∞,f(z)→Zfar/(Zfar-Znear);当z→+0时,f(z)→-∞; z→-0时,f(z)→+∞; z→∞时,f(z)→Zfar/(Zfar-Znear).由此我们画出f(z)的图像。
(图5)由此图可以看出当z≤0时,如果我们仍旧使用f(z)进行绘制会产生错误。
所以我们会想需要clip 操作——只要这个三角形有任意一个顶点经过变换后z值落在[Zfar/(Zfar-Znear), +∞]区间中,我们就毫不怜悯地抛弃她——因为无论如何,这个结果是错的。
那么万一有三角形在view空间内横跨了Znear到0的范围,按我们想应该是画不出来了。
但是回想一下我们所看见过的DirectX 程序,似乎从未看到过这种情况。
有点奇怪,但是不得不先放放,稍后再说。
3.到DirectX中求证在DirectX中拿一个用fov生成投影矩阵的函数来看。
D3DXMATRIX* D3DXMatrixPerspectiveFovLH( D3DXMATRIX* pOut, FLOAT fovy, FLOAT Aspect,FLOAT zn, FLOAT zf)这个函数恰好使用了我们刚才推导所使用的几个参数,经过一些数据的代入计算之后,我们就会发现它所产生的矩阵就是我们计算出来的。
看来,DirectX的思路和我们是一致的。
好的,一个问题解决了,但一个新的问题接着产生——DirectX是怎么做clip的?我不知道,而且看样子现在也知道不了,只能期待牛人相助或者是碰到一本好书了。
4.研究ps2lib的投影变换其实投影变换都是一回事,但是PS2lib的函数怎么有点不一样呢?仔细看看,原来我们的思路是先做“归一化”,然后再做view port的放缩和平移,而PS2不是这样——它把“归一化”放在最后。
接下来,我们就按这个顺序试试。
先看缩放操作,把它和除z交换顺序很方便,直接换便是了。
于是我们记view port 的宽度为Vw,高度为Vh, Z缓存的最大值为Zmax, 最小值为Zmin则有x’= x * cot(fov/2)/aspect*(Vw/2)y’= y * cot(fov/2)*(Vh/2)z’= Zfar(z-Znear)/(Zfar-Znear) * (Zmax-Zmin);w’= z再看平移部分,既然是要平移后再除,则必须平移原来的z倍,于是我们又记view port中心坐标为(Cx, Cy),就有x’’= x’+ z * Cxy’’= y’+ z * Cyz’’= z’+ z * Zminw’’= w好的,我们看看cot(fov/2)等于什么,从图2看,实际上它就是D/(Vh/2),那么cot(fov/2)/aspect实际上就是D/(Vw/2)。
但是,ps2在这上面耍了个小花招,它在view空间中的view port和project空间的view port可以不相等。
最明显的一点是,它在view空间中的view port的高度为480,但实际上它的输出的y向分辨率只有224。
也就是说,ps2想要输出纵横比等于电视机的图像,就必须在y向上再加一个缩放。
这个缩放在我们的变换中体现在哪呢?就在y’= D/(Vh/2)* (Vhscr/2)中,注意到两个Vh不相等(project空间中的Vh记成Vhscr),两个值一运算就得到x’= D*(224/480) = 0.466667D。
这个0.4666667就是ps2lib函数参数ay的由来。
同理,我们亦可得知ax一般应取值为1。
那么,实际上ps2lib函数的scrz,ax, ay三个参数的作用等同于DirectX的象形函数的fov和aspect,在确定的规则下,他们可以相互转换,得到性质完全相同的透视变换。
至于这个规则,这里就不给出了。
转回正题,有了上面的讨论,我们就可以展开我们的变换表达式如下,x’’= x * scrz * ax + z * Cxy’’= x * scrz * ay + z * Cyz’’= z * (Zfar*Zmax–Znear*Zmin)/(Zfar –Znear)–Zfar*Znear*(Zmax-Zmin)/(Zfar-Znear)w’’= zz分量好像还有点不一样,注意到一般ps2程序在z buffer的操作为greater&equal,而DirectX 的操作为less&equal,就是说,z方向得做些变动——得把z=Znear映射到z’’= Zmax,z=Zfar映射到z’’=Zmin。
说变就变,我们马上有z’= Zfar(z-Znear)/(Zfar-Znear)*(Zmin-Zmax)z’’= z’+Zmax再次展开,得到z’’= z * (Zfar*Zmin–Znear*Zmax)/(Zfar –Znear )+ Zfar*Znear*(Zmax-Zmin)/(Zfar-Znear)好了,用矩阵把这个变换写出来,scrz*ax 0 0 00 scrz*ay 0 0Cx Cy (Zfar*Zmin–Znear*Zmax)/(Zfar –Znear ) 10 0 Zfar*Znear*(Zmax-Zmin)/(Zfar-Znear) 0,这下就完全一样了。