﻿<?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>C++博客-GameFans-随笔分类-OpenGL</title><link>http://www.cppblog.com/cslover/category/19817.html</link><description /><language>zh-cn</language><lastBuildDate>Tue, 06 Nov 2012 12:24:24 GMT</lastBuildDate><pubDate>Tue, 06 Nov 2012 12:24:24 GMT</pubDate><ttl>60</ttl><item><title>坐标变换glRotatef和glTranslatef</title><link>http://www.cppblog.com/cslover/archive/2012/11/06/194715.html</link><dc:creator>cslover</dc:creator><author>cslover</author><pubDate>Tue, 06 Nov 2012 07:32:00 GMT</pubDate><guid>http://www.cppblog.com/cslover/archive/2012/11/06/194715.html</guid><wfw:comment>http://www.cppblog.com/cslover/comments/194715.html</wfw:comment><comments>http://www.cppblog.com/cslover/archive/2012/11/06/194715.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/cslover/comments/commentRss/194715.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cslover/services/trackbacks/194715.html</trackback:ping><description><![CDATA[<p style="text-align: left; line-height: 150%; margin: 8.35pt 0cm; mso-pagination: widow-orphan" class="MsoNormal" align="left"><strong><span style="line-height: 150%; font-family: Verdana; color: blue; font-size: 13.5pt; mso-bidi-font-family: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt" lang="EN-US">glLoadIdentity()</span></strong><span style="line-height: 150%; font-family: Verdana; color: #454545; font-size: 10pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US"><o:p></o:p></span></p>
<p style="text-align: left; line-height: 150%; margin: 8.35pt 0cm; mso-pagination: widow-orphan" class="MsoNormal" align="left"><span style="line-height: 150%; font-family: 宋体; color: #454545; font-size: 10pt; mso-bidi-font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-font-kerning: 0pt">将当前的用户坐标系的原点移到了屏幕中心：类似于一个复位操作</span><span style="line-height: 150%; font-family: Verdana; color: #454545; font-size: 10pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US"><br />1.X</span><span style="line-height: 150%; font-family: 宋体; color: #454545; font-size: 10pt; mso-bidi-font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-font-kerning: 0pt">坐标轴从左至右，</span><span style="line-height: 150%; font-family: Verdana; color: #454545; font-size: 10pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US">Y</span><span style="line-height: 150%; font-family: 宋体; color: #454545; font-size: 10pt; mso-bidi-font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-font-kerning: 0pt">坐标轴从下至上，</span><span style="line-height: 150%; font-family: Verdana; color: #454545; font-size: 10pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US">Z</span><span style="line-height: 150%; font-family: 宋体; color: #454545; font-size: 10pt; mso-bidi-font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-font-kerning: 0pt">坐标轴从里至外。</span><span style="line-height: 150%; font-family: Verdana; color: #454545; font-size: 10pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US"><br />2.OpenGL</span><span style="line-height: 150%; font-family: 宋体; color: #454545; font-size: 10pt; mso-bidi-font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-font-kerning: 0pt">屏幕中心的坐标值是</span><span style="line-height: 150%; font-family: Verdana; color: #454545; font-size: 10pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US">X</span><span style="line-height: 150%; font-family: 宋体; color: #454545; font-size: 10pt; mso-bidi-font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-font-kerning: 0pt">和</span><span style="line-height: 150%; font-family: Verdana; color: #454545; font-size: 10pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US">Y</span><span style="line-height: 150%; font-family: 宋体; color: #454545; font-size: 10pt; mso-bidi-font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-font-kerning: 0pt">轴上的</span><span style="line-height: 150%; font-family: Verdana; color: #454545; font-size: 10pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US">0.0f</span><span style="line-height: 150%; font-family: 宋体; color: #454545; font-size: 10pt; mso-bidi-font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-font-kerning: 0pt">点。</span><span style="line-height: 150%; font-family: Verdana; color: #454545; font-size: 10pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US"><br />3.</span><span style="line-height: 150%; font-family: 宋体; color: #454545; font-size: 10pt; mso-bidi-font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-font-kerning: 0pt">中心左面的坐标值是负值，右面是正值。</span><span style="line-height: 150%; font-family: Verdana; color: #454545; font-size: 10pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US"><br />&nbsp;&nbsp; </span><span style="line-height: 150%; font-family: 宋体; color: #454545; font-size: 10pt; mso-bidi-font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-font-kerning: 0pt">移向屏幕顶端是正值，移向屏幕底端是负值。</span><span style="line-height: 150%; font-family: Verdana; color: #454545; font-size: 10pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US"><br />&nbsp;&nbsp; </span><span style="line-height: 150%; font-family: 宋体; color: #454545; font-size: 10pt; mso-bidi-font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-font-kerning: 0pt">移入屏幕深处是负值，移出屏幕则是正值。</span><span style="line-height: 150%; font-family: Verdana; color: #454545; font-size: 10pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US"><o:p></o:p></span></p>
<p style="text-align: left; line-height: 150%; margin: 8.35pt 0cm; mso-pagination: widow-orphan" class="MsoNormal" align="left"><strong><span style="line-height: 150%; font-family: Verdana; color: blue; font-size: 13.5pt; mso-bidi-font-family: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt" lang="EN-US">glTranslatef(x, y, z)</span></strong><span style="line-height: 150%; font-family: Verdana; color: #454545; font-size: 10pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US"><o:p></o:p></span></p>
<p style="text-align: left; line-height: 150%; margin: 0cm 0cm 0pt; mso-pagination: widow-orphan" class="MsoNormal" align="left"><span style="line-height: 150%; font-family: 宋体; color: #454545; font-size: 10pt; mso-bidi-font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-font-kerning: 0pt">沿着</span><span style="line-height: 150%; font-family: Verdana; color: #454545; font-size: 10pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US"> X, Y </span><span style="line-height: 150%; font-family: 宋体; color: #454545; font-size: 10pt; mso-bidi-font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-font-kerning: 0pt">和</span><span style="line-height: 150%; font-family: Verdana; color: #454545; font-size: 10pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US"> Z </span><span style="line-height: 150%; font-family: 宋体; color: #454545; font-size: 10pt; mso-bidi-font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-font-kerning: 0pt">轴移动。</span><span style="line-height: 150%; font-family: Verdana; color: #454545; font-size: 10pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US"><o:p></o:p></span></p>
<p style="text-align: left; line-height: 150%; margin: 0cm 0cm 0pt; mso-pagination: widow-orphan" class="MsoNormal" align="left"><span style="line-height: 150%; font-family: 宋体; color: #454545; font-size: 10pt; mso-bidi-font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-font-kerning: 0pt">注意在</span><span style="line-height: 150%; font-family: Verdana; color: #454545; font-size: 10pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US">glTranslatef(x, y, z)</span><span style="line-height: 150%; font-family: 宋体; color: #454545; font-size: 10pt; mso-bidi-font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-font-kerning: 0pt">中</span><span style="line-height: 150%; font-family: Verdana; color: #454545; font-size: 10pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US">,</span><span style="line-height: 150%; font-family: 宋体; color: #454545; font-size: 10pt; mso-bidi-font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-font-kerning: 0pt">当您移动的时候，您并不是相对屏幕中心移动，而是相对与当前所在的屏幕位置。其作用就是将你绘点坐标的原点在当前原点的基础上平移一个</span><span style="line-height: 150%; font-family: Verdana; color: #454545; font-size: 10pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US">(x,y,z)</span><span style="line-height: 150%; font-family: 宋体; color: #454545; font-size: 10pt; mso-bidi-font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-font-kerning: 0pt">向量。</span><span style="line-height: 150%; font-family: Verdana; color: #454545; font-size: 10pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US"><o:p></o:p></span></p>
<p style="text-align: left; line-height: 150%; margin: 8.35pt 0cm; mso-pagination: widow-orphan" class="MsoNormal" align="left"><span style="line-height: 150%; font-family: Verdana; color: red; font-size: 10pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US">glLoadIdentity();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="line-height: 150%; font-family: Verdana; color: #454545; font-size: 10pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US"><o:p></o:p></span></p>
<p style="text-align: left; line-height: 150%; margin: 8.35pt 0cm; mso-pagination: widow-orphan" class="MsoNormal" align="left"><span style="line-height: 150%; font-family: Verdana; color: red; font-size: 10pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US">glTranslatef(-1.5f,0.0f,-6.0f);<br /></span><span style="line-height: 150%; font-family: Verdana; color: #454545; font-size: 10pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US">glBegin(GL_TRIANGLES);<br />glVertex3f(0.0f,0.0f, 0.0f);<br />glVertex3f(1.0f,0.0f, 0.0f);<br />glVertex3f(0.0f,1.0f, 0.0f);<br />glEnd();<o:p></o:p></span></p>
<p style="text-align: left; line-height: 150%; margin: 8.35pt 0cm; mso-pagination: widow-orphan" class="MsoNormal" align="left"><span style="line-height: 150%; font-family: 宋体; color: #454545; font-size: 10pt; mso-bidi-font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-font-kerning: 0pt">该三角形绘制的坐标系，实际上是以</span><span style="line-height: 150%; font-family: Verdana; color: #454545; font-size: 10pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US">(-1.5f,0.0f,-6.0f)</span><span style="line-height: 150%; font-family: 宋体; color: #454545; font-size: 10pt; mso-bidi-font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-font-kerning: 0pt">为原点的。</span><span style="line-height: 150%; font-family: Verdana; color: #454545; font-size: 10pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US"><o:p></o:p></span></p>
<p style="text-align: left; line-height: 150%; margin: 8.35pt 0cm; mso-pagination: widow-orphan" class="MsoNormal" align="left"><strong><span style="line-height: 150%; font-family: Verdana; color: blue; font-size: 13.5pt; mso-bidi-font-family: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt" lang="EN-US">glRotatef(angle, x, y, z)</span></strong><span style="line-height: 150%; font-family: Verdana; color: #454545; font-size: 10pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US"><br /></span><span style="line-height: 150%; font-family: 宋体; color: #454545; font-size: 10pt; mso-bidi-font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-font-kerning: 0pt">与</span><span style="line-height: 150%; font-family: Verdana; color: #454545; font-size: 10pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US">glTranslatef(x, y, z)</span><span style="line-height: 150%; font-family: 宋体; color: #454545; font-size: 10pt; mso-bidi-font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-font-kerning: 0pt">类似，</span><span style="line-height: 150%; font-family: Verdana; color: #454545; font-size: 10pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US">glRotatef(angle, x, y, z)</span><span style="line-height: 150%; font-family: 宋体; color: #454545; font-size: 10pt; mso-bidi-font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-font-kerning: 0pt">也是对坐标系进行操作。</span><span style="line-height: 150%; font-family: Verdana; color: #454545; font-size: 10pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US"><br /></span><span style="line-height: 150%; font-family: 宋体; color: #454545; font-size: 10pt; mso-bidi-font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-font-kerning: 0pt">旋转轴经过原点，方向为</span><span style="line-height: 150%; font-family: Verdana; color: #454545; font-size: 10pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US">(x,y,z),</span><span style="line-height: 150%; font-family: 宋体; color: #454545; font-size: 10pt; mso-bidi-font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-font-kerning: 0pt">旋转角度为</span><span style="line-height: 150%; font-family: Verdana; color: #454545; font-size: 10pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US">angle</span><span style="line-height: 150%; font-family: 宋体; color: #454545; font-size: 10pt; mso-bidi-font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-font-kerning: 0pt">，方向满足右手定则。</span><span style="line-height: 150%; font-family: Verdana; color: #454545; font-size: 10pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US"><br />glLoadIdentity();<br /></span><span style="line-height: 150%; font-family: Verdana; color: red; font-size: 10pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US">glRotatef(45,0.0f,0.0f,1.0f);<br /></span><span style="line-height: 150%; font-family: Verdana; color: #454545; font-size: 10pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US">glTranslatef(0.0f,0.0f,-6.0f);<br />glBegin(GL_TRIANGLES);<br />glVertex3f(0.0f,0.0f, 0.0f);<br />glVertex3f(1.0f,0.0f, 0.0f);<br />glVertex3f(0.0f,1.0f, 0.0f);<br />glEnd();<br /></span><span style="line-height: 150%; font-family: 宋体; color: #454545; font-size: 10pt; mso-bidi-font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-font-kerning: 0pt">绕</span><span style="line-height: 150%; font-family: Verdana; color: #454545; font-size: 10pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US">Z</span><span style="line-height: 150%; font-family: 宋体; color: #454545; font-size: 10pt; mso-bidi-font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-font-kerning: 0pt">轴正向旋转</span><span style="line-height: 150%; font-family: Verdana; color: #454545; font-size: 10pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US">45</span><span style="line-height: 150%; font-family: 宋体; color: #454545; font-size: 10pt; mso-bidi-font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-font-kerning: 0pt">度角，因为</span><span style="line-height: 150%; font-family: Verdana; color: #454545; font-size: 10pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US">Z</span><span style="line-height: 150%; font-family: 宋体; color: #454545; font-size: 10pt; mso-bidi-font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-font-kerning: 0pt">轴正方向由屏幕内指向屏幕外，由右手定则可知方向为逆时针转动。由于直角顶点即为原点，因此将围绕直角逆时针旋转。</span><span style="line-height: 150%; font-family: Verdana; color: #454545; font-size: 10pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US"><o:p></o:p></span></p>
<p style="text-align: left; margin: 0cm 0cm 0pt; mso-pagination: widow-orphan" class="MsoNormal" align="left"><span style="font-family: Verdana; color: #454545; font-size: 10pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p style="text-align: left; margin: 0cm 0cm 0pt; mso-pagination: widow-orphan" class="MsoNormal" align="left"><span style="font-family: 宋体; color: #454545; font-size: 10pt; mso-bidi-font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-font-kerning: 0pt">旋转和平移函数都存在的情况下，程序会如何执行呢？</span><span style="font-family: Verdana; color: #454545; font-size: 10pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US"><o:p></o:p></span></p>
<p style="text-align: left; margin: 0cm 0cm 0pt; mso-pagination: widow-orphan" class="MsoNormal" align="left"><span style="font-family: Verdana; color: #454545; font-size: 10pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US">//////////////////////////////////<o:p></o:p></span></p>
<p style="text-align: left; margin: 0cm 0cm 0pt; mso-pagination: widow-orphan" class="MsoNormal" align="left"><span style="font-family: Verdana; color: #454545; font-size: 10pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US">glLoadIdentity();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Reset The Current Modelview Matrix<br />&nbsp;glTranslatef(0.0f, 0.0f, -6.0f);<br />&nbsp;glBegin(GL_QUADS);<br />&nbsp;&nbsp;glVertex3f(-0.01f,-0.01f, 0.0f);<br />&nbsp;&nbsp;glVertex3f( 0.01f,-0.01f, 0.0f);<br />&nbsp;&nbsp;glVertex3f( 0.01f, 0.01f, 0.0f);<br />&nbsp;&nbsp;glVertex3f(-0.01f, 0.01f, 0.0f);<br />&nbsp;glEnd();<br />&nbsp;glLoadIdentity();<br />&nbsp;glRotatef(45.0f, 0.0f, 0.0f, 1.0f);<span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp; </span>//</span><span style="font-family: 宋体; color: #454545; font-size: 10pt; mso-bidi-font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-font-kerning: 0pt">旋转（局部坐标系的X,Z轴也跟着旋转了)</span><span style="font-family: Verdana; color: #454545; font-size: 10pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US"><br />&nbsp;glTranslatef(1.0f,0.0f,-6.0f);<span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>//</span><span style="font-family: 宋体; color: #454545; font-size: 10pt; mso-bidi-font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-font-kerning: 0pt">平移</span><span style="font-family: Verdana; color: #454545; font-size: 10pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US"><br />&nbsp;<br />&nbsp;glBegin(GL_TRIANGLES);<br />&nbsp;&nbsp;glVertex3f(0.0f,0.0f, 0.0f);<br />&nbsp;&nbsp;glVertex3f(1.0f,0.0f, 0.0f);<br />&nbsp;&nbsp;glVertex3f(0.0f,1.0f, 0.0f);<br />&nbsp;glEnd();<o:p></o:p></span></p>
<p style="text-align: left; margin: 0cm 0cm 0pt; mso-pagination: widow-orphan" class="MsoNormal" align="left"><span style="font-family: Verdana; color: #454545; font-size: 10pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US">/////////////////////////////////<br /><o:p></o:p></span></p>
<p style="text-align: left; margin: 0cm 0cm 0pt; mso-pagination: widow-orphan" class="MsoNormal" align="left"><span style="font-family: Verdana; color: #454545; font-size: 10pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" 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><o:p></o:p></span></p>
<p style="text-align: left; margin: 0cm 0cm 0pt; mso-pagination: widow-orphan" class="MsoNormal" align="left"><span style="font-family: 宋体; color: #454545; font-size: 10pt; mso-bidi-font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-font-kerning: 0pt">如果旋转和平移语句的顺序调换一下结果会怎么样呢？</span><span style="font-family: Verdana; color: #454545; font-size: 10pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US"><o:p></o:p></span></p>
<p style="text-align: left; text-indent: 5pt; margin: 0cm 0cm 0pt; mso-char-indent-count: .5; mso-pagination: widow-orphan" class="MsoNormal" align="left"><span style="font-family: Verdana; color: #454545; font-size: 10pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US">glLoadIdentity();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Reset The Current Modelview Matrix<br />&nbsp;glTranslatef(0.0f, 0.0f, -6.0f);<br />&nbsp;glBegin(GL_QUADS);<br />&nbsp;&nbsp;glVertex3f(-0.01f,-0.01f, 0.0f);<br />&nbsp;&nbsp;glVertex3f( 0.01f,-0.01f, 0.0f);<br />&nbsp;&nbsp;glVertex3f( 0.01f, 0.01f, 0.0f);<br />&nbsp;&nbsp;glVertex3f(-0.01f, 0.01f, 0.0f);<br />&nbsp;glEnd();<br />&nbsp;glLoadIdentity();<br />&nbsp;glTranslatef(1.0f,0.0f,-6.0f);<br />&nbsp;glRotatef(45.0f, 0.0f, 0.0f, 1.0f);<br />&nbsp;<br />&nbsp;glBegin(GL_TRIANGLES);<br />&nbsp;&nbsp;glVertex3f(0.0f,0.0f, 0.0f);<br />&nbsp;&nbsp;glVertex3f(1.0f,0.0f, 0.0f);<br />&nbsp;&nbsp;glVertex3f(0.0f,1.0f, 0.0f);<br />&nbsp;glEnd();<o:p></o:p></span></p>
<p style="text-align: left; margin: 0cm 0cm 0pt; mso-pagination: widow-orphan" class="MsoNormal" align="left"><span style="font-family: Verdana; color: #454545; font-size: 10pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US">//////////////////////////<o:p></o:p></span></p>
<p style="text-align: left; margin: 0cm 0cm 0pt; mso-pagination: widow-orphan" class="MsoNormal" align="left"><span style="font-family: Verdana; color: #454545; font-size: 10pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US"><o:p></o:p></span></p>
<p style="text-align: left; margin: 0cm 0cm 0pt; mso-pagination: widow-orphan" class="MsoNormal" align="left"><span style="font-family: 宋体; color: red; font-size: 10pt; mso-bidi-font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-font-kerning: 0pt">由这三个例子可知，所有对图形进行平移旋转等操作的语句的执行顺序都是从下到上执行的。</span><span style="font-family: Verdana; color: red; font-size: 10pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US"><o:p></o:p></span></p>
<p style="text-align: left; margin: 0cm 0cm 0pt; mso-pagination: widow-orphan" class="MsoNormal" align="left"><span style="font-family: Verdana; color: red; font-size: 10pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US">(</span><span style="font-family: 宋体; color: red; font-size: 10pt; mso-bidi-font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-font-kerning: 0pt">感觉是从上到下执行的，不清楚怎么回事，知道的给解释下</span><span style="font-family: Verdana; color: red; font-size: 10pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US">)</span><span style="font-family: Verdana; color: #454545; font-size: 10pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US"><o:p></o:p></span></p>
<p style="text-align: left; margin: 0cm 0cm 0pt; mso-pagination: widow-orphan" class="MsoNormal" align="left"><span style="font-family: 宋体; color: red; font-size: 10pt; mso-bidi-font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-font-kerning: 0pt">而且旋转语句的旋转中心知（</span><span style="font-family: Verdana; color: red; font-size: 10pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US">0.0f</span><span style="font-family: 宋体; color: red; font-size: 10pt; mso-bidi-font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-font-kerning: 0pt">，</span><span style="font-family: Verdana; color: red; font-size: 10pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US"> 0.0f, 0.0f</span><span style="font-family: 宋体; color: red; font-size: 10pt; mso-bidi-font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-font-kerning: 0pt">）这个点。</span><span style="font-family: Verdana; color: #454545; font-size: 10pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US"><o:p></o:p></span></p>
<p style="text-align: left; line-height: 150%; margin: 8.35pt 0cm; mso-pagination: widow-orphan" class="MsoNormal" align="left"><span style="line-height: 150%; font-family: Verdana; color: #454545; font-size: 10pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US">////////////////////////////////////////////////////////////////<br />glLoadIdentity();<br /></span><span style="line-height: 150%; font-family: Verdana; color: red; font-size: 10pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US">glRotatef(45,0.0f,0.0f,1.0f);<br />glLoadIdentity();<br /></span><span style="line-height: 150%; font-family: Verdana; color: #454545; font-size: 10pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US">glTranslatef(0.0f,0.0f,-6.0f);<br />glBegin(GL_TRIANGLES);<br />glVertex3f(0.0f,0.0f, 0.0f);<br />glVertex3f(1.0f,0.0f, 0.0f);<br />glVertex3f(0.0f,1.0f, 0.0f);<br />glEnd();<br /></span><span style="line-height: 150%; font-family: 宋体; color: #454545; font-size: 10pt; mso-bidi-font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-font-kerning: 0pt">在旋转之后加了一个复位的指令，图形就不会旋转了。<br />参考链接:<a href="http://www.cnblogs.com/yujunyong/archive/2011/04/17/2018776.html">http://www.cnblogs.com/yujunyong/archive/2011/04/17/2018776.html</a></span></p><img src ="http://www.cppblog.com/cslover/aggbug/194715.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cslover/" target="_blank">cslover</a> 2012-11-06 15:32 <a href="http://www.cppblog.com/cslover/archive/2012/11/06/194715.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ModelView矩阵含义及说明</title><link>http://www.cppblog.com/cslover/archive/2012/11/06/194713.html</link><dc:creator>cslover</dc:creator><author>cslover</author><pubDate>Tue, 06 Nov 2012 06:53:00 GMT</pubDate><guid>http://www.cppblog.com/cslover/archive/2012/11/06/194713.html</guid><wfw:comment>http://www.cppblog.com/cslover/comments/194713.html</wfw:comment><comments>http://www.cppblog.com/cslover/archive/2012/11/06/194713.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/cslover/comments/commentRss/194713.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cslover/services/trackbacks/194713.html</trackback:ping><description><![CDATA[<div id="cnblogs_post_body">在opengl中，视图和模型变换是在一个矩阵中进行控制的，这个矩阵就是GL_MODELVIEW_MATRIX,可以使用glGetFloatv函数来获取这个矩阵，而我们所要使用glTranslate*, glRotate*，glScale* 等操作均最后反映到这个矩阵的变化中，所以了解这个矩阵的构造对于灵活运用OpenGL比较重要。<br />变换矩阵在内存中的存放方式如下：<br /><pre>m[0] m[4] m[ 8] m[12]<br />
m[1] m[5] m[ 9] m[13]<br />
m[2] m[6] m[10] m[14]<br />
m[3] m[7] m[11] m[15]<br />
</pre>可<span style="color: #000000">以看出，</span><span style="color: #000000">Op</span><span style="color: #000000">en</span>GL是以列序来存放这个矩阵的，位于矩阵上方的3*3矩阵是旋转矩阵，可以用来控制刚体的旋转和尺度变化，如下： <pre>m[0] m[4] m[ 8] <br />
m[1] m[5] m[ 9]<br />
m[2] m[6] m[10]</pre>而右上角的3*1矩阵是用来控制刚体的平移的。就是m[12],m[13],m[14]这三个值，分别控制X，Y ，Z方向的平移。所有16个值组成一标准
<p style="margin: 0cm 0cm 0pt" class="MsoNormal"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><br />当我们使用</span><span lang="EN-US"><font face="Times New Roman">glGetFloatv(GL_TRANSPOSE_MODELVIEW_MATRIX, &amp;mat),</font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">才与上述规则相一致</span><span lang="EN-US"><font face="Times New Roman">.</font></span></p>
<p style="margin: 0cm 0cm 0pt" class="MsoNormal"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在</span><span lang="EN-US"><font face="Times New Roman">DirectX</font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中</span><span lang="EN-US"><font face="Times New Roman">D3DXMatrixLookAtLH</font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">建立出的</span><span lang="EN-US"><font face="Times New Roman">ViewMatrix</font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">为</span><span lang="EN-US"><font face="Times New Roman">(R, U, N),</font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">这里的</span><span lang="EN-US"><font face="Times New Roman">R,U,N</font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是列向量</span><span lang="EN-US"><font face="Times New Roman">,</font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">即</span><span lang="EN-US"><font face="Times New Roman">ViewMatrix</font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的第一列是</span><span lang="EN-US"><font face="Times New Roman">R,</font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">第二列是</span><span lang="EN-US"><font face="Times New Roman">U,</font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">第三列是</span><span lang="EN-US"><font face="Times New Roman">N.</font></span></p>
<p style="margin: 0cm 0cm 0pt" class="MsoNormal"><span lang="EN-US"><font face="Times New Roman">DirectX</font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">没有令人误导的列存储方式</span><span lang="EN-US"><font face="Times New Roman">,</font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">生成的</span><span lang="EN-US"><font face="Times New Roman">ViewMatrix</font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">确实符合这个数学标准</span><span lang="EN-US"><font face="Times New Roman">.</font></span></p>
<p style="margin: 0cm 0cm 0pt" class="MsoNormal"><span lang="EN-US"><o:p><font face="Times New Roman">&nbsp;</font></o:p></span></p>
<p style="margin: 0cm 0cm 0pt" class="MsoNormal"><span lang="EN-US"><font face="Times New Roman">OpenGL</font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中能直接取到的是</span><span lang="EN-US"><font face="Times New Roman">ModelViewMatrix,</font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">此矩阵将模型坐标从模型坐标系转换到镜头坐标系</span><span lang="EN-US"><font face="Times New Roman">,ModelViewMatrix</font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的逆矩阵可以将镜头坐标系下的坐标转换到模型坐标系</span><span lang="EN-US"><font face="Times New Roman">.</font></span></p>
<p style="margin: 0cm 0cm 0pt" class="MsoNormal"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">一个典型的应用是</span><span lang="EN-US"><font face="Times New Roman">:</font></span></p>
<p style="margin: 0cm 0cm 0pt" class="MsoNormal"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">已知在镜头坐标系下</span><span lang="EN-US"><font face="Times New Roman">,</font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">镜头所在</span><span lang="EN-US"><font face="Times New Roman">(0, 0, 0)</font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">点</span><span lang="EN-US"><font face="Times New Roman">,</font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">则使用上述逆矩阵推算出镜头在模型坐标下的位置</span><span lang="EN-US"><font face="Times New Roman">.</font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">注意要想推算镜头在世界坐标系下的位置</span><span lang="EN-US"><font face="Times New Roman">,</font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">需要使用</span><span lang="EN-US"><font face="Times New Roman">ViewMatrix</font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的逆矩阵</span><span lang="EN-US"><font face="Times New Roman">.</font></span></p>
<p style="margin: 0cm 0cm 0pt" class="MsoNormal"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">如果</span><span lang="EN-US"><font face="Times New Roman">ModelMatrix</font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">为标准矩阵</span><span lang="EN-US"><font face="Times New Roman">,</font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">则模型坐标系和世界坐标系重合</span><span lang="EN-US"><font face="Times New Roman">,ModelViewMatrix</font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">矩阵是纯粹的</span><span lang="EN-US"><font face="Times New Roman">ViewMatrix.</font></span></p>
<p style="margin: 0cm 0cm 0pt" class="MsoNormal"><span lang="EN-US"><o:p><font face="Times New Roman">&nbsp;</font></o:p></span></p>
<p style="margin: 0cm 0cm 0pt" class="MsoNormal"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">定理</span><span lang="EN-US"><font face="Times New Roman">:</font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">若有一个以当前坐标系为数值参考</span><span lang="EN-US"><font face="Times New Roman">,</font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">而定义的基</span><span lang="EN-US"><font face="Times New Roman">(</font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">以标准数学形式给出</span><span lang="EN-US"><font face="Times New Roman">)</font></span></p>
<p style="margin: 0cm 0cm 0pt" class="MsoNormal"><span lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>R</font></span></p>
<p style="margin: 0cm 0cm 0pt" class="MsoNormal"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">则</span><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp; </span>(U ) </font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">（</span><span lang="EN-US"><font face="Times New Roman">R,U,N</font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">为行向量</span><span lang="EN-US"><font face="Times New Roman">)</font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">矩阵将当前坐标系的点的坐标数值转换到新基的坐标系下的</span></p>
<p style="margin: 0cm 0cm 0pt" class="MsoNormal"><span lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>N<span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">点的数值</span>的齐次矩阵。<br />参考链接：<a href="http://www.cnblogs.com/txwd0033/archive/2009/09/25/1574087.html">http://www.cnblogs.com/txwd0033/archive/2009/09/25/1574087.html</a><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="http://www.cnitblog.com/linghuye/archive/2007/04/29/26402.html">http://www.cnitblog.com/linghuye/archive/2007/04/29/26402.html</a><br /></p></div><img src ="http://www.cppblog.com/cslover/aggbug/194713.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cslover/" target="_blank">cslover</a> 2012-11-06 14:53 <a href="http://www.cppblog.com/cslover/archive/2012/11/06/194713.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>