坐标系与右手定则.docx
《坐标系与右手定则.docx》由会员分享,可在线阅读,更多相关《坐标系与右手定则.docx(20页珍藏版)》请在冰豆网上搜索。
坐标系与右手定则
坐标系与右手定则(OpenInventor使用的坐标系统)
坐标系与右手定则(OpenInventor使用的坐标系统)(转)
在三维坐标系中,Z轴的正轴方向是根据右手定则确定的。
右手定则也决定三维空间中任一坐标轴的正旋转方向。
要标注X、Y和Z轴的正轴方向,就将右手背对着屏幕放置,拇指即指向X轴的正方向。
伸出食指和中指,如右图所示,食指指向Y轴的正方向,中指所指示的方向即是Z轴的正方向。
要确定轴的正旋转方向,如右图所示,用右手的大拇指指向轴的正方向,弯曲手指。
那么手指所指示的方向即是轴的正旋转方向。
OpenInventor 对3D数据使用的是右手坐标系,从屏幕内指向外,表示z轴的正方向。
所有的角度单位都是弧度。
对象都是在自己的局部坐标系空间下进行描述的,既众所周知的"对象坐标系空间"(objectcoordinatespace)。
当场景中的所有物体都已经进行完坐标变换后,那么它们就都在"世界坐标系空间"下描述了(worldcoordinatespace)。
照相机和灯光节点处于世界坐标系空间下。
三维坐标系
三维坐标系
三维笛卡儿坐标系是在二维笛卡儿坐标系的基础上根据右手定则增加第三维坐标(即Z轴)而形成的。
同二维坐标系一样,AutoCAD中的三维坐标系有世界坐标系WCS(WorldCoordinateSystem)和用户坐标系UCS(UserCoordinateSystem)两种形式。
1.1.三维笛卡尔坐标系
2.2.圆柱坐标系
3.3.球面坐标系
展开
1.右手定则
1.右手定则
在三维坐标系中,Z轴的正轴方向是根据右手定则确定的。
右手定则也决定三维空间中任一坐标轴的正旋转方向。
要标注X、Y和Z轴的正轴方向,就将右手背对着屏幕放置,拇指即指向X轴的正方向。
伸出食指和中指,如右图所示,食指指向Y轴的正方向,中指所指示的方向即是Z轴的正方向。
要确定轴的正旋转方向,如右图所示,用右手的大拇指指向轴的正方向,弯曲手指。
那么手指所指示的方向即是轴的正旋转方向。
2.世界坐标系
2.世界坐标系(WCS)
在AutoCAD中,三维世界坐标系是在二维世界坐标系的基础上根据右手定则增加Z轴而形成的。
同二维世界坐标系一样,三维世界坐标系是其他三维坐标系的基础,不能对其重新定义。
3.用户坐标系
3.用户坐标系(UCS)
用户坐标系为坐标输入、操作平面和观察提供一种可变动的坐标系。
定义一个用户坐标系即改变原点(0,0,0)的位置以及XY平面和Z轴的方向。
可在AutoCAD的三维空间中任何位置定位和定向UCS,也可随时定义、保存和复用多个用户坐标系。
详见本章第3节。
三维坐标形式
在AutoCAD中提供了下列三种三维坐标形式:
1.三维笛卡尔坐标
三维笛卡尔坐标(X,Y,Z)与二维笛卡尔坐标(X,Y)相似,即在X和Y值基础上增加Z值。
同样还可以使用基于当前坐标系原点的绝对坐标值或基于上个输入点的相对坐标值。
2.圆柱坐标
圆柱坐标与二维极坐标类似,但增加了从所要确定的点到XY平面的距离值。
即三维点的圆柱坐标可通过该点与UCS原点连线在XY平面上的投影长度,该投影与X轴夹角、以及该点垂直于XY平面的Z值来确定。
例如,坐标“10<60,20”表示某点与原点的连线在XY平面上的投影长度为10个单位,其投影与X轴的夹角为60度,在Z轴上的投影点的Z值为20。
圆柱坐标也有相对的坐标形式,如相对圆柱坐标“@10<45,30”表示某点与上个输入点连线在XY平面上的投影长为10个单位,该投影与X轴正方向的夹角为45
度且Z轴的距离为30个单位。
3.球面坐标
球面坐标也类似与二维极坐标。
在确定某点时,应分别指定该点与当前坐标系原点的距离,二者连线在XY平面上的投影与X轴的角度,以及二者连线与XY平面的角度。
例如,坐标“10<45<60”表示一个点,它与当前UCS原点的距离为10个单位,在XY平面的投影与X轴的夹角为45度,该点与XY平面的夹角为60度。
同样,圆柱坐标的相对形式表明了某点与上个输入点的距离,二者连线在XY平面上的投影与X轴的角度,以及二者连线与XY平面的角度。
数学中常用的三种三维坐标系
1.三维笛卡尔坐标系
三维笛卡尔坐标(X,Y,Z)是在三维笛卡尔坐标系下的点的表达式,其中,x,y,z分别是拥有共同的零点且彼此相互正交的x轴,y轴,z轴的坐标值。
2.圆柱坐标系
圆柱坐标(ρ,θ,z)是圆柱坐标系上的点的表达式。
设P(x,y,z)为空间内一点,则点P也可用这样三个有次序的数ρ,θ,z来确定,其中ρ为点P在xoy平面的投影M与原点的距离,θ为有向线段PO在xoy平面的投影MO与x轴正向所夹的角。
圆柱坐标系和三维笛卡尔坐标系的点的坐标的对应关系是,x=ρcosθ,y=ρsinθ,z=z。
3.球面坐标系
球面坐标系由到原点的距离、方位角、仰角三个维度构成。
球面坐标(ρ,θ,φ)是球面坐标系上的点的表达式。
设P(x,y,z)为空间内一点,则点P也可用这样三个有次序的数r,φ,θ来确定,其中r为原点O与点P间的距离,θ为有向线段与z轴正向所夹的角,φ为从正z轴来看自x轴按逆时针方向转到有向线段的角,这里M为点P在xOy面上的投影。
这样的三个数r,φ,θ叫做点P的球面坐标,这里r,φ,θ的变化范围为r∈[0,+∞),φ∈[0,2π],θ∈[0,π].r=常数,即以原点为心的球面;θ=常数,即以原点为顶点、z轴为轴的圆锥面;φ=常数,即过z轴的半平面。
其中x=rsinθcosφy=rsinθsinφz=rcosθ
笛卡尔坐标系是直角坐标系和斜角坐标系的统称。
相交于原点的两条数轴,构成了平面仿射坐标系。
如两条数轴上的度量单位相等,则称此仿射坐标系为笛卡尔坐标系。
两条数轴互相垂直的笛卡尔坐标系,称为笛卡尔直角坐标系,否则称为笛卡尔斜角坐标系。
仿射坐标系和笛卡尔坐标系平面向空间的推广
相交于原点的三条不共面的数轴构成空间的仿射坐标系。
三条数轴上度量单位相等的仿射坐标系被称为空间笛卡尔坐标系。
三条数轴互相垂直的笛卡尔坐标系被称为空间笛卡尔直角坐标系,否则被称为空间笛卡尔斜角坐标系。
笛卡尔坐标,它表示了点在空间中的位置,和直角坐标有区别,两种坐标可以相互转换。
举个例子:
某个点的笛卡尔坐标是493,454,967,那它的X轴坐标就是4+9+3=16,Y轴坐标是4+5+4=13,Z轴坐标是9+6+7=22,因此这个点的直角坐标是(16,13,22),坐标值不可能为负数(因为三个自然数相加无法成为负数)。
这个应该是了
右手定则
在三维坐标系中,Z轴的正轴方向是根据右手定则确定的。
右手定则也决定三维空间中任一坐标轴的正旋转方向。
要标注X、Y和Z轴的正轴方向,就将右手背对着屏幕放置,拇指即指向X轴的正方向。
伸出食指和中指,食指指向Y轴的正方向,中指所指示的方向即是Z轴的正方向
三维坐标系与几何学
Microsoft®Direct3D®应用程序需要熟悉三维几何学原理。
本节介绍创建三维场景所需的最重要的几何概念。
本节涉及到以下主题。
这些主题给读者提供了一个对Direct3D应用程序所涉及到的基本概念的高层描述。
更多有关这些主题的信息,请参阅更多的信息。
三维坐标系
通常三维图形应用程序使用两种笛卡尔坐标系:
左手系和右手系。
在这两种坐标系中,正x轴指向右面,正y轴指向上面。
通过沿正x轴方向到正y轴方向握拳,大姆指的指向就是相应坐标系统的正z轴的指向。
下图显示了这两种坐标系统。
Microsoft®Direct3D®使用左手坐标系。
如果正在移植基于右手坐标系的应用程序,必须将传给Direct3D的数据做两点改变。
∙颠倒三角形顶点的顺序,这样系统会从正面以顺时针的方向遍历它们。
换句话说,如果顶点是v0,v1,v2,那么以v0,v2,v1的顺序传给Direct3D。
∙用观察矩阵对世界空间中的z值取反。
要做到这一点,将表示观察矩阵的D3DMATRIX结构的_31、_32、_33和_34成员的符号取反。
要得到等同于右手系的效果,可以使用D3DXMatrixPerspectiveRH和D3DXMatrixOrthoRH函数定义投影矩阵。
但是,要小心使用D3DXMatrixLookAtRH函数,并相应地颠倒背面剔除的顺序及放置立方体贴图。
虽然左手坐标系和右手坐标系是最为常用的系统,但在三维软件中还使用许多其它坐标系。
例如,对三维建模应用程序而言,使用y轴指向或背向观察者的坐标系统并非罕见。
在这种情况下,任意轴(x,y或z)的正半轴指向观察者的被定义为右手系。
任意轴(x,y或z)的正半轴背向观察者的被定义为左手系。
如果正在移植一个基于左手系进行建模的应用程序,z轴向上,那么除了前面的步骤外,还必须旋转所有的顶点数据(译注:
如果原来的坐标系为正x轴向里,正y轴向左,正z轴向上,那么传给Direct3D的顶点的x值对应原来的y值,y值对应原来的z值,z值对应原来的x值,亦即旋转顶点数据)。
对三维坐标系统中定义的三维物体执行的最基本操作是变换、旋转和缩放。
可以合并这些基本变换以创建一个新的变换矩阵。
细节请参阅三维变换。
即使合并相同的变换操作,不同的合并顺序得到的结果是不可交换的——矩阵相乘的顺序很重要。
三维图元
三维图元是组成单个三维实体的顶点集合。
三维坐标系统中最简单的图元是点的集合,称为点表。
通常三维图元是多边形。
一个多边形是由至少三个顶点描绘的三维形体。
最简单的多边形是三角形。
Microsoft®Direct3D®使用三角形组成大多数多边形,因为三角形的三个顶点一定是共面的。
应用程序可以用三角形组合成大而复杂的多边形及网格(mesh)。
下图显示了一个立方体。
立方体的每个面由两个三角形组成。
整个三角形的集合构成了一个立方体图元。
可以将纹理和材质应用于图元的表面使它们看起来像是实心的。
可以使用三角形创建具有光滑曲面的图元。
下图显示了如何用三角形模拟一个球体。
应用了材质后,渲染得到的球体看起来是弯曲的。
如果使用高洛德着色,结果更是如此。
更多信息请参阅高洛德着色。
表面和顶点法向量
网格中的每个面有一个垂直的法向量。
该向量的方向由定义顶点的顺序及坐标系统是左手系还是右手系决定。
表面法向量从表面上指向正向面那一侧,如果把表面水平放置,正向面朝上,背向面朝下,那么表面法向量为垂直于表面从下方指向上方。
在Microsoft®Direct3D®中,只有面的正向是可视的。
一个正向面是顶点按照顺时针顺序定义的面。
任何不是正向面的面都是背向面。
由于Direct3D不总是渲染背向面,因此背向面要被剔除。
如果想要渲染背向面的话,可以改变剔除模式。
更多信息请参阅剔除状态。
Direct3D在计算高洛德着色、光照和纹理效果时使用顶点法向。
Direct3D使用顶点法向计算光源和表面间的夹角,对多边形进行高洛德着色。
Direct3D计算每个顶点的颜色和亮度值,并对图元表面所覆盖的所有像素点进行插值。
Direct3D使用夹角计算光强度,夹角越大,表面得到的光照就越少。
如果正在创建的物体是平直的,可将顶点法向设为与表面垂直,如下图所示。
该图定义了一个由两个三角形组成的平直表面。
但是,更可能的情况是物体由三角形带(trianglestrips)组成且三角形不共面。
要对整个三角形带的三角形平滑着色的一个简单方法是首先计算与顶点相关联的每个多边形表面的表面法向量。
可以这样计算顶点法向,使顶点法向与顶点所属的每个表面的法向的夹角相等。
但是,对复杂图元来说这种方法可能不够有效。
这种方法如下图所示。
图中有两个表面,S1与S2,它们的邻边在上方。
S1与S2的法向量用蓝色显示。
顶点的法向量用红色显示。
顶点法向量与S1表面法向的夹角和顶点法向量与S2表面法向的夹角相同。
当对这两个表面进行光照计算和高洛德着色时,得到结果是中间的边被平滑着色,看起来像是弧形的(而不是有棱角的)。
如果顶点法向偏向与它相关联的某个面,那么会导致那个面上的点光强度的增加或减少。
下图显示了一个例子。
这些面的邻边依然朝上。
顶点法向倾向S1,与顶点法向与表面法向有相同的夹角相比,这使顶点法向与光源间的夹角变小。
可以用高洛德着色在三维场景中显示一些有清晰边缘的物体。
要达到这个目的,只要在需要产生清晰边缘的表面交线处,把表面法向复制给交线处顶点的法向,如下图所示。
如果使用DrawPrimitive方法渲染场景,要将有锋利边缘的物体定义为三角形表,而非三角形带。
当将物体定义为三角形带时,Direct3D会将它作为由多个三角形组成的单个多边形处理。
高洛德着色被同时应用于多边形每个表面的内部和表面之间。
结果产生表面之间平滑着色的物体。
因为三角形表由一系列不相连的三角形面组成,所以Direct3D对多边形每个面的内部使用高洛德着色。
但是,没有在表面之间应用高洛德着色。
如果三角形表的两个或更多的三角形是相邻的,那么在它们之间看起来会有一条锋利边缘。
另一种可选的方法是在渲染具有锋利边缘的物体时改变到平面着色模式。
这在计算上是最有效的方法,但它可能导致场景中的物体不如用高洛德着色渲染的物体真实。
三角形光栅化法则
顶点指定的点经常不能精确地对应到屏幕上的像素。
此时,Microsoft®Direct3D®使用三角形光栅化法则决定对于给定三角形使用哪个像素。
三角形光栅化法则
Direct3D在填充几何图形时使用左上填充约定(top-leftfillingconvention)。
这与MicrosoftWindows®的图形设备接口(GUI)和OpenGL中的矩形使用的约定相同。
Direct3D中,像素的中心是决定点。
如果中心在三角形内,那么该像素就是三角形的一部分。
像素中心用整数坐标表示。
这里描述的Direct3D使用的三角形光栅化法则不一定适用于所有可用的硬件。
测试可以发现这些法则的实现间的细微变化。
下图显示了一个左上角为(0,0),右下角为(5,5)的矩形。
正如大家想象的那样,此矩形填充25个像素。
矩形的宽度由right减left定义。
高度由bottom减top定义。
在左上填充约定中,上表示水平span在垂直方向上的位置,左表示span中的像素在水平方向上的位置。
一条边除非是水平的,否则不可能是顶边——一般来说,大多数三角形只有左边或右边。
左上填充约定确定当一个三角形穿过像素的中心时Direct3D采取的动作。
下图显示了两个三角形,一个在(0,0),(5,0)和(5,5),另一个在(0,5),(0,0)和(5,5)。
在这种情况下第一个三角形得到15个像素(显示为黑色),而第二个得到10个像素(显示为灰色),因为公用边是第一个三角形的左边。
如果应用程序定义一个左上角为(0.5,0.5),右下角为(2.5,4.5)的矩形,那么这个矩形的中心在(1.5,2.5)。
当Direct3D光栅化器tessellate这个矩形时,每个像素的中心都毫无异义地分别位于四个三角形中,此时就不需要左上填充约定。
下图显示了这种情况。
矩形内的像素根据在Direct3D中被哪个三角形包含做了相应的标注。
如果将上例中的矩形移动,使之左上角为(1.0,1.0),右下角为(3.0,5.0),中心为(2.0,3.0),那么Direct3D使用左上角填充约定。
这个矩形中大多数的像素跨越两个或更多的三角形的边界,如下图所示。
这两个矩形会影响到相同的像素。
点、线光栅化法则
点和点精灵一样,都被渲染为与屏幕边缘对齐的四边形,因此它们使用与多边形同样的渲染法则。
非抗锯齿线段的渲染法则与GDI使用的法则完全相同。
更多有关抗锯齿线段的渲染,请参阅ID3DXLine。
点精灵光栅化法则
对点精灵和patch图元的渲染,就好像先把图元tessellate成三角形,然后将得到的三角形进行光栅化。
更多信息,请参阅点精灵。
矩形
贯穿Microsoft®Direct3D®和MicrosoftWindows®编程,都是用术语包围矩形来讨论屏幕上的物体。
由于包围矩形的边总是与屏幕的边平行,因此矩形可以用两个点描述,左上角和右下角。
当在屏幕上进行位块传输(Blit=Bitblocktransfer)或命中检测时,大多数应用程序使用RECT结构保存包围矩形的信息。
C++中,RECT结构有如下定义。
typedefstructtagRECT{
LONGleft;//这是左上角的x坐标。
LONGtop;//这是左上角的y坐标。
LONGright;//这是右下角的x坐标。
LONGbottom;//这是右下角的y坐标。
}RECT,*PRECT,NEAR*NPRECT,FAR*LPRECT;
在上例中,left和top成员是包围矩形左上角的x-和y-坐标。
类似地,right和bottom成员组成右下角的坐标。
下图直观地显示了这些值。
为了效率、一致性及易用性,Direct3D所有的presentation函数都使用矩形。
三角形插值对象(interpolants)
在渲染时,流水线会贯穿每个三角形的表面进行顶点数据插值。
有五种可能的数据类型可以进行插值。
顶点数据可以是各种类型的数据,包括(但不限于):
漫反射色、镜面反射色、漫反射阿尔法(三角形透明度)、镜面反射阿尔法、雾因子(固定功能流水线从镜面反射的阿尔法分量中取得,可编程顶点流水线则从雾寄存器中取得)。
顶点数据通过顶点声明定义。
对一些顶点数据的插值取决于当前的着色模式,如下表所示。
着色模式
描述
平面
在平面着色模式下只对雾因子进行插值。
对所有其它的插值对象,整个面都使用三角形第一个顶点的颜色。
高洛德
在所有三个顶点间进行线性插值。
根据不同的颜色模型,对漫反射色和镜面反射色的处理是不同的。
在RGB颜色模型中,系统在插值时使用红、绿和蓝颜色分量。
颜色的阿尔法成员作为单独的插值对象对待,因为设备驱动程序可以以两种不同的方法实现透明:
使用纹理混合或使用点画法(stippling)。
可以用D3DCAPS9结构的ShadeCaps成员确定设备驱动程序支持何种插值。
向量、顶点和四元数
贯穿Microsoft®Direct3D®,顶点用于描述位置和方向。
图元中的每个顶点由指定其位置的向量、颜色、纹理坐标和指定其方向的法向量描述。
四元数给三元素向量的[x,y,z]值增加了第四个元素。
用于三维旋转的方法,除了典型的矩阵以外,四元数是另一种选择。
四元数表示三维空间中的一根轴及围绕该轴的一个旋转。
例如,一个四元数可能表示轴(1,1,2)和1度的旋转。
四元数包含了有价值的信息,但它们真正的威力源自可对它们执行的两种操作:
合成和插值。
对四元数进行插值与合成它们类似。
两个四元数的合成如下表示:
将两个四元数的合成应用于几何体意味着“把几何体绕axis2轴旋转rotation2角度,然后绕axis1轴旋转rotation1角度”。
在这种情况下,Q表示绕单根轴的旋转,该旋转是先后将q2和q1应用于几何体的结果。
使用四元数,应用程序可以计算出一条从一根轴和一个方向到另一根轴和另一个方向的平滑、合理的路径。
因此,在q1和q2间插值提供了一个从一个方向变化到另一个方向的简单方法。
当同时使用合成与插值时,四元数提供了一个看似复杂而实际简单的操作几何体的方法。
例如,设想我们希望把一个几何体旋转到某个给定方向。
我们已经知道希望将它绕axis2轴旋转r2度,然后绕axis1轴旋转r1度,但是我们不知道最终的四元数。
通过使用合成,我们可以在几何体上合成两个旋转并得到最终单个的四元数。
然后,我们可以在原始四元数和合成的四元数间进行插值,得到两者之间的平滑转换。
Direct3D扩展(D3DX)工具库包含了帮助用户使用四元数的函数。
例如,D3DXQuaternionRotationAxis函数给一个定义旋转轴的向量增加一个旋转值,并在由D3DXQUTERNION结构定义的四元数中返回结果。
另外,D3DXQuaternionMultiply函数合成四元数,D3DXQuaternionSlerp函数在两个四元数间进行球面线性插值(sphericallinearinterpolation)。
Direct3D应用程序可以使用下列函数简化对四元数的使用。
Direct3D应用程序可以使用下列函数简化对三成员向量的使用。
D3DX工具库提供的数学函数中包含了许多辅助函数,可以简化对二成员和四成员向量的使用。