麒麟子

~~

导航

<2010年6月>
303112345
6789101112
13141516171819
20212223242526
27282930123
45678910

统计

常用链接

留言簿(12)

随笔分类

随笔档案

Friends

WebSites

积分与排名

最新随笔

最新评论

阅读排行榜

评论排行榜

2016年5月13日 #

博客迁移

本博客早已不再更新。 搬到博客园了
www.cnblogs.com/geniusalex

posted @ 2016-05-13 13:10 麒麟子 阅读(571) | 评论 (0)编辑 收藏

2014年5月22日 #

CocoSocket分享下载与编写经验分享

贴过来就乱码了,算了。 去这里 http://www.cnblogs.com/RenderDonkey/p/3745561.html

posted @ 2014-05-22 14:35 麒麟子 阅读(1801) | 评论 (2)编辑 收藏

2013年6月15日 #

镜面反射矩阵推导

最近公司游戏正在准备上线,所以FlasCC也就没有研究了,偶尔有闲功夫,也是玩玩3DMAX和UNITY3D。 感觉不会3DMAX,是一种局限。

回到主题,记录一下镜面反射矩阵的推导。

在用Irrlicht和RTT做镜面效果的时候,用到了反射矩阵。 就是需要把摄相机镜像,渲染一个RT,贴到镜面模型上。这个其实还纠结了许久,因为之前做水面渲染的时候,水面是平的,很好计算摄相机在水面以下的位置。 但是换成镜面,就不一样了,因为镜面可能是任意面。 于是就需要一个通用的反射矩阵。

反射矩阵的计算是基于平面的,因为,任何反射,都需要一个反射面。

所以,我们先给出平面表示 Plane(nx,ny,nz,d); 其中(nx,ny,nz)已经单位化。

然后,我们假设空间中有任意一点P(x,y,z,1)

设这个点P以Plane为反射面的镜像点为P1(x1,y1,z1,w)。

 

---------------------------------------------

根据定理,我们知道, 若两个点以某一点为镜像,则两个点的坐标之和除以2,就刚好是中点。

这个理论我们用到这里的话, 那这个中点就刚好是平面上的一个点。 平面上的这个点就是 P(x,y,z,1) - (nx,ny,nz,0)*D .  其中D就是点P到平面的距离

而D=Plane dot P = (x*nx+y*ny+z*nz+d);

由上面的描述,我们马上想到,那么要求点P1的话,就是这样 

(P+P1)/2 = P(x,y,z,1) - (nx,ny,nz,0)*D

=> P1 = P(x,y,z,1) - 2(nx,ny,nz,0)*D

=>P1 = P(x,y,z,1) - 2(nx,ny,nz,0)*(x*nx+y*ny+z*nz+d)

 

换成矩阵形式则为

                            |1-2*nx*nx   -2*nx*ny         -2*nx*nz         0  |

                             | -2*ny*nx     1 - 2*ny*ny     -2*ny*nz         0  |

P1 = {x,y,z,1}   x   | -2*nz*nx     -2*nz*ny         1-2*nz*nz        0  |

                             | -2*d*nx      -2*d*ny           -2*d*nz           1  |

 

大功告成

btw:这是行主矩阵表示法

posted @ 2013-06-15 00:48 麒麟子 阅读(9580) | 评论 (2)编辑 收藏

2013年5月19日 #

FlasCC例子研究之SWC

通过前面的例子,我们已经可以用C++生成SWF,并且,也学会了如何用C++和AS3交互,以及创建一个可以循环的程序。

但是,如果C++和AS3的结合开发是如此痛苦的话,那我觉得FlasCC就没有存在的意义了。 还好,看到了这个例子。

这个例子是向大家展示如何利用FLASCC生成SWC,以供AS3代码调用的。 这个机制真的很强大,当一个AS3在使用一个用FLASCC生成的SWC时,它是完全感觉不到这个SWC是用C++代码,通过FLASCC生成的。

这个例子使用了一个MurmurHash的哈希函数的实现,来展示SWC的生成。 即这个例子将MurmurHash包装成了AS3类,并打包成AS3,供大家使用。

打开它的头文件,你可以发现3个函数。 当然,就算是有300个函数,也无所谓,因为具体的C++代码是什么,不是我们关注的重点,哪怕只是一个函数里面写了一个printf,我们也可以继续这个例子。

嗯,要特别注意一下那个叫 as3api.cpp的家伙。 这个文件就展示了如何使用FlasCC提供的as3sig语法来控制C/C++函数。这种语法提供了一个非常好的方式来书写AS3和C/C++代码库。它能够进行一些必要的类型转换。

 

嘿嘿,你肯定想说,哇靠,居然不能自己生成。 其实,是可以的,不过要下一个例子才会教。

比较特别的是,这个例子不但用了GCC,还用了FLEX编译器。

 

//使用C++编译为SWC 注:-jvmopt=-Xmx1G 是我加上的,因为编译的时候,有提示我错误。

"$(FLASCC)/usr/bin/g++" $(BASE_CFLAGS) -O4 -jvmopt=-Xmx1G MurmurHash3.cpp as3api.cpp main.cpp -emit-swc=sample.MurmurHash -o MurmurHash.swc

//使用mxmlc生成SWF
"$(FLEX)/bin/mxmlc" -static-link-runtime-shared-libraries -compiler.omit-trace-statements=false -library-path=MurmurHash.swc -debug=false swcdemo.as -o swcdemo.swf

 

剩下的,就是上图了

image

posted @ 2013-05-19 00:17 麒麟子 阅读(6203) | 评论 (2)编辑 收藏

2013年5月18日 #

FlasCC例子研究之再看HelloWorld

Hello World作为任何SDK,语言,平台的入门示例,无疑是最简单的。一般是拿来验证环境的可用性。 FlasCC的也自然不例外。如果我们可以成功的编译通过HelloWorld,就表示我们的FlasCC,Cygwin,Flex没有问题了。

打开hello.c,我们可以发现一个标准的C语言的hello world例子。

int main()

{

     printf(“hello world”);

}

 

这个,虽然返回值是int,但是代码里没有 return字样。 不过,没关系,是可以编译通过的。

打开makefile可以发现,它调用了两次gcc,一次是生成projector的二进制文件,即一个打包了abc字节码和FLASH虚拟机的EXE程序。 第二次则编译为了SWF文件,它可以在FLASH PLAYER中执行。

如果不想通过makefile,而是想自己编译,则可以进入到01_HelloWorld文件夹,执行下面的代码。

第一步,设置FLASCC和FLEX环境

make FLEX=/cygdrive/c/path/to/flexsdk FLASCC=/cygdrive/c/flascc/sdk

如果是想生成打包好的EXE,则

"/cygdrive/c/flascc/sdk/usr/bin/gcc" -Werror -Wno-write-strings -Wno-trigraphs hello.c -o hello.exe

如果是想生成SWF,则

"/cygdrive/c/flascc/sdk/usr/bin/gcc" -Werror -Wno-write-strings -Wno-trigraphs hello.c -emit-swf -swf-size=200x200 -o hello.swf

 

参数的意思如下

Werror 将警告视为错误。 开启了这个的话,所有警告,都会当作错误输出,这是一种较高的编译要求。

-Wno-write-strings 表示不输出警告字符串

-Wno-trigraphs 不知道

-o 输出可执行文件

-emit-swf 生成SWF文件

-swf-size 指定SWF舞台大小

posted @ 2013-05-18 00:17 麒麟子 阅读(3908) | 评论 (0)编辑 收藏

仅列出标题  下一页