﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>博客园-计算机图形学(CG)理论研究</title><link>http://www.cnblogs.com/clife/</link><description>致力于计算机图形学理论及实现的研究</description><language>zh-cn</language><lastBuildDate>Fri, 05 Sep 2008 16:23:27 GMT</lastBuildDate><pubDate>Fri, 05 Sep 2008 16:23:27 GMT</pubDate><ttl>60</ttl><item><title>3D基础：3D坐标变换在OpenGL 中的实践</title><link>http://www.cnblogs.com/clife/archive/2006/07/07/445201.html</link><dc:creator>爱唱歌的狗狗</dc:creator><author>爱唱歌的狗狗</author><pubDate>Fri, 07 Jul 2006 06:25:00 GMT</pubDate><guid>http://www.cnblogs.com/clife/archive/2006/07/07/445201.html</guid><wfw:comment>http://www.cnblogs.com/clife/comments/445201.html</wfw:comment><comments>http://www.cnblogs.com/clife/archive/2006/07/07/445201.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/clife/comments/commentRss/445201.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/clife/services/trackbacks/445201.html</trackback:ping><description><![CDATA[<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US>3D</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">基础：</span><span lang=EN-US>3D</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">坐标变换在</span><span lang=EN-US>OpenGL </span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中的实践</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">原创：爱唱歌的狗狗<br></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在计算机图形学中，变换矩阵是非常基础也是非常重要的知识，在许多资料中，只是罗列出一堆矩阵公式，图表等等，这很难给人感性的认识，特别是初学者，笔者结合</span><span lang=EN-US>OpenGL</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">这样一个非常流行的图形库，以实践的方式阐述在</span><span lang=EN-US>3D</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">变换矩阵中最简单的三种：平移、缩放以及旋转。</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><o:p>&nbsp;</o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">这里有一些前提知识，就是需要了解线性代数一些最最基本的知识，否则难以理解一些东西，而这些知识载体也是很容易获得的。</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><o:p>&nbsp;</o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">变换</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">我在制作</span><span lang=EN-US>3D</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">程序的时候，任何在</span><span lang=EN-US>3D</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">环境中的物体被图形引擎绘制的时候都是一个个</span><span lang=EN-US>3D</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">环境中的点，而正是由于这个原因，当我们想要变换一个物体的位置，大小，方向，乃至形状的时候，我们其实只要有序的改变物体网格上的点就可以了。</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><o:p>&nbsp;</o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">怎样变换</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在计算机图形学中，我们通常用矩阵来对</span><span lang=EN-US>3D</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">图形的每个点进行变换，比如我们变换一个需要这样的计算步骤：</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">将一个点的向量与一个变换矩阵相乘<br></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><v:shapetype id=_x0000_t75 stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"><v:stroke joinstyle="miter"></v:stroke><v:formulas><v:f eqn="if lineDrawn pixelLineWidth 0"></v:f><v:f eqn="sum @0 1 0"></v:f><v:f eqn="sum 0 0 @1"></v:f><v:f eqn="prod @2 1 2"></v:f><v:f eqn="prod @3 21600 pixelWidth"></v:f><v:f eqn="prod @3 21600 pixelHeight"></v:f><v:f eqn="sum @0 0 1"></v:f><v:f eqn="prod @6 1 2"></v:f><v:f eqn="prod @7 21600 pixelWidth"></v:f><v:f eqn="sum @8 21600 0"></v:f><v:f eqn="prod @7 21600 pixelHeight"></v:f><v:f eqn="sum @10 21600 0"></v:f></v:formulas><v:path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f"></v:path><o:lock aspectratio="t" v:ext="edit"></o:lock></v:shapetype></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><img height=79 alt="" src="http://www.cnblogs.com/images/cnblogs_com/clife/pic17.gif" width=236 border=0><br>这样就得到了一个变化后的向量</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><o:p><img height=70 alt="" src="http://www.cnblogs.com/images/cnblogs_com/clife/pic18.gif" width=252 border=0>&nbsp;</o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><o:p>&nbsp;</o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在实践中，最常用到的就是平移，缩放和旋转了。</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><o:p>&nbsp;</o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">下面给出这三种变换的矩阵</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">平移</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><img height=81 alt="" src="http://www.cnblogs.com/images/cnblogs_com/clife/tran.gif" width=190 border=0><br><br>缩放</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><img height=80 alt="" src="http://www.cnblogs.com/images/cnblogs_com/clife/scale.gif" width=187 border=0><br>旋转</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US>X</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><img height=80 alt="" src="http://www.cnblogs.com/images/cnblogs_com/clife/rotate.gif" width=218 border=0><br>Y</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><img height=80 alt="" src="http://www.cnblogs.com/images/cnblogs_com/clife/rotate2.gif" width=218 border=0><br>Z</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><o:p><img height=80 alt="" src="http://www.cnblogs.com/images/cnblogs_com/clife/rotate3.gif" width=217 border=0>&nbsp;</o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">学习理论的目的就是为了应用，然而在我们经常应用的</span><span lang=EN-US>3D</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">图形库，比如</span><span lang=EN-US>D3D</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，</span><span lang=EN-US> OpenGL </span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中矩阵变换已经被封装成为调用非常简便的函数了。对于产品开发，这无疑对缩短产品周期有很大的帮助，侯捷说过一句话：&#8220;学从难处学，用从易处用&#8221;，这句话很有道理，所以我们仅仅使用</span><span lang=EN-US>OpenGL</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的</span><span lang=EN-US>glVertex*</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">这样的函数将以上这些晦涩的图表应用到实践当中。</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><o:p>&nbsp;</o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US>Demo</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的界面如图所示，你可以在&#8220;操作&#8221;菜单中对界面中的正方体进行平移、缩放以及旋转的操作。</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><img height=510 alt="" src="http://www.cnblogs.com/images/cnblogs_com/clife/1.JPG" width=643 border=0>因为用的是</span><span lang=EN-US>Nehe</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的</span><span lang=EN-US>OpenGL</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的代码框架（</span><span lang=EN-US>nehe.gamedev.net</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">），对于如何建立起一个</span><span lang=EN-US>OpenGL</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">程序，这里就不做相应的阐述了，因为这并不是本文讨论的范围。</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><o:p>&nbsp;</o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">下面对重要的代码段进行讲述：</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><o:p>&nbsp;</o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US>//</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">这里定义了正方体的各个顶点，因为不是使用</span><span lang=EN-US>glTranslate</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、</span><span lang=EN-US>glRotate</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">这些函数进行变换而是手工计算变换后的物体坐标，所以我们用一个顶点数组来描述物体，这里一共有</span><span lang=EN-US>24</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">个点，每个点都使用奇次坐标来表示</span><span lang=EN-US>(x,y,z,w)</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US>GLfloat Cube[24][4]={{<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="True" HasSpace="False" SourceValue="1" UnitName="F">-1.0f</st1:chmetcnv>,<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="1" UnitName="F">1.0f</st1:chmetcnv>,<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="1" UnitName="F">1.0f</st1:chmetcnv>,<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="1" UnitName="F">1.0f</st1:chmetcnv>},</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US>{<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="True" HasSpace="False" SourceValue="1" UnitName="F">-1.0f</st1:chmetcnv>,<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="True" HasSpace="False" SourceValue="1" UnitName="F">-1.0f</st1:chmetcnv>,<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="1" UnitName="F">1.0f</st1:chmetcnv>,<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="1" UnitName="F">1.0f</st1:chmetcnv>},</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US>{<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="1" UnitName="F">1.0f</st1:chmetcnv>,<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="True" HasSpace="False" SourceValue="1" UnitName="F">-1.0f</st1:chmetcnv>,<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="1" UnitName="F">1.0f</st1:chmetcnv>,<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="1" UnitName="F">1.0f</st1:chmetcnv>},</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US>{<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="1" UnitName="F">1.0f</st1:chmetcnv>,<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="1" UnitName="F">1.0f</st1:chmetcnv>,<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="1" UnitName="F">1.0f</st1:chmetcnv>,<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="1" UnitName="F">1.0f</st1:chmetcnv>}, // </span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">前表面</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US>{<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="True" HasSpace="False" SourceValue="1" UnitName="F">-1.0f</st1:chmetcnv>,<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="1" UnitName="F">1.0f</st1:chmetcnv>,<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="1" UnitName="F">1.0f</st1:chmetcnv>,<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="1" UnitName="F">1.0f</st1:chmetcnv>},</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US>{<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="True" HasSpace="False" SourceValue="1" UnitName="F">-1.0f</st1:chmetcnv>,<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="1" UnitName="F">1.0f</st1:chmetcnv>,<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="True" HasSpace="False" SourceValue="1" UnitName="F">-1.0f</st1:chmetcnv>,<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="1" UnitName="F">1.0f</st1:chmetcnv>},</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US>{<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="True" HasSpace="False" SourceValue="1" UnitName="F">-1.0f</st1:chmetcnv>,<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="True" HasSpace="False" SourceValue="1" UnitName="F">-1.0f</st1:chmetcnv>,<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="True" HasSpace="False" SourceValue="1" UnitName="F">-1.0f</st1:chmetcnv>,<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="1" UnitName="F">1.0f</st1:chmetcnv>},</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US>{<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="True" HasSpace="False" SourceValue="1" UnitName="F">-1.0f</st1:chmetcnv>,<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="True" HasSpace="False" SourceValue="1" UnitName="F">-1.0f</st1:chmetcnv>,<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="1" UnitName="F">1.0f</st1:chmetcnv>,<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="1" UnitName="F">1.0f</st1:chmetcnv>}, // </span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">左侧面</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US>{<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="1" UnitName="F">1.0f</st1:chmetcnv>,<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="1" UnitName="F">1.0f</st1:chmetcnv>,<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="1" UnitName="F">1.0f</st1:chmetcnv>,<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="1" UnitName="F">1.0f</st1:chmetcnv>},</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US>{<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="1" UnitName="F">1.0f</st1:chmetcnv>,<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="1" UnitName="F">1.0f</st1:chmetcnv>,<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="True" HasSpace="False" SourceValue="1" UnitName="F">-1.0f</st1:chmetcnv>,<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="1" UnitName="F">1.0f</st1:chmetcnv>},</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US>{<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="1" UnitName="F">1.0f</st1:chmetcnv>,<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="True" HasSpace="False" SourceValue="1" UnitName="F">-1.0f</st1:chmetcnv>,<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="True" HasSpace="False" SourceValue="1" UnitName="F">-1.0f</st1:chmetcnv>,<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="1" UnitName="F">1.0f</st1:chmetcnv>},</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US>{<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="1" UnitName="F">1.0f</st1:chmetcnv>,<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="True" HasSpace="False" SourceValue="1" UnitName="F">-1.0f</st1:chmetcnv>,<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="1" UnitName="F">1.0f</st1:chmetcnv>,<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="1" UnitName="F">1.0f</st1:chmetcnv>}, // </span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">右侧面</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US>{<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="1" UnitName="F">1.0f</st1:chmetcnv>,<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="1" UnitName="F">1.0f</st1:chmetcnv>,<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="1" UnitName="F">1.0f</st1:chmetcnv>,<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="1" UnitName="F">1.0f</st1:chmetcnv>},</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US>{<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="1" UnitName="F">1.0f</st1:chmetcnv>,<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="1" UnitName="F">1.0f</st1:chmetcnv>,<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="True" HasSpace="False" SourceValue="1" UnitName="F">-1.0f</st1:chmetcnv>,<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="1" UnitName="F">1.0f</st1:chmetcnv>},</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US>{<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="True" HasSpace="False" SourceValue="1" UnitName="F">-1.0f</st1:chmetcnv>,<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="1" UnitName="F">1.0f</st1:chmetcnv>,<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="True" HasSpace="False" SourceValue="1" UnitName="F">-1.0f</st1:chmetcnv>,<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="1" UnitName="F">1.0f</st1:chmetcnv>},</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US>{<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="True" HasSpace="False" SourceValue="1" UnitName="F">-1.0f</st1:chmetcnv>,<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="1" UnitName="F">1.0f</st1:chmetcnv>,<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="1" UnitName="F">1.0f</st1:chmetcnv>,<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="1" UnitName="F">1.0f</st1:chmetcnv>}, // </span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">顶部</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US>{<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="1" UnitName="F">1.0f</st1:chmetcnv>,<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="True" HasSpace="False" SourceValue="1" UnitName="F">-1.0f</st1:chmetcnv>,<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="True" HasSpace="False" SourceValue="1" UnitName="F">-1.0f</st1:chmetcnv>,<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="1" UnitName="F">1.0f</st1:chmetcnv>},</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US>{<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="True" HasSpace="False" SourceValue="1" UnitName="F">-1.0f</st1:chmetcnv>,<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="True" HasSpace="False" SourceValue="1" UnitName="F">-1.0f</st1:chmetcnv>,<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="True" HasSpace="False" SourceValue="1" UnitName="F">-1.0f</st1:chmetcnv>,<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="1" UnitName="F">1.0f</st1:chmetcnv>},</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US>{<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="True" HasSpace="False" SourceValue="1" UnitName="F">-1.0f</st1:chmetcnv>,<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="True" HasSpace="False" SourceValue="1" UnitName="F">-1.0f</st1:chmetcnv>,<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="1" UnitName="F">1.0f</st1:chmetcnv>,<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="1" UnitName="F">1.0f</st1:chmetcnv>},</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US>{<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="1" UnitName="F">1.0f</st1:chmetcnv>,<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="True" HasSpace="False" SourceValue="1" UnitName="F">-1.0f</st1:chmetcnv>,<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="1" UnitName="F">1.0f</st1:chmetcnv>,<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="1" UnitName="F">1.0f</st1:chmetcnv>}, // </span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">底部</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US>{<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="True" HasSpace="False" SourceValue="1" UnitName="F">-1.0f</st1:chmetcnv>,<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="1" UnitName="F">1.0f</st1:chmetcnv>,<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="True" HasSpace="False" SourceValue="1" UnitName="F">-1.0f</st1:chmetcnv>,<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="1" UnitName="F">1.0f</st1:chmetcnv>},</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US>{<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="True" HasSpace="False" SourceValue="1" UnitName="F">-1.0f</st1:chmetcnv>,<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="True" HasSpace="False" SourceValue="1" UnitName="F">-1.0f</st1:chmetcnv>,<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="True" HasSpace="False" SourceValue="1" UnitName="F">-1.0f</st1:chmetcnv>,<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="1" UnitName="F">1.0f</st1:chmetcnv>},</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US>{<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="1" UnitName="F">1.0f</st1:chmetcnv>,<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="True" HasSpace="False" SourceValue="1" UnitName="F">-1.0f</st1:chmetcnv>,<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="True" HasSpace="False" SourceValue="1" UnitName="F">-1.0f</st1:chmetcnv>,<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="1" UnitName="F">1.0f</st1:chmetcnv>},</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US>{<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="1" UnitName="F">1.0f</st1:chmetcnv>,<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="1" UnitName="F">1.0f</st1:chmetcnv>,<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="True" HasSpace="False" SourceValue="1" UnitName="F">-1.0f</st1:chmetcnv>,<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="1" UnitName="F">1.0f</st1:chmetcnv>} // </span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">背面</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US>};</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><o:p>&nbsp;</o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US>//</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">一般在</span><span lang=EN-US>3D</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">引擎中，模型坐标系中原始的物体坐标一般需要保留，而不会随着流水线，而变成转化后的坐标，所以这里我们用一个数组来保存变换后的坐标</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><o:p>&nbsp;</o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US>GLfloat CubeNew[24][4];</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><o:p>&nbsp;</o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US>// </span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">这里是一个核心函数，用来进行两个矩阵相乘的操作</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US>// </span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">这里涉及到矩阵相乘，这在任何一本线性代数的课本上都能够轻松的找到</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US>void MatrixMul(GLfloat Matrix[4][4])<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US>{</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>for(int i=0;i&lt;24;i++)<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>CubeNew[i][0]=Cube[i][0]*Matrix[0][0]+Cube[i][1]*Matrix[0][1]+Cube[i][2]*Matrix[0][2]+Cube[i][3]*Matrix[0][3];<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>CubeNew[i][1]=Cube[i][0]*Matrix[1][0]+Cube[i][1]*Matrix[1][1]+Cube[i][2]*Matrix[1][2]+ Cube[i][3]*Matrix[1][3];<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>CubeNew[i][2]=Cube[i][0]*Matrix[2][0]+Cube[i][1]*Matrix[2][1]+Cube[i][2]*Matrix[2][2]+ Cube[i][3]*Matrix[2][3];<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>CubeNew[i][3]=Cube[i][0]*Matrix[3][0]+Cube[i][1]*Matrix[3][1]+Cube[i][2]*Matrix[3][2]+ Cube[i][3]*Matrix[3][3];<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US>}</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><o:p>&nbsp;</o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US>//</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">有了这些基本操作的函数，下面就需要进行实际的变换了，其实也十分的简单</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US>// </span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">平移矩阵</span><span lang=EN-US><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US>GLfloat Matrix_Transform[4][4]=<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US>{{1,0,0,-3},<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US>{0,1,0,3},<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US>{0,0,1,1},<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US>{0,0,0,1}};<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><o:p>&nbsp;</o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US>// </span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">缩放矩阵</span><span lang=EN-US><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US>GLfloat Matrix_Scale[4][4]=<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US>{{1,0,0,0},<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US>{0,2,0,0},<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US>{0,0,3,0},<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US>{0,0,0,1}};<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><o:p>&nbsp;</o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US>#define PI 3.1415926<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US>// </span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">旋转矩阵</span><span lang=EN-US><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US>GLfloat Matrix_Rotate[4][4]=<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US>{{1,0,0,0},<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US>{0,cos(PI/15),-sin(PI/15),0},<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US>{0,sin(PI/15),cos(PI/15),0},<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US>{0,0,0,1}};</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><o:p>&nbsp;</o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><o:p>&nbsp;</o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US>//</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在绘制部分，我们首先绘制地面</span><span lang=EN-US><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>glBegin(GL_POINTS);<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>DrawBackGround();<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>glEnd();</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US>//</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">然后通过一个循环绘制转换后的坐标</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US>for(int x=0;x&lt;24;x++){<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><span style="mso-tab-count: 4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>glVertex<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="4" UnitName="F">4f</st1:chmetcnv>(CubeNew[x][0],CubeNew[x][1],CubeNew[x][2],CubeNew[x][3]);<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><span style="mso-tab-count: 3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">本文用一种实践的思路，将原本晦涩的图形学基本理论展现给大家，本人才疏学浅，难免有错误之处，还请各位批评指正。</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><o:p>&nbsp;</o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">联系方式：</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US>MSN/E-Mail:Grace_X_1223@hotmail.com</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US>QQ:27806194(</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">加群</span><span lang=EN-US>CG</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">理论</span><span lang=EN-US>/</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">游戏开发（</span><span lang=EN-US>26078786</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">）一起讨论</span><span lang=EN-US>)<br><br><a title="Demo Download" href="/Files/clife/NeHeGL.rar">Demo Download</a></span></p>
<img src ="http://www.cnblogs.com/clife/aggbug/445201.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42116/" target="_blank">[新闻]消息称MySQL创始人已向Sun提交辞呈</a>]]></description></item><item><title> First Step:向量第一篇</title><link>http://www.cnblogs.com/clife/archive/2006/07/05/443353.html</link><dc:creator>爱唱歌的狗狗</dc:creator><author>爱唱歌的狗狗</author><pubDate>Wed, 05 Jul 2006 07:07:00 GMT</pubDate><guid>http://www.cnblogs.com/clife/archive/2006/07/05/443353.html</guid><wfw:comment>http://www.cnblogs.com/clife/comments/443353.html</wfw:comment><comments>http://www.cnblogs.com/clife/archive/2006/07/05/443353.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/clife/comments/commentRss/443353.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/clife/services/trackbacks/443353.html</trackback:ping><description><![CDATA[<span style="FONT-SIZE: 8pt">&nbsp;First Step:向量第一篇<br>(原&nbsp;&nbsp;&nbsp; 创：爱唱歌的狗狗）</span>
<p style="FONT-SIZE: 8pt; FONT-FAMILY: Arial">算不上是原创，在互联网的任何一个地方都能找到类似的资料，文字晦涩，也算不上什么教程，充其量是个参考罢。</p>
<p style="FONT-SIZE: 8pt; FONT-FAMILY: Arial">1．<span style="COLOR: red">&nbsp;命名规则</span><br>为了方便排版，标量我使用a,b,c这样的小写字母来表示，向量用a,b,c这样的加粗的小写字母来表示，矩阵使用大写字母A,B,C<br><br>2．&nbsp;<span style="COLOR: red">向量</span><br>所谓向量(Vertor)与标量相对，是可以表示方向和大小的量。<br>向量有一个维数的概念，一维，二维，三维，四维等等。而在CG中，我们通常只接触到二维和三维的空间。<br>例如：n维向量可以这么写，a=&lt; a1,a2,a3&#8230;an&gt;<br>现在我们得到了n维向量的表现形式，这样我们就可以进行进一步的讨论<br><br><span style="COLOR: red">零向量</span><br>我们知道，任何一个向量都有大小和方向这两个属性，但是存在着这样一个特殊的向量，零向量，它没有数量，没有方向，在坐标上，我们可以把它看作是一个点，但是这并不绝对，在数学上我们可以这样表示。<br>b=&lt;0,0,0&gt;<br><br><span style="COLOR: red">负向量</span><br>说到零向量，下面就要说到另外一种特殊的向量，负向量。<br>其实要得到一个负向量非常简单，只需要讲一个向量的每个分量求其相反数就可以了，在几何意义上讲，其实就是求一个向量与其位置相反的向量。<br>a=&lt;1,2,3&gt;<br>b=&lt;-1,-2,-3&gt;<br><br><span style="COLOR: red">向量的大小</span><br>向量的大小是向量的属性之一，一些书上也称为向量的模，求法如下<br>|v|=sqrt(v12+v22+v32)<br><br>&nbsp;<span style="COLOR: red">运算法则</span><br>向量之间的加减法就不再过多的叙述，因为比较简单，在任何一本高等数学的课本上都能够找到，也比较容易理解。<br>这里着重说一下乘法。<br><br>（1）<span style="COLOR: red">标量与向量的乘积</span><br>只要将标量与向量的每一个分量相乘，在3D图形学的应用中，就是将一个向量沿着原方向或者相反的方向扩大和缩小。也是一个非常有用的概念。<br><br>（2）<span style="COLOR: red">点积<br></span>我先给出公式，然后再讨论一下它的应用。<br>u&#183;v=ux&#183;vx+uy&#183;vy=|u|&#183;|v|&#183;cos(&#920;)<br>出现一个角度的cos形式，利用这个性质，我们可以判断两个向量之间的向成的角度：&#920;=arcos(u&#183;v/(|u|&#183;|v|))<br>由此我们可以看出:<br>向量的夹角&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; u&#183;v<br>90&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0<br>&lt;90&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &gt;0<br>&gt;90&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;0<br>因为篇幅原因，就先写到这里了。</p>
<p style="FONT-SIZE: 8pt; FONT-FAMILY: Arial">&nbsp;</p>
<img src ="http://www.cnblogs.com/clife/aggbug/443353.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42115/" target="_blank">[新闻]谷歌Chrome浏览器即将更换LOGO颜色？</a>]]></description></item></channel></rss>