cocos2d-x的CCAffineTransform相关变换实现原理

cocos2d-x的CCAffineTransform相关变换实现原理,第1张

概述cocos2d-x的CCAffineTransform相关变换实现原理   稍有opengl或3d基础的都知道平移/旋转/缩放这几个基本模型视图变换的实现原理, 最近看了下cocos2d-x相关部分的实现, 了解了这些实现那些各种坐标变换基本不在话下了, cocos2d-x本身还是相对简单的引擎. CCAffineTransform struct CCAffineTransform { float

cocos2d-x的CCAffinetransform相关变换实现原理

  稍有opengl或3d基础的都知道平移/旋转/缩放这几个基本模型视图变换的实现原理,最近看了下cocos2d-x相关部分的实现,了解了这些实现那些各种坐标变换基本不在话下了,cocos2d-x本身还是相对简单的引擎.

CCAffinetransform

struct CCAffinetransform {
float a,b,c,d;
float tx,ty;
};
表示变换矩阵:

构造CCAffinetransform结构

CCAffinetransform __CCAffinetransformMake(float a,float b,float c,float d,float tx,float ty)
{
CCAffinetransform t;
t.a = a; t.b = b; t.c = c; t.d = d; t.tx = tx; t.ty = ty;
return t;
}

单位矩阵

CCAffinetransform CCAffinetransformMakeIDentity()
{
return __CCAffinetransformMake(1.0,0.0,1.0,0.0);
}
将CCAffinetransform构造为单位矩阵:

平移

CCAffinetransform CCAffinetransformTranslate(const CCAffinetransform& t,float ty)
{
return __CCAffinetransformMake(t.a,t.b,t.c,t.d,t.tx + t.a * tx + t.c * ty,t.ty + t.b * tx + t.d * ty);
}
将CCAffinetransform矩阵和平移矩阵的结果:

旋转

复制代码
CCAffinetransform CCAffinetransformRotate(const CCAffinetransform& t,float anAngle)
{
float fSin = sin(anAngle);
float fCos = cos(anAngle);

return __CCAffinetransformMake(    t.a * fCos + t.c * fSin,t.b * fCos + t.d * fSin,t.c * fCos - t.a * fSin,t.d * fCos - t.b * fSin,t.tx,t.ty);

}
复制代码
绕Z轴旋转矩阵右乘以变换矩阵:

缩放

CCAffinetransform CCAffinetransformScale(const CCAffinetransform& t,float sx,float sy)
{
return __CCAffinetransformMake(t.a * sx,t.b * sx,t.c * sy,t.d * sy,t.ty);
}

Concate

复制代码
/* Concatenate t2' tot1’ and return the result:
t’ = t1 * t2 */
CCAffinetransform CCAffinetransformConcat(const CCAffinetransform& t1,const CCAffinetransform& t2)
{
return __CCAffinetransformMake( t1.a * t2.a + t1.b * t2.c,t1.a * t2.b + t1.b * t2.d,//a,b
t1.c * t2.a + t1.d * t2.c,t1.c * t2.b + t1.d * t2.d,//c,d
t1.tx * t2.a + t1.ty * t2.c + t2.tx,//tx
t1.tx * t2.b + t1.ty * t2.d + t2.ty); //ty
}
复制代码

结果相当于t2 . t1

CCPointApplyAffinetransform

复制代码
CCPoint __CCPointApplyAffinetransform(const CCPoint& point,const CCAffinetransform& t)
{
CCPoint p;
p.x = (float)((double)t.a * point.x + (double)t.c * point.y + t.tx);
p.y = (float)((double)t.b * point.x + (double)t.d * point.y + t.ty);
return p;
}
复制代码

CCAffinetransformInvert

复制代码
CCAffinetransform CCAffinetransformInvert(const CCAffinetransform& t)
{
float determinant = 1 / (t.a * t.d - t.b * t.c);

return __CCAffinetransformMake(determinant * t.d,-determinant * t.b,-determinant * t.c,determinant * t.a,determinant * (t.c * t.ty - t.d * t.tx),determinant * (t.b * t.tx - t.a * t.ty) );

} 复制代码 求矩阵的逆矩阵,通过Mathematica计算得:

总结

以上是内存溢出为你收集整理的cocos2d-x的CCAffineTransform相关变换实现原理全部内容,希望文章能够帮你解决cocos2d-x的CCAffineTransform相关变换实现原理所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1072556.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-26
下一篇 2022-05-26

发表评论

登录后才能评论

评论列表(0条)

保存