贴过来就乱码了,算了。 去这里 http://www.cnblogs.com/RenderDonkey/p/3745561.html
最近公司游戏正在准备上线,所以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:这是行主矩阵表示法
通过前面的例子,我们已经可以用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
剩下的,就是上图了
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舞台大小