CCNode::transform()
kmMat4transfrom4x4;
//Convert3×3into4×4matrix
CCAffineTransformtmpAffine=
->nodeToParentTransform();
CGAffineToGL(&tmpAffine,transfrom4x4.mat);
//UpdateZvertexmanually
transfrom4x4.mat[14]=m_fVertexZ;
kmGLMultMatrix(&transfrom4x4);
//XXX:Expensivecalls.Camerashouldbeintegratedintothecachedaffinematrix
(m_pCamera!=NULL&&!(m_pGrid!=NULL&&m_pGrid->isActive()))
{
translate=(m_obAnchorPointInPoints.x!=0.0f||m_obAnchorPointInPoints.y!=0.0f);
(translate)
kmGLTranslatef(RENDER_IN_SUBPIXEL(m_obAnchorPointInPoints.x),RENDER_IN_SUBPIXEL(m_obAnchorPointInPoints.y),0);
m_pCamera->locate();
(translate)
kmGLTranslatef(RENDER_IN_SUBPIXEL(-m_obAnchorPointInPoints.x),RENDER_IN_SUBPIXEL(-m_obAnchorPointInPoints.y),0);
}
一般来说游戏中会大量使用旋转,缩放,平移等仿射变换( 所谓仿射变换是指在线性变换的基础上加上平移,平移不是线性变换)。2D计算机图形学中的仿射变换通常是通过和3×3齐次矩阵相乘来实现的。Cocos2d中的仿射变换使用了Quartz 2D中的CGAffineTransform类来表示:
struct
CCAffineTransform{
float
a,b,c,d;
tx,ty;
};
typedef
CGAffineTransformCGAffineTransform;
在Cocos2d-x中,绘制是使用了openies的,所以CGAffineTransform只是用来表示2d仿射变换的,最终还是要转化成OpenglES的4*4变换矩阵的,因为OpenGL是3d的。这个转换工作是由 CGAffineToGL来完成的。
变换后的矩阵关系如下:
|m11m21m31m41||ac0tx||m12m22m32m42||bd0ty||m13m23m33m43|<=>|0010||m14m24m34m44||0001|
最后来看一个概念:
“节点坐标系”指的是以一个节点作为参考而产生的坐标系,换句话说,它的任何一个子节点的坐标值都是由这个坐标系确定的,通过以上方法,我们可以方便地处理触摸点,也可以方便地计算两个不同坐标系下点之间的方向关系。
这里是整个启动过程的一部分,后面我们还会根据Cocos2d-x的内存机制和回调机制来进行分析,也会有一些深层次的渲染知识。
来源网址:http://iqll.sinaapp.com/cocos2dx-启动过程详解一:渲染/ (编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|