📄 三维坐标系与几何学.htm
字号:
coordsize = "21600,21600"><v:imagedata o:title="samepix" src =
"3DCS_files/image016.png"></v:imagedata></v:shape><![endif]--><![if !vml]><img border=0 width=553 height=330
src="3DCS_files/image017.jpg" v:shapes="_x0000_i1045"><![endif]><o:p></o:p></SPAN></P>
<H2><A name=点、线光栅化法则>点、线光栅化法则</A></H2><SPAN
style="mso-bookmark: 点、线光栅化法则"></SPAN>
<P>点和点精灵一样,都被渲染为与屏幕边缘对齐的四边形,因此它们使用与多边形同样的渲染法则。</P>
<P>非抗锯齿线段的渲染法则与<SPAN lang=EN-US>GDI使用的法则完全相同。</SPAN></P>
<P>更多有关抗锯齿线段的渲染,请参阅<U><SPAN lang=EN-US>ID3DXLine</SPAN></U>。<SPAN
lang=EN-US><o:p></o:p></SPAN></P>
<H2><A name=点精灵光栅化法则>点精灵光栅化法则</A></H2><SPAN
style="mso-bookmark: 点精灵光栅化法则"></SPAN>
<P>对点精灵和<SPAN
lang=EN-US>patch图元的渲染,就好像先把图元tessellate成三角形,然后将得到的三角形进行光栅化。更多信息,请参阅<U>点精灵</U>。<o:p></o:p></SPAN></P>
<DIV class=MsoNormal style="TEXT-ALIGN: center" align=center><SPAN lang=EN-US
style="FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-fareast-language: ZH-CN">
<HR align=center width="100%" SIZE=1>
</SPAN></DIV>
<P class=MsoNormal
style="mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-outline-level: 1"><A
name=矩形><B><SPAN
style="FONT-SIZE: 24pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 18.0pt; mso-fareast-language: ZH-CN">矩形<SPAN
lang=EN-US><o:p></o:p></SPAN></SPAN></B></A></P><SPAN
style="mso-bookmark: 矩形"></SPAN>
<DIV class=MsoNormal style="TEXT-ALIGN: center" align=center><SPAN lang=EN-US
style="FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-fareast-language: ZH-CN">
<HR align=center width="100%" SIZE=1>
</SPAN></DIV>
<P class=MsoNormal
style="mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"><SPAN
style="FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-fareast-language: ZH-CN">贯穿<SPAN
lang=EN-US>Microsoft® Direct3D®和Microsoft
Windows®编程,都是用术语包围矩形来讨论屏幕上的物体。由于包围矩形的边总是与屏幕的边平行,因此矩形可以用两个点描述,左上角和右下角。当在屏幕上进行位块传输(Blit
= Bit block transfer)或命中检测时,大多数应用程序使用<B
style="mso-bidi-font-weight: normal">RECT</B>结构保存包围矩形的信息。<o:p></o:p></SPAN></SPAN></P>
<P class=MsoNormal
style="mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"><SPAN lang=EN-US
style="FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-fareast-language: ZH-CN">C++中,<B
style="mso-bidi-font-weight: normal">RECT</B>结构有如下定义。<o:p></o:p></SPAN></P><PRE><SPAN lang=EN-US style="FONT-SIZE: 10pt">typedef struct tagRECT { <o:p></o:p></SPAN></PRE><PRE><SPAN lang=EN-US style="FONT-SIZE: 10pt"><SPAN style="mso-spacerun: yes"> </SPAN>LONG<SPAN style="mso-spacerun: yes"> </SPAN>left;<SPAN style="mso-spacerun: yes"> </SPAN><SPAN style="COLOR: blue">//</SPAN><SPAN style="COLOR: green"> 这是左上角的x坐标。</SPAN><o:p></o:p></SPAN></PRE><PRE><SPAN lang=EN-US style="FONT-SIZE: 10pt"><SPAN style="mso-spacerun: yes"> </SPAN>LONG<SPAN style="mso-spacerun: yes"> </SPAN>top;<SPAN style="mso-spacerun: yes"> </SPAN><SPAN style="COLOR: blue">//</SPAN><SPAN style="COLOR: green"> 这是左上角的y坐标。</SPAN><o:p></o:p></SPAN></PRE><PRE><SPAN lang=EN-US style="FONT-SIZE: 10pt"><SPAN style="mso-spacerun: yes"> </SPAN>LONG<SPAN style="mso-spacerun: yes"> </SPAN>right;<SPAN style="mso-spacerun: yes"> </SPAN><SPAN style="COLOR: blue">//</SPAN><SPAN style="COLOR: green"> 这是右下角的x坐标。</SPAN><o:p></o:p></SPAN></PRE><PRE><SPAN lang=EN-US style="FONT-SIZE: 10pt"><SPAN style="mso-spacerun: yes"> </SPAN>LONG<SPAN style="mso-spacerun: yes"> </SPAN>bottom;<SPAN style="mso-spacerun: yes"> </SPAN><SPAN style="COLOR: blue">//</SPAN><SPAN style="COLOR: green"> 这是右下角的y坐标。</SPAN><o:p></o:p></SPAN></PRE><PRE><SPAN lang=EN-US style="FONT-SIZE: 10pt">} RECT, *PRECT, NEAR *NPRECT, FAR *LPRECT; <o:p></o:p></SPAN></PRE>
<P class=MsoNormal
style="mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"><SPAN
style="FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-fareast-language: ZH-CN">在上例中,<SPAN
lang=EN-US>left和top成员是包围矩形左上角的x-和y-坐标。类似地,right和bottom成员组成右下角的坐标。下图直观地显示了这些值。<o:p></o:p></SPAN></SPAN></P>
<P class=MsoNormal
style="mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"><SPAN lang=EN-US
style="FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-fareast-language: ZH-CN"><!--[if gte vml 1]><v:shape
id=_x0000_i1046 style="WIDTH: 275.25pt; HEIGHT: 203.25pt" type = "#_x0000_t75"
coordsize = "21600,21600"><v:imagedata o:title="rect" src =
"3DCS_files/image018.gif"></v:imagedata></v:shape><![endif]--><![if !vml]><img border=0 width=367 height=271
src="3DCS_files/image018.gif" v:shapes="_x0000_i1046"><![endif]><o:p></o:p></SPAN></P>
<P class=MsoNormal
style="mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"><SPAN
style="FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-fareast-language: ZH-CN">为了效率、一致性及易用性,
<SPAN lang=EN-US>Direct3D所有的presentation函数都使用矩形。<o:p></o:p></SPAN></SPAN></P>
<DIV class=MsoNormal style="TEXT-ALIGN: center" align=center><SPAN lang=EN-US
style="FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-fareast-language: ZH-CN">
<HR align=center width="100%" SIZE=1>
</SPAN></DIV>
<P class=MsoNormal
style="mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-outline-level: 1"><A
name=三角形插值对象><B><SPAN
style="FONT-SIZE: 24pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 18.0pt; mso-fareast-language: ZH-CN">三角形插值对象</SPAN></B></A><B><SPAN
style="FONT-SIZE: 24pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 18.0pt; mso-fareast-language: ZH-CN">(<SPAN
lang=EN-US>interpolants)<o:p></o:p></SPAN></SPAN></B></P>
<DIV class=MsoNormal style="TEXT-ALIGN: center" align=center><SPAN lang=EN-US
style="FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-fareast-language: ZH-CN">
<HR align=center width="100%" SIZE=1>
</SPAN></DIV>
<P class=MsoNormal
style="mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"><SPAN
style="FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-fareast-language: ZH-CN">在渲染时,流水线会贯穿每个三角形的表面进行顶点数据插值。有五种可能的数据类型可以进行插值。</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-fareast-language: ZH-CN; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">顶点数据可以是各种类型的数据,包括(但不限于):</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-fareast-language: ZH-CN">漫反射色、镜面反射色、漫反射阿尔法(三角形透明度)、镜面反射阿尔法、雾因子(固定功能流水线从镜面反射的阿尔法分量中取得,可编程顶点流水线则从雾寄存器中取得)。顶点数据通过<U>顶点声明</U>定义。<SPAN
lang=EN-US><o:p></o:p></SPAN></SPAN></P>
<P class=MsoNormal
style="mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"><SPAN
style="FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-fareast-language: ZH-CN">对一些顶点数据的插值取决于当前的着色模式,如下表所示。<SPAN
lang=EN-US><o:p></o:p></SPAN></SPAN></P>
<TABLE class=MsoNormalTable style="mso-cellspacing: 1.5pt" cellPadding=0
border=0>
<TBODY>
<TR style="mso-yfti-irow: 0">
<TD
style="PADDING-RIGHT: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; WIDTH: 54pt; PADDING-TOP: 0.75pt"
width=72>
<P class=MsoNormal style="TEXT-ALIGN: center" align=center><B><SPAN
style="FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-fareast-language: ZH-CN">着色模式<SPAN
lang=EN-US><o:p></o:p></SPAN></SPAN></B></P></TD>
<TD
style="PADDING-RIGHT: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; WIDTH: 361.3pt; PADDING-TOP: 0.75pt"
width=482>
<P class=MsoNormal style="TEXT-ALIGN: center" align=center><B><SPAN
style="FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-fareast-language: ZH-CN">描述<SPAN
lang=EN-US><o:p></o:p></SPAN></SPAN></B></P></TD></TR>
<TR style="mso-yfti-irow: 1">
<TD
style="PADDING-RIGHT: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; WIDTH: 54pt; PADDING-TOP: 0.75pt"
width=72>
<P class=MsoNormal><SPAN
style="FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-fareast-language: ZH-CN">平面<SPAN
lang=EN-US> <o:p></o:p></SPAN></SPAN></P></TD>
<TD
style="PADDING-RIGHT: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; WIDTH: 361.3pt; PADDING-TOP: 0.75pt"
width=482>
<P class=MsoNormal><SPAN
style="FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-fareast-language: ZH-CN">在平面着色模式下只对雾因子进行插值。对所有其它的插值对象,整个面都使用三角形第一个顶点的颜色。<SPAN
lang=EN-US><o:p></o:p></SPAN></SPAN></P></TD></TR>
<TR style="mso-yfti-irow: 2; mso-yfti-lastrow: yes">
<TD
style="PADDING-RIGHT: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; WIDTH: 54pt; PADDING-TOP: 0.75pt"
width=72>
<P class=MsoNormal><SPAN
style="FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-fareast-language: ZH-CN">高洛德<SPAN
lang=EN-US> <o:p></o:p></SPAN></SPAN></P></TD>
<TD
style="PADDING-RIGHT: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; WIDTH: 361.3pt; PADDING-TOP: 0.75pt"
width=482>
<P class=MsoNormal><SPAN
style="FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-fareast-language: ZH-CN">在所有三个顶点间进行线性插值。<SPAN
lang=EN-US><o:p></o:p></SPAN></SPAN></P></TD></TR></TBODY></TABLE>
<P class=MsoNormal
style="mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"><SPAN
style="FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-fareast-language: ZH-CN">根据不同的颜色模型,对漫反射色和镜面反射色的处理是不同的。在<SPAN
lang=EN-US>RGB颜色模型中,系统在插值时使用红、绿和蓝颜色分量。<o:p></o:p></SPAN></SPAN></P>
<P class=MsoNormal
style="mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"><SPAN
style="FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-fareast-language: ZH-CN">颜色的阿尔法成员作为单独的插值对象对待,因为设备驱动程序可以以两种不同的方法实现透明:使用纹理混合或使用点画法(<SPAN
lang=EN-US>stippling)。<o:p></o:p></SPAN></SPAN></P>
<P class=MsoNormal
style="mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"><SPAN
style="FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-fareast-language: ZH-CN">可以用<U><SPAN
lang=EN-US>D3DCAPS9</SPAN></U>结构的<B style="mso-bidi-font-weight: normal"><SPAN
lang=EN-US>ShadeCaps</SPAN></B>成员确定设备驱动程序支持何种插值。<SPAN
lang=EN-US><o:p></o:p></SPAN></SPAN></P>
<DIV class=MsoNormal style="TEXT-ALIGN: center" align=center><SPAN lang=EN-US
style="FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-fareast-language: ZH-CN">
<HR align=center width="100%" SIZE=1>
</SPAN></DIV>
<P class=MsoNormal
style="mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-outline-level: 1"><A
name=向量、顶点和四元数><B><SPAN
style="FONT-SIZE: 24pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 18.0pt; mso-fareast-language: ZH-CN">向量、顶点和四元数<SPAN
lang=EN-US><o:p></o:p></SPAN></SPAN></B></A></P><SPAN
style="mso-bookmark: 向量、顶点和四元数"></SPAN>
<DIV class=MsoNormal style="TEXT-ALIGN: center" align=center><SPAN lang=EN-US
style="FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-fareast-language: ZH-CN">
<HR align=center width="100%" SIZE=1>
</SPAN></DIV>
<P class=MsoNormal
style="mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"><SPAN
style="FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-fareast-language: ZH-CN">贯穿<SPAN
lang=EN-US>Microsoft®
Direct3D®,顶点用于描述位置和方向。图元中的每个顶点由指定其位置的向量、颜色、纹理坐标和指定其方向的法向量描述。<o:p></o:p></SPAN></SPAN></P>
<P class=MsoNormal
style="mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"><SPAN
style="FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-fareast-language: ZH-CN">四元数给三元素向量的<SPAN
lang=EN-US>[ <I>x</I>, <I>y</I>,
<I>z</I>]值增加了第四个元素。用于三维旋转的方法,除了典型的矩阵以外,四元数是另一种选择。四元数表示三维空间中的一根轴及围绕该轴的一个旋转。例如,一个四元数可能表示轴(1,1,2)和1度的旋转。四元数包含了有价值的信息,但它们真正的威力源自可对它们执行的两种操作:合成和插值。<o:p></o:p></SPAN></SPAN></P>
<P class=MsoNormal
style="mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"><SPAN
style="FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-fareast-language: ZH-CN">对四元数进行插值与合成它们类似。两个四元数的合成如下表示:<SPAN
lang=EN-US><o:p></o:p></SPAN></SPAN></P>
<P class=MsoNormal
style="mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"><SPAN lang=EN-US
style="FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-fareast-language: ZH-CN"><SUB><!--[if gte vml 1]><v:shape
id=_x0000_i1047 style="WIDTH: 53.25pt; HEIGHT: 17.25pt" o:ole="" type =
"#_x0000_t75" coordsize = "21600,21600"><v:imagedata o:title="" src =
"3DCS_files/image019.wmz"></v:imagedata></v:shape><![endif]--><![if !vml]><img border=0 width=71 height=23
src="3DCS_files/image020.gif" v:shapes="_x0000_i1047"><![endif]></SUB><!--[if gte mso 9]><xml>
<o:OLEObject Type="Embed" ProgID="Equation.3" ShapeID="_x0000_i1047"
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -