📄 transforms 变换.htm
字号:
<P class=MsoNormal
style="tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt"><SPAN
lang=EN-US
style="DISPLAY: none; FONT-SIZE: 13pt; FONT-FAMILY: 宋体; mso-fareast-language: ZH-CN; mso-bidi-font-family: 宋体; mso-hide: all"><SPAN
style="mso-spacerun: yes"> </SPAN>return
pOut;<o:p></o:p></SPAN></P>
<P class=MsoNormal
style="tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt"><SPAN
lang=EN-US
style="DISPLAY: none; FONT-SIZE: 13pt; FONT-FAMILY: 宋体; mso-fareast-language: ZH-CN; mso-bidi-font-family: 宋体; mso-hide: all">}<o:p></o:p></SPAN></P>
<DIV class=MsoNormal style="TEXT-ALIGN: center" align=center><SPAN lang=EN-US
style="FONT-FAMILY: 宋体; mso-fareast-language: ZH-CN; mso-bidi-font-family: 宋体">
<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-fareast-language: ZH-CN; mso-bidi-font-family: 宋体; mso-font-kerning: 18.0pt">矩阵串接<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-fareast-language: ZH-CN; mso-bidi-font-family: 宋体">
<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-fareast-language: ZH-CN; mso-bidi-font-family: 宋体">使用矩阵的一个优势就是可以通过把两个以上的矩阵相乘,将它们的效果合并在一起。这意味着,要先旋转一个建模然后把它平移到某个位置,无需使用两个矩阵,只要把旋转矩阵和平移矩阵相乘,产生一个包含了所有效果的合成矩阵。这个过程被称为矩阵串接,可以写成以下公式。<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-fareast-language: ZH-CN; mso-bidi-font-family: 宋体"><!--[if gte vml 1]><v:shape
id=_x0000_i1062 style="WIDTH: 117pt; HEIGHT: 21pt" type = "#_x0000_t75"
coordsize = "21600,21600"><v:imagedata o:title="matrxcat" src =
"Transform_files/image009.gif"></v:imagedata></v:shape><![endif]--><![if !vml]><img border=0 width=156 height=28
src="Transform_files/image009.gif" v:shapes="_x0000_i1062"><![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-fareast-language: ZH-CN; mso-bidi-font-family: 宋体">在这个公式中,<SPAN
lang=EN-US>C是将被创建的合成矩阵,M<SUB>1</SUB>到<SPAN
class=SpellE>M<SUB>n</SUB></SPAN>是矩阵C包含的单个矩阵。虽然大多数情况下,只需要串接两三个矩阵,但实际上并没有数量上的限制。<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-fareast-language: ZH-CN; mso-bidi-font-family: 宋体">可以使用<U><SPAN
lang=EN-US>D3DXMatrixMultiply</SPAN></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-fareast-language: ZH-CN; mso-bidi-font-family: 宋体">进行矩阵乘法时先后次序是至关重要的。前面的公式反映了矩阵串接从左到右的规则。也就是说,用来创建合成矩阵的每个矩阵产生的直观效果会按从左到右的次序出现。下面显示了一个典型的世界变换矩阵。想象一下给一个旋转飞行的碟子创建世界变换矩阵。应用程序也许想让飞行的碟子绕它的中心——建模空间中的<SPAN
lang=EN-US>y轴——旋转,然后把它平移到场景中的另一个位置。要实现这样的效果,首先创建一个旋转矩阵,然后将它与平移矩阵相乘,如以下公式所示。<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-fareast-language: ZH-CN; mso-bidi-font-family: 宋体"><!--[if gte vml 1]><v:shape
id=_x0000_i1063 style="WIDTH: 60pt; HEIGHT: 23.25pt" type = "#_x0000_t75"
coordsize = "21600,21600"><v:imagedata o:title="wrldexpl" src =
"Transform_files/image010.gif"></v:imagedata></v:shape><![endif]--><![if !vml]><img border=0 width=80 height=31
src="Transform_files/image010.gif" v:shapes="_x0000_i1063"><![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-fareast-language: ZH-CN; mso-bidi-font-family: 宋体">在这个公式中,<SPAN
class=SpellE><SPAN lang=EN-US>R<SUB>y</SUB></SPAN></SPAN>是绕<SPAN
lang=EN-US>y轴的旋转矩阵,<SPAN
class=SpellE>T<SUB>w</SUB></SPAN>是平移到世界坐标中某个位置的矩阵。<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-fareast-language: ZH-CN; mso-bidi-font-family: 宋体">矩阵相乘的顺序很重要,因为矩阵乘法是不可交换的,这和两个标量相乘不同。将矩阵以相反的顺序相乘会产生这样的直观效果:先把飞行中的碟子平移到世界空间中的某个位置,然后将它围绕世界坐标的原点旋转。<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-fareast-language: ZH-CN; mso-bidi-font-family: 宋体">无论创建何种类型的矩阵,都要记住从左到右的规则,这样才能保证得到想要的效果。<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-fareast-language: ZH-CN; mso-bidi-font-family: 宋体">
<HR align=center width="100%" SIZE=1>
</SPAN></DIV>
<H1><A name=世界变换></A><A name=_世界变换></A><SPAN
style="mso-bookmark: 世界变换">世界变换</SPAN></H1><SPAN
style="mso-bookmark: 世界变换"></SPAN>
<DIV class=MsoNormal style="TEXT-ALIGN: center" align=center><SPAN lang=EN-US>
<HR align=center width="100%" SIZE=1>
</SPAN></DIV>
<P>对世界变换的讨论介绍了基本概念,并提供了如何在<SPAN lang=EN-US>Microsoft®
Direct3D®应用程序中设置世界变换矩阵的细节。</SPAN></P>
<H2><SPAN
style="FONT-FAMILY: 黑体; mso-fareast-language: ZH-CN; mso-ascii-font-family: Arial">什么是世界变换</SPAN><SPAN
lang=EN-US style="mso-fareast-language: ZH-CN"><o:p></o:p></SPAN></H2>
<P>世界变换将坐标从建模空间,在这个空间中的顶点相对于建模的局部原点定义,转变到世界空间,在这个空间中的顶点相对于场景中所有物体共有的原点定义。本质上,世界变换将一个建模放到世界中,并由此而得名。下图描绘了世界坐标系统和建模的局部坐标系统间的关系。</P>
<P><SPAN lang=EN-US><!--[if gte vml 1]><v:shape id=_x0000_i1065
style="WIDTH: 157.5pt; HEIGHT: 150.75pt" type = "#_x0000_t75" coordsize =
"21600,21600"><v:imagedata o:title="worldcrd" src =
"Transform_files/image011.gif"></v:imagedata></v:shape><![endif]--><![if !vml]><img border=0 width=210 height=201
src="Transform_files/image011.gif" v:shapes="_x0000_i1065"><![endif]></SPAN></P>
<P>世界变换可以包含任意数量的平移、旋转和缩放的合并。有关对变换的数学讨论,请参阅<U>三维变换</U>。<SPAN
lang=EN-US><o:p></o:p></SPAN></P>
<H2><SPAN
style="FONT-FAMILY: 黑体; mso-fareast-language: ZH-CN; mso-ascii-font-family: Arial">设置世界矩阵</SPAN><SPAN
lang=EN-US style="mso-fareast-language: ZH-CN"><o:p></o:p></SPAN></H2>
<P>同任何其它变换一样,通过将一系列变换矩阵串接成单个矩阵,应用程序可以创建包含这些矩阵全部效果的世界矩阵。最简单的情况下,建模在世界的原点并且它的局部坐标轴与世界空间的方向相同,这时世界矩阵就是单位矩阵。更通常的情况下,世界矩阵是一系列矩阵的合成,包含一个平移矩阵,并且根据需要可能有一个以上的旋转矩阵。</P>
<P>以下示例,来自一个用<SPAN
lang=EN-US>C++编写的假想三维建模类,使用Direct3D扩展(D3DX)工具库提供的帮助函数创建了一个世界矩阵,这个世界矩阵包含了三个旋转矩阵,用于调整三维建模的方向,以及一个平移矩阵,用来根据建模在世界空间中的相对坐标重新确定它的位置。</SPAN></P><PRE><SPAN lang=EN-US style="FONT-SIZE: 10pt; COLOR: blue">/*</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"><o:p></o:p></SPAN></PRE><PRE><SPAN lang=EN-US style="FONT-SIZE: 10pt; COLOR: green"> * 根据本示例的目的,假设以下变量都是有效的并经过初始化。<o:p></o:p></SPAN></PRE><PRE style="TEXT-INDENT: 5pt; mso-char-indent-count: .5"><SPAN lang=EN-US style="FONT-SIZE: 10pt; COLOR: green">*<o:p></o:p></SPAN></PRE><PRE><SPAN lang=EN-US style="FONT-SIZE: 10pt; COLOR: green"> * 变量<SPAN class=SpellE>m_xPos</SPAN>,<SPAN class=SpellE>m_yPos</SPAN>,<SPAN class=SpellE>m_zPos</SPAN>包含了建模在世界坐标中的位置。<o:p></o:p></SPAN></PRE><PRE style="TEXT-INDENT: 5pt; mso-char-indent-count: .5"><SPAN lang=EN-US style="FONT-SIZE: 10pt; COLOR: green">*<o:p></o:p></SPAN></PRE><PRE><SPAN lang=EN-US style="FONT-SIZE: 10pt; COLOR: green"> * 变量<SPAN class=SpellE>m_fPitch</SPAN>,<SPAN class=SpellE>m_fYaw</SPAN>和<SPAN class=SpellE>m_fRoll</SPAN>为浮点数,包含了建模的方向,<o:p></o:p></SPAN></PRE><PRE><SPAN lang=EN-US style="FONT-SIZE: 10pt; COLOR: green"> * 用pitch,yaw和roll旋转角表示,以弧度为单位。<o:p></o:p></SPAN></PRE><PRE><SPAN lang=EN-US style="FONT-SIZE: 10pt; COLOR: green"> </SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; COLOR: blue">*/</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"><o:p></o:p></SPAN></PRE><PRE><SPAN lang=EN-US style="FONT-SIZE: 10pt"> <o:p></o:p></SPAN></PRE><PRE><SPAN class=GramE><SPAN lang=EN-US style="FONT-SIZE: 10pt">void</SPAN></SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"> C3DModel::MakeWorldMatrix( D3DXMATRIX* <SPAN class=SpellE>pMatWorld</SPAN> )<o:p></o:p></SPAN></PRE><PRE><SPAN lang=EN-US style="FONT-SIZE: 10pt">{<o:p></o:p></SPAN></PRE><PRE><SPAN lang=EN-US style="FONT-SIZE: 10pt"><SPAN style="mso-spacerun: yes"> </SPAN>D3DXMATRIX <SPAN class=SpellE>MatTemp</SPAN>;<SPAN style="mso-spacerun: yes"> </SPAN><SPAN style="COLOR: blue">//</SPAN><SPAN style="COLOR: green"> 用于旋转的临时矩阵</SPAN><o:p></o:p></SPAN></PRE><PRE><SPAN lang=EN-US style="FONT-SIZE: 10pt"><SPAN style="mso-spacerun: yes"> </SPAN>D3DXMATRIX <SPAN class=SpellE>MatRot</SPAN>;<SPAN style="mso-spacerun: yes"> </SPAN><SPAN style="COLOR: blue">//</SPAN><SPAN style="COLOR: green"> 最终的旋转矩阵,应用于<SPAN class=SpellE>pMatWorld</SPAN>.</SPAN><o:p></o:p></SPAN></PRE><PRE><SPAN lang=EN-US style="FONT-SIZE: 10pt"> <o:p></o:p></SPAN></PRE><PRE><SPAN lang=EN-US style="FONT-SIZE: 10pt"><SPAN style="mso-spacerun: yes"> </SPAN><SPAN style="COLOR: blue">//</SPAN><SPAN style="COLOR: green"> 使用从左到右的矩阵串接顺序,在旋转之前对物体在世界空间中</SPAN><o:p></o:p></SPAN></PRE><PRE><SPAN lang=EN-US style="FONT-SIZE: 10pt"><SPAN style="mso-spacerun: yes"> </SPAN><SPAN style="COLOR: blue">//</SPAN><SPAN style="COLOR: green"> 的位置进行平移。</SPAN><o:p></o:p></SPAN></PRE><PRE><SPAN lang=EN-US style="FONT-SIZE: 10pt"><SPAN style="mso-spacerun: yes"> </SPAN><SPAN class=GramE>D3DXMatrixTranslation(</SPAN><SPAN class=SpellE>pMatWorld</SPAN>, <SPAN class=SpellE>m_xPos</SPAN>, <SPAN class=SpellE>m_yPos</SPAN>, <SPAN class=SpellE>m_zPos</SPAN>);<o:p></o:p></SPAN></PRE><PRE><SPAN lang=EN-US style="FONT-SIZE: 10pt"><SPAN style="mso-spacerun: yes"> </SPAN><SPAN class=GramE>D3DXMatrixIdentity(</SPAN>&<SPAN class=SpellE>MatRot</SPAN>);<o:p></o:p></SPAN></PRE><PRE><SPAN lang=EN-US style="FONT-SIZE: 10pt"><o:p> </o:p></SPAN></PRE><PRE><SPAN lang=EN-US style="FONT-SIZE: 10pt"><SPAN style="mso-spacerun: yes"> </SPAN><SPAN style="COLOR: blue">//</SPAN><SPAN style="COLOR: green"> 现在将方向变量应用于世界矩阵</SPAN><o:p></o:p></SPAN></PRE><PRE><SPAN lang=EN-US style="FONT-SIZE: 10pt"><SPAN style="mso-spacerun: yes"> </SPAN><SPAN class=GramE>if(</SPAN><SPAN class=SpellE>m_fPitch</SPAN> || <SPAN class=SpellE>m_fYaw</SPAN> || <SPAN class=SpellE>m_fRoll</SPAN>) {<o:p></o:p></SPAN></PRE><PRE><SPAN lang=EN-US style="FONT-SIZE: 10pt"><SPAN style="mso-spacerun: yes"> </SPAN><SPAN style="COLOR: blue">//</SPAN><SPAN style="COLOR: green"> 产生并合成旋转矩阵。</SPAN><o:p></o:p></SPAN></PRE><PRE><SPAN lang=EN-US style="FONT-SIZE: 10pt"><SPAN style="mso-spacerun: yes"> </SPAN><SPAN class=GramE>D3DXMatrixRotationX(</SPAN>&<SPAN class=SpellE>MatTemp</SPAN>, <SPAN class=SpellE>m_fPitch</SPAN>);<SPAN style="mso-spacerun: yes"> </SPAN><SPAN style="COLOR: blue">//</SPAN><SPAN style="COLOR: green"> Pitch</SPAN><o:p></o:p></SPAN></PRE><PRE><SPAN lang=EN-US style="FONT-SIZE: 10pt"><SPAN style="mso-spacerun: yes"> </SPAN><SPAN class=GramE>D3DXMatrixMultiply(</SPAN>&<SPAN class=SpellE>MatRot</SPAN>, &<SPAN class=SpellE>MatRot</SPAN>, &<SPAN class=SpellE>MatTemp</SPAN>);<o:p></o:p></SPAN></PRE><PRE><SPAN lang=EN-US style="FONT-SIZE: 10pt"><SPAN style="mso-spacerun: yes"> </SPAN><SPAN class=GramE>D3DXMatrixRotationY(</SPAN>&<SPAN class=SpellE>MatTemp</SPAN>, <SPAN class=SpellE>m_fYaw</SPAN>);<SPAN style="mso-spacerun: yes"> </SPAN><SPAN style="mso-spacerun: yes"> </SPAN><SPAN style="COLOR: blue">//</SPAN><SPAN style="COLOR: green"> Yaw</SPAN><o:p></o:p></SPAN></PRE><PRE><SPAN lang=EN-US style="FONT-SIZE: 10pt"><SPAN style="mso-spacerun: yes"> </SPAN><SPAN class=GramE>D3DXMatrixMultiply(</SPAN>&<SPAN class=SpellE>MatRot</SPAN>, &<SPAN class=SpellE>MatRot</SPAN>, &<SPAN class=SpellE>MatTemp</SPAN>);<o:p></o:p></SPAN></PRE><PRE><SPAN lang=EN-US style="FONT-SIZE: 10pt"><SPAN style="mso-spacerun: yes"> </SPAN><SPAN class=GramE>D3DXMatrixRotationZ(</SPAN>&<SPAN class=SpellE>MatTemp</SPAN>, <SPAN class=SpellE>m_fRoll</SPAN>);<SPAN style="mso-spacerun: yes"> </SPAN><SPAN style="COLOR: blue">//</SPAN><SPAN style="COLOR: green"> Roll</SPAN><o:p></o:p></SPAN></PRE><PRE><SPAN lang=EN-US style="FONT-SIZE: 10pt"><SPAN style="mso-spacerun: yes"> </SPAN><SPAN class=GramE>D3DXMatrixMultiply(</SPAN>&<SPAN class=SpellE>MatRot</SPAN>, &<SPAN class=SpellE>MatRot</SPAN>, &<SPAN class=SpellE>MatTemp</SPAN>);<o:p></o:p></SPAN></PRE><PRE><SPAN lang=EN-US style="FONT-SIZE: 10pt"> <o:p></o:p></SPAN></PRE><PRE><SPAN lang=EN-US style="FONT-SIZE: 10pt"><SPAN style="mso-spacerun: yes"> </SPAN><SPAN style="COLOR: blue">//</SPAN><SPAN style="COLOR: green"> 应用旋转矩阵,得到最后的世界矩阵。</SPAN><o:p></o:p></SPAN></PRE><PRE><SPAN lang=EN-US style="FONT-SIZE: 10pt"><SPAN style="mso-spacerun: yes"> </SPAN><SPAN class=GramE>D3DXMatrixMultiply(</SPAN><SPAN class=SpellE>pMatWorld</SPAN>, &<SPAN class=SpellE>MatRot</SPAN>, <SPAN class=SpellE>pMatWorld</SPAN>);<o:p></o:p></SPAN></PRE><PRE><SPAN lang=EN-US style="FONT-SIZE: 10pt"><SPAN style="mso-spacerun: yes"> </SPAN>}<o:p></o:p></SPAN></PRE><PRE><SPAN lang=EN-US style="FONT-SIZE: 10pt">}<o:p></o:p></SPAN></PRE>
<P>当准备好世界变换矩阵后,应该调用<U><SPAN
lang=EN-US>IDirect3DDevice9::SetTransform</SPAN></U>方法设置它,并把第一个参数指定<U><SPAN
lang=EN-US>D3DTS_WORLD</SPAN></U>宏。<SPAN lang=EN-US><o:p></o:p></SPAN></P>
<P class=MsoNormal><B style="mso-bidi-font-weight: normal"><SPAN
style="FONT-FAMILY: 宋体; mso-fareast-language: ZH-CN; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">注意</SPAN></B><B
style="mso-bidi-font-weight: normal"><SPAN lang=EN-US
style="mso-fareast-language: ZH-CN"><SPAN
style="mso-tab-count: 1"> </SPAN></SPAN></B><SPAN lang=EN-US
style="FONT-FAMILY: 宋体; mso-fareast-language: ZH-CN">Direct3D</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
lang=EN-US style="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
lang=EN-US style="mso-fareast-language: ZH-CN">Direct3D</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
lang=EN-US style="mso-fareast-language: ZH-CN"><o:p></o:p></SPAN></P>
<DIV class=MsoNormal style="TEXT-ALIGN: center" align=center><SPAN lang=EN-US>
<HR align=center width="100%" SIZE=1>
</SPAN></DIV>
<H1><A name=观察变换></A><A name=_观察变换></A><SPAN
style="mso-bookmark: 观察变换">观察变换</SPAN></H1><SPAN
style="mso-bookmark: 观察变换"></SPAN>
<DIV class=MsoNormal style="TEXT-ALIGN: center" align=center><SPAN lang=EN-US>
<HR align=center width="100%" SIZE=1>
</SPAN></DIV>
<P>本节介绍观察变换的基本概念,并提供有关如何在<SPAN lang=EN-US>Microsoft®
Direct3D®应用程序中设置观察矩阵的细节。信息被分为以下主题。</SPAN></P>
<UL type=disc>
<LI class=MsoNormal
style="mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; tab-stops: list 36.0pt; mso-list: l5 level1 lfo4"><U><SPAN
lang=EN-US style="mso-fareast-language: ZH-CN"><A
href="http://www.gesoftfactory.com/developer/Transform.htm#_什么是观察变换?"><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">什么是观察变换?</SPAN></A></SPAN></U>
<LI class=MsoNormal
style="mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; tab-stops: list 36.0pt; mso-list: l5 level1 lfo4"><U><SPAN
lang=EN-US style="mso-fareast-language: ZH-CN"><A
href="http://www.gesoftfactory.com/developer/Transform.htm#_设置观察矩阵"><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">设置观察矩阵</SPAN></A></SPAN></U>
</LI></UL>
<H2><A name=什么是观察变换?></A><A name=_什么是观察变换?></A><SPAN
style="mso-bookmark: 什么是观察变换?"><SPAN
style="FONT-FAMILY: 黑体; mso-fareast-language: ZH-CN; mso-ascii-font-family: Arial">什么是观察变换?</SPAN></SPAN><SPAN
style="mso-bookmark: 什么是观察变换?"><SPAN lang=EN-US
style="mso-fareast-language: ZH-CN"><o:p></o:p></SPAN></SPAN></H2><SPAN
style="mso-bookmark: 什么是观察变换?"></SPAN>
<P>观察变换根据观察者在世界空间中的位置,把顶点变换到摄像机空间。在摄像
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -