cocos2dx 透视设置分析

cocos2dx 透视设置分析

转自:http://chenliang.info/blog/cocos2dx透视设置分析/




cocos2dx CCDirector 默认用的是3d投影,之前看到它里面关于设置投影矩阵的代码里写了一些数字,当时没太当回事,今天正好有时间琢磨了一下才知道它是干嘛的,记录一下。

代码长这个样子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
void CCDirector::setProjection(ccDirectorProjection kProjection)
{
//省略了一些无关代码
     case kCCDirectorProjection3D:
         {
             float zeye = this ->getZEye();
 
             kmMat4 matrixPerspective, matrixLookup;
 
             kmGLMatrixMode(KM_GL_PROJECTION);
             kmGLLoadIdentity();
 
             // issue #1334
 
             kmMat4PerspectiveProjection( &matrixPerspective, 60, (GLfloat)size.width/size.height, 0.1f, zeye*2);
 
             // kmMat4PerspectiveProjection( &matrixPerspective, 60, (GLfloat)size.width/size.height, 0.1f, 1500);
 
             kmGLMultMatrix(&matrixPerspective);
 
             kmGLMatrixMode(KM_GL_MODELVIEW);
             kmGLLoadIdentity();
             kmVec3 eye, center, up;
             kmVec3Fill( &eye, size.width/2, size.height/2, zeye );
             kmVec3Fill( &center, size.width/2, size.height/2, 0.0f );
             kmVec3Fill( &up, 0.0f, 1.0f, 0.0f);
             kmMat4LookAt(&matrixLookup, &eye, &center, &up);
             kmGLMultMatrix(&matrixLookup);
         }
         break ;
//同样省略了一些无关代码
}

 

1
2
3
4
float CCDirector::getZEye( void )
{
     return (m_obWinSizeInPoints.height / 1.1566f);
}

好奇心强的小盆友肯定会问 高亮的地方 60,0.1,1.1566 这都是什么啊,代码里面写魔数不是要tcqtjjtds吗? :)

分析起来其实挺简单的,其实上面有意义的只是那个60度和1.1566两个,远近裁减平面只要合法就ok,那么为啥是这俩值呢,我画了一下图:

cocos-projection

看完了这张图,相信聪明的你也明白了吧,那个1.1566f实际上就是 tan(60/2)*2。

换成别的可以吗,当然可以,只要记得 eyez和fovy是配对的就OK了,比如可视角度 60 换成 90,神奇的1.1566f就要换成2了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值