﻿<?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++博客-孔雀开发小屋-随笔分类-Graphics</title><link>http://www.cppblog.com/kongque/category/14627.html</link><description>专注并致力于手机客户端开发</description><language>zh-cn</language><lastBuildDate>Sun, 06 Nov 2011 11:48:41 GMT</lastBuildDate><pubDate>Sun, 06 Nov 2011 11:48:41 GMT</pubDate><ttl>60</ttl><item><title>linux下批量命名和批量处理图片的例子</title><link>http://www.cppblog.com/kongque/archive/2011/11/06/159706.html</link><dc:creator>孔雀</dc:creator><author>孔雀</author><pubDate>Sun, 06 Nov 2011 04:46:00 GMT</pubDate><guid>http://www.cppblog.com/kongque/archive/2011/11/06/159706.html</guid><wfw:comment>http://www.cppblog.com/kongque/comments/159706.html</wfw:comment><comments>http://www.cppblog.com/kongque/archive/2011/11/06/159706.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/kongque/comments/commentRss/159706.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/kongque/services/trackbacks/159706.html</trackback:ping><description><![CDATA[今天碰到一个简单的需求，有一批png图像文件，图像名字均为xxx@2x.png，其中xxx是可变部分。现在需要将所有xxx@2x.png图像改名为xxx.png，且尺寸变为原来的50%。这就涉及到两个问题，第一：批量改名，第二：批量处理文件。<br /><br />解决如下：<br />1）批量改名：for var in *.png; do mv "$var" "${var%@2x.png}.png"; done<br /><br />2）批量修改图像：for png in *.png; do convert $png -resize 50% $png<br /><br />其中的批量修改图像中使用到了一个convert命令，这个命令是命令行图像处理工具ImageMagick的一个子命令。关于ImageMagick我<a href="http://www.cppblog.com/kongque/archive/2011/02/14/140040.html">之前的随笔</a>中也有提到，感兴趣的童鞋可以参考一下。<img src ="http://www.cppblog.com/kongque/aggbug/159706.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/kongque/" target="_blank">孔雀</a> 2011-11-06 12:46 <a href="http://www.cppblog.com/kongque/archive/2011/11/06/159706.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>OpenCV使用经验总结</title><link>http://www.cppblog.com/kongque/archive/2011/07/14/150993.html</link><dc:creator>孔雀</dc:creator><author>孔雀</author><pubDate>Thu, 14 Jul 2011 09:01:00 GMT</pubDate><guid>http://www.cppblog.com/kongque/archive/2011/07/14/150993.html</guid><wfw:comment>http://www.cppblog.com/kongque/comments/150993.html</wfw:comment><comments>http://www.cppblog.com/kongque/archive/2011/07/14/150993.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/kongque/comments/commentRss/150993.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/kongque/services/trackbacks/150993.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Opencv使用过程中总结的一些经验&nbsp;&nbsp;<a href='http://www.cppblog.com/kongque/archive/2011/07/14/150993.html'>阅读全文</a><img src ="http://www.cppblog.com/kongque/aggbug/150993.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/kongque/" target="_blank">孔雀</a> 2011-07-14 17:01 <a href="http://www.cppblog.com/kongque/archive/2011/07/14/150993.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于全景图像的拼接</title><link>http://www.cppblog.com/kongque/archive/2011/06/23/149314.html</link><dc:creator>孔雀</dc:creator><author>孔雀</author><pubDate>Thu, 23 Jun 2011 09:13:00 GMT</pubDate><guid>http://www.cppblog.com/kongque/archive/2011/06/23/149314.html</guid><wfw:comment>http://www.cppblog.com/kongque/comments/149314.html</wfw:comment><comments>http://www.cppblog.com/kongque/archive/2011/06/23/149314.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/kongque/comments/commentRss/149314.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/kongque/services/trackbacks/149314.html</trackback:ping><description><![CDATA[<div>这段时间一直在做全景图像拼接，略有小成。总结一下：<br /><br />图像拼接概括起来说，分两大步骤。第一步，配准。第二步，融合。<br /><br />配准有基于模板匹配的，有基于特征点匹配的。现在的主流是基于特征点匹配的，SIFT是热点。<br /><br />融合的方法有很多，有最简单的线性过渡，有经典的拉普拉斯金字塔融合（多波段融合），有基于小波变换的融合，还有比较新而且效果很赞的泊松图像编辑融合，可惜泊松图像编辑的这个方法我还没有实现出来，只是实现了基于拉普拉斯金字塔的融合，效果挺不错。<br /><br />以下三篇论文是权威和经典，如果有能力消化并实现，那么一个完整的全景拼接系统就有了。<br />1) Construction of panoramic mosaics with global and local alignment. <br />&nbsp;&nbsp; Heung-Yeung Shum and Richard Szeliski. 2000.<br />2) Eliminating Ghosting and Exposure Artifacts in Image Mosaics. <br />&nbsp;&nbsp; Matthew Uyttendaele, Ashley Eden and Richard Szeliski. 2001.<br />3) Automatic Panoramic Image Stitching using Invariant Features. <br />&nbsp;&nbsp; Matthew Brown and David G. Lowe. 2007.<br /><br />ps: 上面论文作者其中的Richard Szeliski是计算机视觉界的翘楚，在微软研究院工作，最近出了新书《Computer Vision: Algorithm and Applications》英文版，200多美刀。不过该大牛在他的个人网站上放了书稿，pdf格式，绝对值得下载。</div><img src ="http://www.cppblog.com/kongque/aggbug/149314.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/kongque/" target="_blank">孔雀</a> 2011-06-23 17:13 <a href="http://www.cppblog.com/kongque/archive/2011/06/23/149314.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>数字图像处理：Sobel算子</title><link>http://www.cppblog.com/kongque/archive/2011/05/28/147529.html</link><dc:creator>孔雀</dc:creator><author>孔雀</author><pubDate>Sat, 28 May 2011 13:32:00 GMT</pubDate><guid>http://www.cppblog.com/kongque/archive/2011/05/28/147529.html</guid><wfw:comment>http://www.cppblog.com/kongque/comments/147529.html</wfw:comment><comments>http://www.cppblog.com/kongque/archive/2011/05/28/147529.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/kongque/comments/commentRss/147529.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/kongque/services/trackbacks/147529.html</trackback:ping><description><![CDATA[Sobel算子主要用来做图像边缘检测。在OpenCV中有现成的接口可以调用，即:cvSobel。<br /><br />今天遇到一个问题是需要一个类似Sobel算子的功能，因为Sobel算子没有考虑到像素点周围的相似性，现在需要考虑这个问题。所以需要的算子的元素与Sobel算子不同。于是自己动手写了sobel算子的实现，这样对于不同的参数修改算子的元素值即可。代码如下：<br /><br /><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;MySobel(IplImage</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;gray,&nbsp;IplImage</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;gradient)<br /></span><span style="color: #008080; ">&nbsp;2</span>&nbsp;<span style="color: #000000; ">{<br /></span><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;Sobel&nbsp;template<br /></span><span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;a00&nbsp;a01&nbsp;a02<br /></span><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;a10&nbsp;a11&nbsp;a12<br /></span><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;a20&nbsp;a21&nbsp;a22<br /></span><span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;8</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;9</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">&nbsp;a00,&nbsp;a01,&nbsp;a02,&nbsp;a20,&nbsp;a21,&nbsp;a22;<br /></span><span style="color: #008080; ">10</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp; unsigned&nbsp;</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">&nbsp;a10,&nbsp;a11,&nbsp;a12;<br /></span><span style="color: #008080; ">11</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">12</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;i</span><span style="color: #000000; ">=</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;&nbsp;i</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">gray</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">height</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;&nbsp;</span><span style="color: #000000; ">++</span><span style="color: #000000; ">i)<br /></span><span style="color: #008080; ">13</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;{<br /></span><span style="color: #008080; ">14</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;j</span><span style="color: #000000; ">=</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;&nbsp;j</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">gray</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">width</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;&nbsp;</span><span style="color: #000000; ">++</span><span style="color: #000000; ">j)<br /></span><span style="color: #008080; ">15</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /></span><span style="color: #008080; ">16</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CvScalar&nbsp;color&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;cvGet2D(gray,&nbsp;i,&nbsp;j);<br /></span><span style="color: #008080; ">17</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /></span><span style="color: #008080; ">18</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a00&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;cvGet2D(gray,&nbsp;i</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,&nbsp;j</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">).val[</span><span style="color: #000000; ">0</span><span style="color: #000000; ">];<br /></span><span style="color: #008080; ">19</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a01&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;cvGet2D(gray,&nbsp;i</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,&nbsp;j).val[</span><span style="color: #000000; ">0</span><span style="color: #000000; ">];<br /></span><span style="color: #008080; ">20</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a02&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;cvGet2D(gray,&nbsp;i</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,&nbsp;j</span><span style="color: #000000; ">+</span><span style="color: #000000; ">1</span><span style="color: #000000; ">).val[</span><span style="color: #000000; ">0</span><span style="color: #000000; ">];<br /></span><span style="color: #008080; ">21</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">22</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a10&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;cvGet2D(gray,&nbsp;i,&nbsp;j</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">).val[</span><span style="color: #000000; ">0</span><span style="color: #000000; ">];<br /></span><span style="color: #008080; ">23</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a11&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;cvGet2D(gray,&nbsp;i,&nbsp;j).val[</span><span style="color: #000000; ">0</span><span style="color: #000000; ">];<br /></span><span style="color: #008080; ">24</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a12&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;cvGet2D(gray,&nbsp;i,&nbsp;j</span><span style="color: #000000; ">+</span><span style="color: #000000; ">1</span><span style="color: #000000; ">).val[</span><span style="color: #000000; ">0</span><span style="color: #000000; ">];<br /></span><span style="color: #008080; ">25</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">26</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a20&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;cvGet2D(gray,&nbsp;i</span><span style="color: #000000; ">+</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,&nbsp;j</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">).val[</span><span style="color: #000000; ">0</span><span style="color: #000000; ">];<br /></span><span style="color: #008080; ">27</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a21&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;cvGet2D(gray,&nbsp;i</span><span style="color: #000000; ">+</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,&nbsp;j).val[</span><span style="color: #000000; ">0</span><span style="color: #000000; ">];<br /></span><span style="color: #008080; ">28</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a22&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;cvGet2D(gray,&nbsp;i</span><span style="color: #000000; ">+</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,&nbsp;j</span><span style="color: #000000; ">+</span><span style="color: #000000; ">1</span><span style="color: #000000; ">).val[</span><span style="color: #000000; ">0</span><span style="color: #000000; ">];<br /></span><span style="color: #008080; ">29</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /></span><span style="color: #008080; ">30</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;x方向上的近似导数</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">31</span>&nbsp;<span style="color: #008000; "></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">double</span><span style="color: #000000; ">&nbsp;ux&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;a20&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #000000; ">1</span><span style="color: #000000; ">)&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;a21&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #000000; ">2</span><span style="color: #000000; ">)&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;a22&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #000000; ">1</span><span style="color: #000000; ">)&nbsp;<br /></span><span style="color: #008080; ">32</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;(a00&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">)&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;a01&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #000000; ">-</span><span style="color: #000000; ">2</span><span style="color: #000000; ">)&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;a02&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">));<br /></span><span style="color: #008080; ">33</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">34</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;y方向上的近似导数</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">35</span>&nbsp;<span style="color: #008000; "></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">double</span><span style="color: #000000; ">&nbsp;uy&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;a02&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #000000; ">1</span><span style="color: #000000; ">)&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;a12&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #000000; ">2</span><span style="color: #000000; ">)&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;a22&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #000000; ">1</span><span style="color: #000000; ">)<br /></span><span style="color: #008080; ">36</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;a00&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">)&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;a10&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #000000; ">-</span><span style="color: #000000; ">2</span><span style="color: #000000; ">)&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;a20&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">);<br /></span><span style="color: #008080; ">37</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">38</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;color.val[</span><span style="color: #000000; ">0</span><span style="color: #000000; ">]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;ux;<br /></span><span style="color: #008080; ">39</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">40</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cvSet2D(gradient,&nbsp;i,&nbsp;j,&nbsp;color);<br /></span><span style="color: #008080; ">41</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080; ">42</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080; ">43</span>&nbsp;<span style="color: #000000; ">}</span></div><br />上面代码中访问图像的像素使用了OpenCV的接口，这个不如直接使用指针的效率高，可以修改。<br /><img src ="http://www.cppblog.com/kongque/aggbug/147529.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/kongque/" target="_blank">孔雀</a> 2011-05-28 21:32 <a href="http://www.cppblog.com/kongque/archive/2011/05/28/147529.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>OpenCV中二维点求取进行透视变换之后的坐标点方法</title><link>http://www.cppblog.com/kongque/archive/2011/05/24/147014.html</link><dc:creator>孔雀</dc:creator><author>孔雀</author><pubDate>Tue, 24 May 2011 02:46:00 GMT</pubDate><guid>http://www.cppblog.com/kongque/archive/2011/05/24/147014.html</guid><wfw:comment>http://www.cppblog.com/kongque/comments/147014.html</wfw:comment><comments>http://www.cppblog.com/kongque/archive/2011/05/24/147014.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/kongque/comments/commentRss/147014.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/kongque/services/trackbacks/147014.html</trackback:ping><description><![CDATA[我使用的是OpenCV 2.2版本。得到了一个透视矩阵，想把屏幕上的一个二维点经过这个透视矩阵进行变换，本身很简单的一个事情，却颇费了一番周折。原因是刚接触OpenCV，而且使用了OpenCV新添加的C++部分的矩阵类Mat，使用起来还真有点不顺手，因为OpenCV中没有向量的说法。一个矩阵变换一个向量就让我找了半天。<br /><br />最终得以解决，还是使用了CvMat类而不是Mat类。代码如下：<br /><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">1</span>&nbsp;<span style="color: #000000; ">CvPoint&nbsp;transformPoint(</span><span style="color: #0000FF; ">const</span><span style="color: #000000; ">&nbsp;CvPoint&nbsp;pointToTransform,&nbsp;</span><span style="color: #0000FF; ">const</span><span style="color: #000000; ">&nbsp;CvMat</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;matrix)&nbsp;<br /></span><span style="color: #008080; ">2</span>&nbsp;<span style="color: #000000; ">{<br /></span><span style="color: #008080; ">3</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">double</span><span style="color: #000000; ">&nbsp;coordinates[</span><span style="color: #000000; ">3</span><span style="color: #000000; ">]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;{pointToTransform.x,&nbsp;pointToTransform.y,&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">};<br /></span><span style="color: #008080; ">4</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;CvMat&nbsp;originVector&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;cvMat(</span><span style="color: #000000; ">3</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,&nbsp;CV_64F,&nbsp;coordinates);<br /></span><span style="color: #008080; ">5</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;CvMat&nbsp;transformedVector&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;cvMat(</span><span style="color: #000000; ">3</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,&nbsp;CV_64F,&nbsp;coordinates);<br /></span><span style="color: #008080; ">6</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;cvMatMul(matrix,&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">originVector,&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">transformedVector);<br /></span><span style="color: #008080; ">7</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;CvPoint&nbsp;outputPoint&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;cvPoint((</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">)(cvmGet(</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">transformedVector,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">)&nbsp;</span><span style="color: #000000; ">/</span><span style="color: #000000; ">&nbsp;cvmGet(</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">transformedVector,&nbsp;</span><span style="color: #000000; ">2</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">)),&nbsp;(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">)(cvmGet(</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">transformedVector,&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">)&nbsp;</span><span style="color: #000000; ">/</span><span style="color: #000000; ">&nbsp;cvmGet(</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">transformedVector,&nbsp;</span><span style="color: #000000; ">2</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">)));<br /></span><span style="color: #008080; ">8</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;outputPoint;<br /></span><span style="color: #008080; ">9</span>&nbsp;<span style="color: #000000; ">}</span></div><br />这个函数一个很有用的地方就在于，原本二维图上的一个像素点位于(x,y)处，经过一个变换（仿射变换、透视变换）之后，求取它的新的坐标点(x', y')。<img src ="http://www.cppblog.com/kongque/aggbug/147014.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/kongque/" target="_blank">孔雀</a> 2011-05-24 10:46 <a href="http://www.cppblog.com/kongque/archive/2011/05/24/147014.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于OpenGL ES中的纹理压缩</title><link>http://www.cppblog.com/kongque/archive/2011/03/31/143062.html</link><dc:creator>孔雀</dc:creator><author>孔雀</author><pubDate>Wed, 30 Mar 2011 16:38:00 GMT</pubDate><guid>http://www.cppblog.com/kongque/archive/2011/03/31/143062.html</guid><wfw:comment>http://www.cppblog.com/kongque/comments/143062.html</wfw:comment><comments>http://www.cppblog.com/kongque/archive/2011/03/31/143062.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/kongque/comments/commentRss/143062.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/kongque/services/trackbacks/143062.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 基于OpenGL ES的压缩纹理有常见的如下几种实现：<br>1. ETC1（Ericcson texture compression)<br>2. PVRTC(PowerVR texture compression)<br>3. ATITC(ATI texture compression)<br>对于集成了NVIDIA Tegra2的手机如Motorola XOOM，ATRIX和DRIOID BIONIC则支持如下的纹理压缩<br>4. S3TC(S3 texture compression)&nbsp;&nbsp;<a href='http://www.cppblog.com/kongque/archive/2011/03/31/143062.html'>阅读全文</a><img src ="http://www.cppblog.com/kongque/aggbug/143062.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/kongque/" target="_blank">孔雀</a> 2011-03-31 00:38 <a href="http://www.cppblog.com/kongque/archive/2011/03/31/143062.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Linux下编译Irrlicht注意事项</title><link>http://www.cppblog.com/kongque/archive/2011/01/29/139559.html</link><dc:creator>孔雀</dc:creator><author>孔雀</author><pubDate>Fri, 28 Jan 2011 16:25:00 GMT</pubDate><guid>http://www.cppblog.com/kongque/archive/2011/01/29/139559.html</guid><wfw:comment>http://www.cppblog.com/kongque/comments/139559.html</wfw:comment><comments>http://www.cppblog.com/kongque/archive/2011/01/29/139559.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cppblog.com/kongque/comments/commentRss/139559.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/kongque/services/trackbacks/139559.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Linux环境下编译Irrlicht引擎的注意事项&nbsp;&nbsp;<a href='http://www.cppblog.com/kongque/archive/2011/01/29/139559.html'>阅读全文</a><img src ="http://www.cppblog.com/kongque/aggbug/139559.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/kongque/" target="_blank">孔雀</a> 2011-01-29 00:25 <a href="http://www.cppblog.com/kongque/archive/2011/01/29/139559.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Linux上运行Milkshape</title><link>http://www.cppblog.com/kongque/archive/2010/12/22/137200.html</link><dc:creator>孔雀</dc:creator><author>孔雀</author><pubDate>Wed, 22 Dec 2010 09:00:00 GMT</pubDate><guid>http://www.cppblog.com/kongque/archive/2010/12/22/137200.html</guid><wfw:comment>http://www.cppblog.com/kongque/comments/137200.html</wfw:comment><comments>http://www.cppblog.com/kongque/archive/2010/12/22/137200.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/kongque/comments/commentRss/137200.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/kongque/services/trackbacks/137200.html</trackback:ping><description><![CDATA[
<meta http-equiv="CONTENT-TYPE" content="text/html; charset=utf-8">
	<title></title>
	<meta name="GENERATOR" content="OpenOffice.org 3.2  (Linux)">
	<style type="text/css">
	<!--
		@page { margin: 2cm }
		P { margin-bottom: 0.21cm }
	-->
	</style>


<p style="margin-bottom: 0cm; border: none; padding: 0cm; widows: 2; orphans: 2">
<font color="#000000"><span style="background: #ffffff"><font face="AR PL UKai CN"><span style="font-style: normal"><span style="font-weight: normal">环境：</span></span></font><font face="DejaVu Serif, serif"><font face="AR PL UKai CN"><span style="font-style: normal"><span style="font-weight: normal">Ubuntu
10.04 + MilkShape 1.8.4 + Wine 1.2</span></span></font></font></span></font></p><p style="margin-bottom: 0cm; border: none; padding: 0cm; widows: 2; orphans: 2">方法：</p><p style="margin-bottom: 0cm; border: none; padding: 0cm; widows: 2; orphans: 2">&nbsp;&nbsp; &nbsp; 1）在dll-files.com上下载msvcirt.dll, 注意是msvcirt.dll而不是msvcrt.dll.</p><p style="margin-bottom: 0cm; border: none; padding: 0cm; widows: 2; orphans: 2">&nbsp;&nbsp; &nbsp; 2）在dlldump.com上下载mfc42.dll</p><p style="margin-bottom: 0cm; border: none; padding: 0cm; widows: 2; orphans: 2">&nbsp;&nbsp; &nbsp; 3) 将上述两个dll拷贝到system32目录下和Milkshape的安装目录下（ms3d.exe所在的目录）</p><p style="margin-bottom: 0cm; border: none; padding: 0cm; widows: 2; orphans: 2">&nbsp;&nbsp; &nbsp; 4）使用wine运行之</p><p style="margin-bottom: 0cm; border: none; padding: 0cm; widows: 2; orphans: 2"><br></p><img src ="http://www.cppblog.com/kongque/aggbug/137200.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/kongque/" target="_blank">孔雀</a> 2010-12-22 17:00 <a href="http://www.cppblog.com/kongque/archive/2010/12/22/137200.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>call to OpenGL ES API with no current context 错误及解决方案</title><link>http://www.cppblog.com/kongque/archive/2010/12/14/136415.html</link><dc:creator>孔雀</dc:creator><author>孔雀</author><pubDate>Tue, 14 Dec 2010 13:56:00 GMT</pubDate><guid>http://www.cppblog.com/kongque/archive/2010/12/14/136415.html</guid><wfw:comment>http://www.cppblog.com/kongque/comments/136415.html</wfw:comment><comments>http://www.cppblog.com/kongque/archive/2010/12/14/136415.html#Feedback</comments><slash:comments>9</slash:comments><wfw:commentRss>http://www.cppblog.com/kongque/comments/commentRss/136415.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/kongque/services/trackbacks/136415.html</trackback:ping><description><![CDATA[<meta http-equiv="CONTENT-TYPE" content="text/html; charset=utf-8">
	<title></title>
	<meta name="GENERATOR" content="OpenOffice.org 3.2  (Linux)">
	<style type="text/css">
	<!--
		@page { margin: 2cm }
		P { margin-bottom: 0.21cm }
	-->
	</style>


<ol><p style="margin-bottom: 0cm">错误： <font face="DejaVu Serif, serif">call
	to OpenGL ES API with no current context</font></p><p style="margin-bottom: 0cm"><font face="DejaVu Serif, serif"></font>可能的原因：<font face="DejaVu Serif, serif">OGL
	ES</font>所在的线程被阻塞或者被挂起，导致渲染设备上下文丢失。</p><p style="margin-bottom: 0cm">解决方案：将可能导致渲染线程被阻塞或被挂起的代码移动到别处。比如在渲染循环之前执行或之后执行。</p></ol>
<img src ="http://www.cppblog.com/kongque/aggbug/136415.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/kongque/" target="_blank">孔雀</a> 2010-12-14 21:56 <a href="http://www.cppblog.com/kongque/archive/2010/12/14/136415.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>3D游戏引擎Irrlicht浅谈（二）</title><link>http://www.cppblog.com/kongque/archive/2010/11/11/133307.html</link><dc:creator>孔雀</dc:creator><author>孔雀</author><pubDate>Thu, 11 Nov 2010 06:25:00 GMT</pubDate><guid>http://www.cppblog.com/kongque/archive/2010/11/11/133307.html</guid><wfw:comment>http://www.cppblog.com/kongque/comments/133307.html</wfw:comment><comments>http://www.cppblog.com/kongque/archive/2010/11/11/133307.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.cppblog.com/kongque/comments/commentRss/133307.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/kongque/services/trackbacks/133307.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Irrlicht如何做到跨平台？<br><br>Irrlicht中的两个抽象接口，IrrlichtDevice和IVideoDriver分别将设备与驱动抽象出来。对于不同的设备（比如Android手机或iPhone手机）只需要实现这两个接口，那么Irrlicht就基本可以被你所用了，因为引擎的其他部分大部分都是平台无关的，涉及到的平台相关的部分根据需要做调整就可以了。<br>&nbsp;&nbsp;<a href='http://www.cppblog.com/kongque/archive/2010/11/11/133307.html'>阅读全文</a><img src ="http://www.cppblog.com/kongque/aggbug/133307.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/kongque/" target="_blank">孔雀</a> 2010-11-11 14:25 <a href="http://www.cppblog.com/kongque/archive/2010/11/11/133307.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>OpenGL学习的两个利器</title><link>http://www.cppblog.com/kongque/archive/2010/10/04/128584.html</link><dc:creator>孔雀</dc:creator><author>孔雀</author><pubDate>Mon, 04 Oct 2010 10:12:00 GMT</pubDate><guid>http://www.cppblog.com/kongque/archive/2010/10/04/128584.html</guid><wfw:comment>http://www.cppblog.com/kongque/comments/128584.html</wfw:comment><comments>http://www.cppblog.com/kongque/archive/2010/10/04/128584.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cppblog.com/kongque/comments/commentRss/128584.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/kongque/services/trackbacks/128584.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 对于OpenGL的初学者来说，有两个不应该成为困难点的困难点。一个是编写OpenGL程序需要依赖特定平台的窗体系统。另外一个是OpenGL的扩展机制需要我们自己去处理。<br><br><br>这里推荐两个利器来解决这两个问题。让我们可以更加专注和有效的学习OpenGL。分别是GLUT和GLEW&nbsp;&nbsp;<a href='http://www.cppblog.com/kongque/archive/2010/10/04/128584.html'>阅读全文</a><img src ="http://www.cppblog.com/kongque/aggbug/128584.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/kongque/" target="_blank">孔雀</a> 2010-10-04 18:12 <a href="http://www.cppblog.com/kongque/archive/2010/10/04/128584.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>OpenGL中FBO的概念及其应用</title><link>http://www.cppblog.com/kongque/archive/2010/08/26/124754.html</link><dc:creator>孔雀</dc:creator><author>孔雀</author><pubDate>Wed, 25 Aug 2010 20:33:00 GMT</pubDate><guid>http://www.cppblog.com/kongque/archive/2010/08/26/124754.html</guid><wfw:comment>http://www.cppblog.com/kongque/comments/124754.html</wfw:comment><comments>http://www.cppblog.com/kongque/archive/2010/08/26/124754.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cppblog.com/kongque/comments/commentRss/124754.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/kongque/services/trackbacks/124754.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: OpenGL中的Frame Buffer Object(FBO)扩展，被推荐用于把数据渲染到纹理对像。相对于其它同类技术，如数据拷贝或交换缓冲区等，使用FBO技术会更高效并且更容易实现。<br>FBO一个最常见的应用就是：渲染到纹理(render to texture)，通过这项技术可以实现发光效果，环境映射，阴影映射等很炫的效果。<br><br>在OpenGL渲染管线中，几何数据和纹理最终都是以2d像素绘制到屏幕上。最后一步的渲染目标在OpenGL渲染管线中被称为帧缓存(frame buffer)。帧缓存是颜色缓存、深度缓存、模板缓存、累积缓存的集合。默认情况下， OpenGL使用的帧缓存是由窗体系统创建和管理的。<br><br>在OpenGL扩展中，GL_EXT_framebuffer_object扩展提供了一个创建额外帧缓存对象(FBO)的接口。这个帧缓存的创建和控制完全是由OpenGL完成的，有别于窗体系统创建的默认的帧缓存。与系统默认的帧缓存类似，一个FBO也是颜色缓存、深度缓存、模板缓存的集合（FBO不包括累积缓存），然后OpenGL程序就可以把渲染重定向到FBO&nbsp;&nbsp;<a href='http://www.cppblog.com/kongque/archive/2010/08/26/124754.html'>阅读全文</a><img src ="http://www.cppblog.com/kongque/aggbug/124754.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/kongque/" target="_blank">孔雀</a> 2010-08-26 04:33 <a href="http://www.cppblog.com/kongque/archive/2010/08/26/124754.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>OpenGL ES中实现gluPerspective函数</title><link>http://www.cppblog.com/kongque/archive/2010/08/19/123900.html</link><dc:creator>孔雀</dc:creator><author>孔雀</author><pubDate>Wed, 18 Aug 2010 16:14:00 GMT</pubDate><guid>http://www.cppblog.com/kongque/archive/2010/08/19/123900.html</guid><wfw:comment>http://www.cppblog.com/kongque/comments/123900.html</wfw:comment><comments>http://www.cppblog.com/kongque/archive/2010/08/19/123900.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cppblog.com/kongque/comments/commentRss/123900.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/kongque/services/trackbacks/123900.html</trackback:ping><description><![CDATA[在OpenGL中我们可以使用gluPerspective来设置视椎体。但是在OpenGL ES中却没有提供这样的实用库支持，其实我们可以自己来完成这个函数的功能。代码如下：<br><br>
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #008080;">&nbsp;1</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">&nbsp;2</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;__gluPerspective(</span><span style="color: #0000ff;">double</span><span style="color: #000000;">&nbsp;fovy,&nbsp;</span><span style="color: #0000ff;">double</span><span style="color: #000000;">&nbsp;aspect,&nbsp;</span><span style="color: #0000ff;">double</span><span style="color: #000000;">&nbsp;zNear,&nbsp;</span><span style="color: #0000ff;">double</span><span style="color: #000000;">&nbsp;zFar)<br></span><span style="color: #008080;">&nbsp;3</span>&nbsp;<span style="color: #000000;">{<br></span><span style="color: #008080;">&nbsp;4</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;glMatrixMode(GL_PROJECTION);<br></span><span style="color: #008080;">&nbsp;5</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;glLoadIdentity();<br></span><span style="color: #008080;">&nbsp;6</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">&nbsp;7</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">double</span><span style="color: #000000;">&nbsp;xmin,&nbsp;xmax,&nbsp;ymin,&nbsp;ymax;<br></span><span style="color: #008080;">&nbsp;8</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;ymax&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;zNear&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;tan(fovy&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;KPI&nbsp;</span><span style="color: #000000;">/</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">360</span><span style="color: #000000;">);<br></span><span style="color: #008080;">&nbsp;9</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;ymin&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">ymax;<br></span><span style="color: #008080;">10</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;xmin&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;ymin&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;aspect;<br></span><span style="color: #008080;">11</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;xmax&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;ymax&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;aspect;<br></span><span style="color: #008080;">12</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">13</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;glFrustumf(xmin,&nbsp;xmax,&nbsp;ymin,&nbsp;ymax,&nbsp;zNear,&nbsp;zFar);<br></span><span style="color: #008080;">14</span>&nbsp;<span style="color: #000000;">}<br></span><span style="color: #008080;">15</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">16</span>&nbsp;<span style="color: #000000;"></span></div>
<br>在需要调用gluPerspective的地方，用该函数替换即可。<br><br><br><img src ="http://www.cppblog.com/kongque/aggbug/123900.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/kongque/" target="_blank">孔雀</a> 2010-08-19 00:14 <a href="http://www.cppblog.com/kongque/archive/2010/08/19/123900.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>四元数概念及其应用</title><link>http://www.cppblog.com/kongque/archive/2010/08/18/123824.html</link><dc:creator>孔雀</dc:creator><author>孔雀</author><pubDate>Wed, 18 Aug 2010 06:01:00 GMT</pubDate><guid>http://www.cppblog.com/kongque/archive/2010/08/18/123824.html</guid><wfw:comment>http://www.cppblog.com/kongque/comments/123824.html</wfw:comment><comments>http://www.cppblog.com/kongque/archive/2010/08/18/123824.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/kongque/comments/commentRss/123824.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/kongque/services/trackbacks/123824.html</trackback:ping><description><![CDATA[学习3D编程，四元数是不得不学的。其概念的引入和定义都比较抽象，今学了，总结归纳如下：<br><br>介绍四元数之前，先做如下约定：<br>
<meta http-equiv="Content-Type" content="text/html; charset=" utf-8="">
<meta name="ProgId" content="Word.Document">
<meta name="Generator" content="Microsoft Word 11">
<meta name="Originator" content="Microsoft Word 11">
<link rel="File-List" href="file:///C:%5CTemp%5Cmsohtml1%5C01%5Cclip_filelist.xml"><!--[if gte mso 9]><xml>
<w:worddocument>
<w:view>Normal</w:view>
<w:zoom>0</w:zoom>
<w:punctuationkerning/>
<w:drawinggridverticalspacing>7.8 磅</w:drawinggridverticalspacing>
<w:displayhorizontaldrawinggridevery>0</w:displayhorizontaldrawinggridevery>
<w:displayverticaldrawinggridevery>2</w:displayverticaldrawinggridevery>
<w:validateagainstschemas/>
<w:saveifxmlinvalid>false</w:saveifxmlinvalid>
<w:ignoremixedcontent>false</w:ignoremixedcontent>
<w:alwaysshowplaceholdertext>false</w:alwaysshowplaceholdertext>
<w:compatibility>
<w:spaceforul/>
<w:balancesinglebytedoublebytewidth/>
<w:donotleavebackslashalone/>
<w:ultrailspace/>
<w:donotexpandshiftreturn/>
<w:adjustlineheightintable/>
<w:breakwrappedtables/>
<w:snaptogridincell/>
<w:wraptextwithpunct/>
<w:useasianbreakrules/>
<w:dontgrowautofit/>
<w:usefelayout/>
</w:compatibility>
<w:browserlevel>MicrosoftInternetExplorer4</w:browserlevel>
</w:worddocument>
</xml><![endif]--><!--[if gte mso 9]><xml>
<w:latentstyles deflockedstate="false" latentstylecount="156">
</w:latentstyles>
</xml><![endif]--><style>
<!--
/* Font Definitions */
@font-face
{font-family:Wingdings;
panose-1:5 0 0 0 0 0 0 0 0 0;
mso-font-charset:2;
mso-generic-font-family:auto;
mso-font-pitch:variable;
mso-font-signature:0 268435456 0 0 -2147483648 0;}
@font-face
{font-family:宋体;
panose-1:2 1 6 0 3 1 1 1 1 1;
mso-font-alt:SimSun;
mso-font-charset:134;
mso-generic-font-family:auto;
mso-font-pitch:variable;
mso-font-signature:3 680460288 22 0 262145 0;}
@font-face
{font-family:"\@宋体";
panose-1:2 1 6 0 3 1 1 1 1 1;
mso-font-charset:134;
mso-generic-font-family:auto;
mso-font-pitch:variable;
mso-font-signature:3 680460288 22 0 262145 0;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{mso-style-parent:"";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
mso-pagination:none;
font-size:10.5pt;
mso-bidi-font-size:12.0pt;
font-family:"Times New Roman";
mso-fareast-font-family:宋体;
mso-font-kerning:1.0pt;}
pre
{margin:0cm;
margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:12.0pt;
font-family:宋体;
mso-bidi-font-family:宋体;}
span.code
{mso-style-name:code;}
/* Page Definitions */
@page
{mso-page-border-surround-header:no;
mso-page-border-surround-footer:no;}
@page Section1
{size:612.0pt 792.0pt;
margin:72.0pt 90.0pt 72.0pt 90.0pt;
mso-header-margin:36.0pt;
mso-footer-margin:36.0pt;
mso-paper-source:0;}
div.Section1
{page:Section1;}
/* List Definitions */
@list l0
{mso-list-id:1150101094;
mso-list-type:hybrid;
mso-list-template-ids:-1781784754 1757868650 67698713 67698715 67698703 67698713 67698715 67698703 67698713 67698715;}
@list l0:level1
{mso-level-start-at:0;
mso-level-tab-stop:18.0pt;
mso-level-number-position:left;
margin-left:18.0pt;
text-indent:-18.0pt;}
@list l1
{mso-list-id:1576739787;
mso-list-type:hybrid;
mso-list-template-ids:1506717818 -1401410554 67698713 67698715 67698703 67698713 67698715 67698703 67698713 67698715;}
@list l1:level1
{mso-level-text:%1）;
mso-level-tab-stop:39.0pt;
mso-level-number-position:left;
margin-left:39.0pt;
text-indent:-18.0pt;}
ol
{margin-bottom:0cm;}
ul
{margin-bottom:0cm;}
-->
</style><!--[if gte mso 10]>
<style>
/* Style Definitions */
table.MsoNormalTable
{mso-style-name:普通表格;
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-parent:"";
mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
mso-para-margin:0cm;
mso-para-margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:10.0pt;
font-family:"Times New Roman";
mso-ansi-language:#0400;
mso-fareast-language:#0400;
mso-bidi-language:#0400;}
</style>
<![endif]-->
<p class="MsoNormal" style="text-indent: 18pt;"><span lang="EN-US">1</span><span style="font-family: 宋体;">．采用右手坐标系</span><span lang="EN-US">(OpenGL)</span></p>
<p class="MsoNormal" style="text-indent: 18pt;"><span lang="EN-US">2</span><span style="font-family: 宋体;">．旋转次序：</span><span lang="EN-US">x-&gt;y-&gt;z</span></p>
<p class="MsoNormal" style="text-indent: 18pt;"><span lang="EN-US">3.&nbsp; </span><span style="font-family: 宋体;">矩阵是列优先存储</span></p>
<p class="MsoNormal" style="text-indent: 18pt;"><span lang="EN-US"><br>
<span style="font-weight: bold;">1.</span></span><span style="font-family: 宋体; font-weight: bold;">什么是四元数？</span></p>
<p class="MsoNormal" style="text-indent: 18pt;"><span style="font-family: 宋体;">直接用数学上的定义来解释，因为我很难在现实生活中找到可以描述明白的例子。</span></p>
<p class="MsoNormal" style="text-indent: 18pt;"><span lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal" style="text-indent: 18pt;"><span lang="EN-US">i, j, k </span><span style="font-family: 宋体;">为虚数</span></p>
<p class="MsoNormal" style="text-indent: 18pt;"><span lang="EN-US">Q = w + xi + yj
+ zk</span></p>
<p class="MsoNormal" style="text-indent: 18pt;"><span style="font-family: 宋体;">其中</span><span lang="EN-US">w</span><span style="font-family: 宋体;">是实数，而</span><span lang="EN-US">x,y,z</span><span style="font-family: 宋体;">为复数。</span></p>
<p class="MsoNormal" style="text-indent: 18pt;"><span style="font-family: 宋体;">另外一种常见的表达方式是：</span></p>
<p class="MsoNormal" style="text-indent: 18pt;"><span lang="EN-US">Q = [w, v]</span></p>
<p class="MsoNormal" style="text-indent: 18pt;"><span style="font-family: 宋体;">其中</span><span lang="EN-US">v=(x,y,z)</span><span style="font-family: 宋体;">称为矢量部（虽然称为矢量，但是这个不是三维空间中的矢量，而是四维空间的，想象吧</span><span style="font-family: wingdings;" lang="EN-US"><span>L</span></span><span style="font-family: 宋体;">），</span><span lang="EN-US">w</span><span style="font-family: 宋体;">称为标量部。</span></p>
<p class="MsoNormal" style="text-indent: 18pt;"><span lang="EN-US"><br>
<span style="font-weight: bold;">2.</span></span><span style="font-family: 宋体; font-weight: bold;">四元数可以做什么？</span></p>
<p class="MsoNormal" style="text-indent: 18pt;"><span style="font-family: 宋体;">有了四元数的概念还不行，四元数可以干什么？四元数可以用来描述方向。</span></p>
<p class="MsoNormal" style="text-indent: 18pt;"><span style="font-family: 宋体;">先来看下如何求取四元数的长度：</span></p>
<p class="MsoNormal" style="text-indent: 18pt;"><span lang="EN-US">||q|| = Norm(q)
= sqrt(w<sup>2 </sup>+ x<sup>2</sup> + y<sup>2</sup> + z<sup>2</sup>)</span></p>
<p class="MsoNormal" style="text-indent: 18pt;"><span style="font-family: 宋体;">单位长度的四元数有以下属性：</span></p>
<p class="MsoNormal" style="text-indent: 18pt;"><span lang="EN-US">w<sup>2</sup> +
x<sup>2</sup> + y<sup>2</sup> + z<sup>2</sup> = 1</span></p>
<p class="MsoNormal" style="text-indent: 18pt;"><span style="font-family: 宋体;">所以我们使用如下方法来标准化</span><span lang="EN-US">(Normalize)</span><span style="font-family: 宋体;">一个四元数：</span></p>
<p class="MsoNormal" style="text-indent: 18pt;"><span lang="EN-US">q = q / ||q|| =
q / sqrt(w<sup>2</sup> + x<sup>2</sup> + y<sup>2</sup> + z<sup>2</sup>)</span></p>
<p class="MsoNormal" style="text-indent: 18pt;"><span lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal" style="text-indent: 18pt;"><span style="font-family: 宋体;">使用一个单位四元数来描述方向，请记住必须是单位四元数才可以描述方向。</span></p>
<p class="MsoNormal" style="text-indent: 18pt;"><span lang="EN-US"><br>
<span style="font-weight: bold;">3.</span></span><span style="font-family: 宋体; font-weight: bold;">四元数的乘法</span></p>
<p class="MsoNormal" style="text-indent: 18pt;"><span style="font-family: 宋体;">因为一个单位四元数可以代表一个三维空间中的方向，那么两个四元数相乘得到的结果仍然是一个四元数，这个四元素依旧可以标识一个方向。</span></p>
<p class="MsoNormal" style="text-indent: 18pt;"><span lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal" style="text-indent: 18pt;"><span style="font-family: 宋体;">给定两个四元数：</span></p>
<p class="MsoNormal" style="text-indent: 18pt;"><span lang="EN-US">Q1 = (w1, x1,
y1, z1)</span></p>
<p class="MsoNormal" style="text-indent: 18pt;"><span lang="EN-US">Q2 = (w2, x2,
y2, z2)</span></p>
<p class="MsoNormal" style="text-indent: 18pt;"><span lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal" style="text-indent: 18pt;"><span lang="EN-US">Q1 * Q2 = (w1.w2
&#8211; v1.v2, w1.v2 + w2.v1 + v1 x v2)</span></p>
<p class="MsoNormal" style="text-indent: 18pt;"><span style="font-family: 宋体;">注意：</span><span lang="EN-US">.</span><span style="font-family: 宋体;">代表向量间的点积，</span><span lang="EN-US">x</span><span style="font-family: 宋体;">代表叉积。</span><span lang="EN-US">v1=(x1, y1, z1)<span>&nbsp; </span>v2=(x2, y2, z2)</span></p>
<p class="MsoNormal" style="text-indent: 18pt;"><span lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal" style="text-indent: 18pt;"><span style="font-family: 宋体;">优化一下：</span></p>
<p class="MsoNormal" style="margin-left: 18pt;"><span lang="EN-US">w=w1w2 - x1x2 -
y1y2 - z1z2<br>
x = w1x2 + x1w2 + y1z2 - z1y2<br>
y = w1y2 + y1w2 + z1x2 - x1z2<br>
z = w1z2 + z1w2 + x1y2 - y1x2</span></p>
<p class="MsoNormal" style="text-indent: 18pt;"><span lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p style="font-weight: bold;" class="MsoNormal"><span lang="EN-US">4.</span><span style="font-family: 宋体;">四元数的转换</span></p>
<p class="MsoNormal"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体;">为什么要转换，因为我们还不能直接使用四元数来进行</span><span lang="EN-US">3D</span><span style="font-family: 宋体;">物体的旋转。在</span><span lang="EN-US">OpenGL</span><span style="font-family: 宋体;">中和</span><span lang="EN-US">Direct3D</span><span style="font-family: 宋体;">中都是通过矩阵来描述</span><span lang="EN-US">3D</span><span style="font-family: 宋体;">旋转的。</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;"><br></span></p>
<p class="MsoNormal" style="text-indent: 9pt;"><span lang="EN-US">4.1 </span><span style="font-family: 宋体;">四元数到矩阵的转换</span></p>
<p class="MsoNormal" style="text-indent: 9pt;"><span lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal" style="text-indent: 9pt;"><span style="font-family: 宋体;">使用单位四元数转换到矩阵：</span></p>
<pre style="text-indent: 12pt;"><span class="code"><span lang="EN-US">Matrix = [ 1 - 2y<sup>2</sup> - 2z<sup>2</sup><span>&nbsp;&nbsp; </span>2xy - 2wz<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>2xz + 2wy<o:p></o:p></span></span></pre>
<pre><span class="code"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>2xy + 2wz<span>&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;</span>1 - 2x<sup>2</sup> - 2z<sup>2</sup><span>&nbsp;&nbsp; </span>2yz - 2wx<o:p></o:p></span></span></pre>
<pre><span class="code"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>2xz - 2wy<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>2yz + 2wx<span>&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;</span>1 - 2x<sup>2</sup> - 2y<sup>2</sup> ]</span></span></pre>
<p class="MsoNormal" style="text-indent: 9pt;"><span lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal" style="text-indent: 9pt;"><span lang="EN-US">4.2 </span><span style="font-family: 宋体;">四元数到轴角的转换</span></p>
<p class="MsoNormal" style="text-indent: 9pt;"><span style="font-family: 宋体;">轴角也是一种表达空间旋转的方式。</span></p>
<p class="MsoNormal" style="text-indent: 9pt;"><span style="font-family: 宋体;">如果旋转轴是：</span><span lang="EN-US">(ax, ay, az)</span></p>
<p class="MsoNormal" style="text-indent: 9pt;"><span style="font-family: 宋体;">旋转角度是：</span><span lang="EN-US">angle (</span><span style="font-family: 宋体;">单位：弧度</span><span lang="EN-US">)</span></p>
<p class="MsoNormal" style="text-indent: 9pt;"><span style="font-family: 宋体;">那么四元数与轴角之间的转换关系如下：</span></p>
<p class="MsoNormal" style="text-indent: 9pt;"><span lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal" style="text-indent: 9pt;"><span lang="EN-US">angle = 2 *
acos(w)</span></p>
<p class="MsoNormal" style="text-indent: 9pt;"><span lang="EN-US">ax = x / scale</span></p>
<p class="MsoNormal" style="text-indent: 9pt;"><span lang="EN-US">ay = y / scale</span></p>
<p class="MsoNormal" style="text-indent: 9pt;"><span lang="EN-US">az = y / scale</span></p>
<p class="MsoNormal" style="text-indent: 9pt;"><span style="font-family: 宋体;">其中</span><span lang="EN-US">scale = sqrt(x<sup>2</sup> + y<sup>2</sup> + z<sup>2</sup>)</span></p>
<p class="MsoNormal" style="text-indent: 9pt;"><span lang="EN-US"><br>
&nbsp; 4.3 </span><span style="font-family: 宋体;">轴角到四元数的转换</span></p>
<p class="MsoNormal" style="text-indent: 9pt;"><span style="font-family: 宋体;">假设旋转轴是</span><span lang="EN-US">(ax, ay, az)</span><span style="font-family: 宋体;">，记得必须是一个单位向量。</span></p>
<p class="MsoNormal" style="text-indent: 9pt;"><span style="font-family: 宋体;">旋转角度是</span><span lang="EN-US">theta. </span><span style="font-family: 宋体;">（单位：弧度）</span></p>
<p class="MsoNormal" style="text-indent: 9pt;"><span style="font-family: 宋体;">那么转换如下：</span></p>
<p class="MsoNormal" style="text-indent: 9pt;"><span lang="EN-US">w = cos(theta / 2
)</span></p>
<p class="MsoNormal" style="text-indent: 9pt;"><span lang="EN-US">x = ax *
sin(theta / 2)</span></p>
<p class="MsoNormal" style="text-indent: 9pt;"><span lang="EN-US">y = ay *
sin(theta / 2)</span></p>
<p class="MsoNormal" style="text-indent: 9pt;"><span lang="EN-US">z = az *
sin(theta / 2 )</span></p>
<p class="MsoNormal" style="text-indent: 9pt;"><span lang="EN-US"><br>
&nbsp; 4.4 </span><span style="font-family: 宋体;">欧拉角到四元数的转换</span></p>
<p class="MsoNormal" style="text-indent: 9pt;"><span style="font-family: 宋体;">如果你的欧拉角为</span><span lang="EN-US">(a, b, c)</span><span style="font-family: 宋体;">那么就可以形成三个独立的四元数，如下：</span></p>
<p class="MsoNormal" style="margin-left: 9pt;"><span lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal" style="margin-left: 9pt;"><span lang="EN-US">Qx = [ cos(a/2),
(sin(a/2), 0, 0)]<br>
Qy = [ cos(b/2), (0, sin(b/2), 0)]<br>
Qz = [ cos(c/2), (0, 0, sin(c/2))]</span></p>
<p class="MsoNormal" style="margin-left: 9pt;"><span lang="EN-US"><br>
</span><span style="font-family: 宋体;">最终的四元数是</span><span lang="EN-US">Qx * Qy
* Qz</span><span style="font-family: 宋体;">的乘积的结果。</span></p>
<p class="MsoNormal" style="margin-left: 9pt;"><span lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;<br>
<span style="font-weight: bold;">5.</span></span><span style="font-family: 宋体; font-weight: bold;">使用四元数来避免</span><span style="font-weight: bold;" lang="EN-US">Gimbal
Lock</span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">基本思路如下：</span></p>
<p class="MsoNormal" style="margin-left: 39pt; text-indent: -18pt;"><!--[if !supportLists]--><span lang="EN-US"><span>1）<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;
</span></span></span><!--[endif]--><span style="font-family: 宋体;">使用一个四元数来标识一个方向</span></p>
<p class="MsoNormal" style="margin-left: 39pt; text-indent: -18pt;"><!--[if !supportLists]--><span lang="EN-US"><span>2）<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;
</span></span></span><!--[endif]--><span style="font-family: 宋体;">创建一个临时的四元数来标识当前方向到新方向的变化</span></p>
<p class="MsoNormal" style="margin-left: 39pt; text-indent: -18pt;"><!--[if !supportLists]--><span lang="EN-US"><span>3）<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;
</span></span></span><!--[endif]--><span style="font-family: 宋体;">右乘临时的四元数和初始四元数，结果是一个合并了两个四元数的新的四元数</span></p>
<p class="MsoNormal" style="margin-left: 39pt; text-indent: -18pt;"><!--[if !supportLists]--><span lang="EN-US"><span>4）<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;
</span></span></span><!--[endif]--><span style="font-family: 宋体;">将四元数转换成矩阵</span></p>
<p class="MsoNormal"><span lang="EN-US"><br>
<span style="font-weight: bold;">6.</span></span><span style="font-family: 宋体; font-weight: bold;">更深入的学习四元数</span></p>
<p class="MsoNormal" style="text-indent: 21pt;"><span lang="EN-US">SLERP</span><span style="font-family: 宋体;">：球状线性插值对于三位模型进行动画处理非常有用，因为这种方式在模型的各种方向之间提供了平滑的转换。</span></p>
<br><br> <img src ="http://www.cppblog.com/kongque/aggbug/123824.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/kongque/" target="_blank">孔雀</a> 2010-08-18 14:01 <a href="http://www.cppblog.com/kongque/archive/2010/08/18/123824.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>