﻿<?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++博客-麒麟子</title><link>http://www.cppblog.com/Leaf/</link><description>~~</description><language>zh-cn</language><lastBuildDate>Sun, 19 Apr 2026 12:17:39 GMT</lastBuildDate><pubDate>Sun, 19 Apr 2026 12:17:39 GMT</pubDate><ttl>60</ttl><item><title>博客迁移</title><link>http://www.cppblog.com/Leaf/archive/2016/05/13/213507.html</link><dc:creator>麒麟子</dc:creator><author>麒麟子</author><pubDate>Fri, 13 May 2016 05:10:00 GMT</pubDate><guid>http://www.cppblog.com/Leaf/archive/2016/05/13/213507.html</guid><wfw:comment>http://www.cppblog.com/Leaf/comments/213507.html</wfw:comment><comments>http://www.cppblog.com/Leaf/archive/2016/05/13/213507.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Leaf/comments/commentRss/213507.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Leaf/services/trackbacks/213507.html</trackback:ping><description><![CDATA[本博客早已不再更新。 搬到博客园了<br /><a href="www.cnblogs.com/geniusalex">www.cnblogs.com/geniusalex</a><img src ="http://www.cppblog.com/Leaf/aggbug/213507.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Leaf/" target="_blank">麒麟子</a> 2016-05-13 13:10 <a href="http://www.cppblog.com/Leaf/archive/2016/05/13/213507.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>CocoSocket分享下载与编写经验分享</title><link>http://www.cppblog.com/Leaf/archive/2014/05/22/207055.html</link><dc:creator>麒麟子</dc:creator><author>麒麟子</author><pubDate>Thu, 22 May 2014 06:35:00 GMT</pubDate><guid>http://www.cppblog.com/Leaf/archive/2014/05/22/207055.html</guid><wfw:comment>http://www.cppblog.com/Leaf/comments/207055.html</wfw:comment><comments>http://www.cppblog.com/Leaf/archive/2014/05/22/207055.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/Leaf/comments/commentRss/207055.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Leaf/services/trackbacks/207055.html</trackback:ping><description><![CDATA[贴过来就乱码了，算了。 去这里 http://www.cnblogs.com/RenderDonkey/p/3745561.html<img src ="http://www.cppblog.com/Leaf/aggbug/207055.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Leaf/" target="_blank">麒麟子</a> 2014-05-22 14:35 <a href="http://www.cppblog.com/Leaf/archive/2014/05/22/207055.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>镜面反射矩阵推导</title><link>http://www.cppblog.com/Leaf/archive/2013/06/15/201017.html</link><dc:creator>麒麟子</dc:creator><author>麒麟子</author><pubDate>Fri, 14 Jun 2013 16:48:00 GMT</pubDate><guid>http://www.cppblog.com/Leaf/archive/2013/06/15/201017.html</guid><wfw:comment>http://www.cppblog.com/Leaf/comments/201017.html</wfw:comment><comments>http://www.cppblog.com/Leaf/archive/2013/06/15/201017.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/Leaf/comments/commentRss/201017.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Leaf/services/trackbacks/201017.html</trackback:ping><description><![CDATA[<p>最近公司游戏正在准备上线，所以FlasCC也就没有研究了，偶尔有闲功夫，也是玩玩3DMAX和UNITY3D。 感觉不会3DMAX，是一种局限。</p> <p>回到主题，记录一下镜面反射矩阵的推导。</p> <p>在用Irrlicht和RTT做镜面效果的时候，用到了反射矩阵。 就是需要把摄相机镜像，渲染一个RT，贴到镜面模型上。这个其实还纠结了许久，因为之前做水面渲染的时候，水面是平的，很好计算摄相机在水面以下的位置。 但是换成镜面，就不一样了，因为镜面可能是任意面。 于是就需要一个通用的反射矩阵。</p> <p>反射矩阵的计算是基于平面的，因为，任何反射，都需要一个反射面。</p> <p>所以，我们先给出平面表示 Plane(nx,ny,nz,d); 其中(nx,ny,nz)已经单位化。</p> <p>然后，我们假设空间中有任意一点P(x,y,z,1)</p> <p>设这个点P以Plane为反射面的镜像点为P1(x1,y1,z1,w)。</p> <p>&nbsp;</p> <p>－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－</p> <p>根据定理，我们知道， 若两个点以某一点为镜像，则两个点的坐标之和除以2，就刚好是中点。 </p> <p>这个理论我们用到这里的话， 那这个中点就刚好是平面上的一个点。 平面上的这个点就是 P(x,y,z,1) - (nx,ny,nz,0)*D .&nbsp; 其中D就是点P到平面的距离</p> <p>而D=Plane dot P = (x*nx+y*ny+z*nz+d);</p> <p>由上面的描述，我们马上想到，那么要求点P1的话，就是这样&nbsp; </p> <p>(P+P1)/2 = P(x,y,z,1) - (nx,ny,nz,0)*D</p> <p>=&gt; P1 = P(x,y,z,1) - 2(nx,ny,nz,0)*D</p> <p>=&gt;P1 = P(x,y,z,1) - 2(nx,ny,nz,0)*(x*nx+y*ny+z*nz+d)</p> <p>&nbsp;</p> <p>换成矩阵形式则为</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ｜1-2*nx*nx&nbsp;&nbsp; -2*nx*ny&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -2*nx*nz&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp; |</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | -2*ny*nx&nbsp;&nbsp;&nbsp;&nbsp; 1 - 2*ny*ny&nbsp;&nbsp;&nbsp;&nbsp; -2*ny*nz&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp; |</p> <p>P1 = {x,y,z,1}&nbsp;&nbsp; x&nbsp;&nbsp; | -2*nz*nx&nbsp;&nbsp;&nbsp;&nbsp; -2*nz*ny&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1-2*nz*nz&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp; |</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | -2*d*nx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -2*d*ny&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -2*d*nz&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp; |</p> <p>&nbsp;</p> <p>大功告成</p> <p>btw:这是行主矩阵表示法</p> <img src ="http://www.cppblog.com/Leaf/aggbug/201017.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Leaf/" target="_blank">麒麟子</a> 2013-06-15 00:48 <a href="http://www.cppblog.com/Leaf/archive/2013/06/15/201017.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>FlasCC例子研究之SWC</title><link>http://www.cppblog.com/Leaf/archive/2013/05/19/200385.html</link><dc:creator>麒麟子</dc:creator><author>麒麟子</author><pubDate>Sat, 18 May 2013 16:17:00 GMT</pubDate><guid>http://www.cppblog.com/Leaf/archive/2013/05/19/200385.html</guid><wfw:comment>http://www.cppblog.com/Leaf/comments/200385.html</wfw:comment><comments>http://www.cppblog.com/Leaf/archive/2013/05/19/200385.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/Leaf/comments/commentRss/200385.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Leaf/services/trackbacks/200385.html</trackback:ping><description><![CDATA[<p>通过前面的例子，我们已经可以用C++生成SWF，并且，也学会了如何用C++和AS3交互，以及创建一个可以循环的程序。 </p> <p>但是，如果C++和AS3的结合开发是如此痛苦的话，那我觉得FlasCC就没有存在的意义了。 还好，看到了这个例子。</p> <p>这个例子是向大家展示如何利用FLASCC生成SWC，以供AS3代码调用的。 这个机制真的很强大，当一个AS3在使用一个用FLASCC生成的SWC时，它是完全感觉不到这个SWC是用C++代码，通过FLASCC生成的。</p> <p>这个例子使用了一个MurmurHash的哈希函数的实现，来展示SWC的生成。 即这个例子将MurmurHash包装成了AS3类，并打包成AS3，供大家使用。</p> <p>打开它的头文件，你可以发现3个函数。 当然，就算是有300个函数，也无所谓，因为具体的C++代码是什么，不是我们关注的重点，哪怕只是一个函数里面写了一个printf，我们也可以继续这个例子。</p> <p>嗯，要特别注意一下那个叫 as3api.cpp的家伙。 这个文件就展示了如何使用FlasCC提供的as3sig语法来控制C/C++函数。这种语法提供了一个非常好的方式来书写AS3和C/C++代码库。它能够进行一些必要的类型转换。</p> <p>&nbsp;</p> <p>嘿嘿，你肯定想说，哇靠，居然不能自己生成。 其实，是可以的，不过要下一个例子才会教。</p> <p>比较特别的是，这个例子不但用了GCC，还用了FLEX编译器。</p> <p>&nbsp;</p> <p>//使用C++编译为SWC 注：<strong>-jvmopt=-Xmx1G</strong> 是我加上的，因为编译的时候，有提示我错误。</p> <p>"$(FLASCC)/usr/bin/g++" $(BASE_CFLAGS) -O4 <strong>-jvmopt=-Xmx1G</strong> MurmurHash3.cpp as3api.cpp main.cpp -emit-swc=sample.MurmurHash -o MurmurHash.swc</p> <p>//使用mxmlc生成SWF<br>"$(FLEX)/bin/mxmlc" -static-link-runtime-shared-libraries -compiler.omit-trace-statements=false -library-path=MurmurHash.swc -debug=false swcdemo.as -o swcdemo.swf </p> <p>&nbsp;</p> <p>剩下的，就是上图了</p> <p><a href="http://www.cppblog.com/images/cppblog_com/Leaf/WindowsLiveWriter/FlasCCSWC_420/image_2.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://www.cppblog.com/images/cppblog_com/Leaf/WindowsLiveWriter/FlasCCSWC_420/image_thumb.png" width="461" height="387"></a></p><img src ="http://www.cppblog.com/Leaf/aggbug/200385.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Leaf/" target="_blank">麒麟子</a> 2013-05-19 00:17 <a href="http://www.cppblog.com/Leaf/archive/2013/05/19/200385.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>FlasCC例子研究之再看HelloWorld</title><link>http://www.cppblog.com/Leaf/archive/2013/05/18/200362.html</link><dc:creator>麒麟子</dc:creator><author>麒麟子</author><pubDate>Fri, 17 May 2013 16:17:00 GMT</pubDate><guid>http://www.cppblog.com/Leaf/archive/2013/05/18/200362.html</guid><wfw:comment>http://www.cppblog.com/Leaf/comments/200362.html</wfw:comment><comments>http://www.cppblog.com/Leaf/archive/2013/05/18/200362.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Leaf/comments/commentRss/200362.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Leaf/services/trackbacks/200362.html</trackback:ping><description><![CDATA[<p>Hello World作为任何SDK,语言，平台的入门示例，无疑是最简单的。一般是拿来验证环境的可用性。 FlasCC的也自然不例外。如果我们可以成功的编译通过HelloWorld，就表示我们的FlasCC,Cygwin,Flex没有问题了。</p> <p>打开hello.c，我们可以发现一个标准的C语言的hello world例子。</p> <p>int main()</p> <p>{</p> <p>&nbsp;&nbsp;&nbsp;&nbsp; printf(“hello world”);</p> <p>}</p> <p>&nbsp;</p> <p>这个，虽然返回值是int，但是代码里没有 return字样。 不过，没关系，是可以编译通过的。</p> <p>打开makefile可以发现，它调用了两次gcc，一次是生成projector的二进制文件，即一个打包了abc字节码和FLASH虚拟机的EXE程序。 第二次则编译为了SWF文件，它可以在FLASH PLAYER中执行。</p> <p>如果不想通过makefile，而是想自己编译，则可以进入到01_HelloWorld文件夹，执行下面的代码。</p> <p>第一步，设置FLASCC和FLEX环境</p> <p>make FLEX=/cygdrive/c/path/to/flexsdk FLASCC=/cygdrive/c/flascc/sdk</p> <p>如果是想生成打包好的EXE，则</p> <p>"/cygdrive/c/flascc/sdk/usr/bin/gcc" -Werror -Wno-write-strings -Wno-trigraphs hello.c -o hello.exe</p> <p>如果是想生成SWF，则</p> <p>"/cygdrive/c/flascc/sdk/usr/bin/gcc" -Werror -Wno-write-strings -Wno-trigraphs hello.c -emit-swf -swf-size=200x200 -o hello.swf</p> <p>&nbsp;</p> <p>参数的意思如下</p> <p>Werror 将警告视为错误。 开启了这个的话，所有警告，都会当作错误输出，这是一种较高的编译要求。</p> <p>-Wno-write-strings 表示不输出警告字符串</p> <p>-Wno-trigraphs 不知道</p> <p>-o 输出可执行文件</p> <p>-emit-swf 生成SWF文件</p> <p>-swf-size 指定SWF舞台大小</p><img src ="http://www.cppblog.com/Leaf/aggbug/200362.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Leaf/" target="_blank">麒麟子</a> 2013-05-18 00:17 <a href="http://www.cppblog.com/Leaf/archive/2013/05/18/200362.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>