自制45度2D引擎之坐标转换更新版

2 篇文章 0 订阅
1 篇文章 0 订阅

在上一个博文中我有提到自制45度坐标转换

http://blog.csdn.net/stophin/article/details/19247903

点击打开链接

这次是一个新的转换方法,旧版本在坐标转换上还存在一些问题,并且计算量大,这些都将在本博文中提到并解决。

 

45度坐标转换,说得简单一点就是将平面的矩形转换为斜面上的斜平行四边形,和其逆转换。有许多游戏是直接使用正方形到菱形的转换,

这只是这种转换的一个特例。那么为什么要做这种转换呢?因为平面矩形用于控制物体的位置,并且可以支撑更多的算法,例如A*寻路,

斜面则用于显示物体,并且可以根据物体贴图的参数来计算物体在平面上的几何尺寸。平面和斜面是息息相关的。

 

1.平面坐标到旋转坐标

首先有一个对齐普通坐标的矩形,可以将它看成任意物体的几何包围圈,或者更像是物体的上视图。将它绕原点旋转角度g,旋转后的坐标很容易计算:

对于矩形的任意顶点(x,y),转换成极坐标:

r = sqrt(x * x + y * y);

h = arctan(y / x);

x  = r * cos(h); y = r * sin(h);

旋转角度g以后(顺时针):

x' = r * cos(h - g);

y = r * sin(h - g);

 

 

2.旋转坐标到斜面坐标

如图。旧版本采用先斜面再旋转的方法,在转换中需要两次用到椭圆公式,所以计算量增大,所以没有使用圆的公式来的方便。

新版本则使用先旋转再斜面,简单直观。这或许就是叫做逆向思维,编程就是需要这种思想,可以将复杂的事情变简单。

从旋转到斜面的计算公式,可以参考旧版本的平面系到斜面系的转换部分,因为虽然旋转过了,但旋转后的图形坐标仍然属于平面系,

可以直接映射到斜面系。

首先是图中蓝色部分:对于旋转后的矩形,取其各顶点y轴射影为椭圆半长轴,定椭圆离心率e,这样做出来的椭圆组就是一组平行椭圆。

斜面系有一个斜面y坐标(紫色线),和上面的椭圆组相交,拉取交点做平行x轴并与旋转矩形各顶点x轴射影线(绿色)相交的线(绿色),

交点连接成为最终的斜平行四边形(红色)。

公式参考(取自旧版本平面系到斜面系转换

3.关于物体的几何计算

上图是一个典型的贴图。黑色矩形框为图片的大小,以左下角位坐标进行贴图。红色部分就是这个几何体的"占地面积",按上面两步进行逆向转换到平面系,红色部分就可以转换成集合体真实的几何尺寸,可以进行碰撞检测等等。计算真实几何尺寸有很多方法。我使用先转换在计算的方法:

左下角坐标:invTrans(x , y - f)

右下角坐标:invTrans(x + s, y)

右上角坐标:invTrans(x + w, y - (h - f - t))

其中invTrans就是逆向转换函数,传入的参数就是图上的红色部分的三个关键点(自己找找看)。

得到三个坐标后,就可以通过得到几何尺寸了。

4.图片的深度排序,视口剪切和一些其他的算法

图片的深度排序应该算是一大算法了。加上后面的A*算法,有时间的话会对这部分进行讨论。不过网上都有这些算法的讲解,我也是参照网上的做法,

想了解的朋友可以去搜索了解。

如果借助html的z-index和display属性,可以很好地对物体进行深度排序以及剪切。如果用C++来制作的话,需要在每一帧注意有哪些几何体需要渲染,这个可以用

一个渲染链表来实现,由链表顶端到下面深度依次递减,并且在视口外的集合体从链表中移除掉,重画时按链表依次渲染,就有了深度和剪切效果。

5.测试

然后最后是测试了,我用javascript写了一个引擎,点击打开链接

或者到我的网站主页http://www.stophin.com/ 游戏目录下找到RPG_new.html这个文件,打开就能用了。

测试画面有相应的截图。我还为这个引擎添加了A*寻路。左键或右键点击地图会进行寻路。

C++版本的也有一个测试,http://ww3.stophin.com/download 目录下面的Package.rar这个包。使用EGE进行图形绘制。
 

6.存在问题

上面测试例中,几何尺寸计算可以算是一个最大的问题。下图是测试时看到的状态,图中标明B或者A的就是物体的映射几何尺寸。可以看到A和它下面的B显然错位,

最主要还是因为几何尺寸计算中,shift, tall, shift在途中很难丈量精准,

更新:

以上网站已经不再维护,最新改进代码可以查看github:

https://github.com/stophin/Engine_EGE

README.md中有android版本和html版本的仓库连接

或者gitee

https://gitee.com/stophin/Nano

https://gitee.com/stophin/Engine_EGE

推荐gitee,毕竟国内网要比github国外网快一些。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
在 HALCON 中进行 2D 坐标转换需要用到以下几个算子: 1. affine_trans_point_2d 该算子用于将一个 2D 点进行仿射变换。示例代码如下: ``` affine_trans_point_2d(HomMat2D, PointX, PointY, out TransX, out TransY); ``` 其中,`HomMat2D` 是输入参数,表示需要进行仿射变换的 2D 齐次变换矩阵;`PointX`、`PointY` 分别是需要进行仿射变换的 2D 点的 X、Y 坐标;`TransX`、`TransY` 分别是输出参数,表示输出的 2D 点的 X、Y 坐标。 2. vector_to_hom_mat_2d 该算子用于将一个 2D 向量转换2D 齐次变换矩阵。示例代码如下: ``` vector_to_hom_mat_2d(VectorX, VectorY, Scale, Angle, HomMat2D); ``` 其中,`VectorX`、`VectorY` 分别是需要转换2D 向量的 X、Y 分量;`Scale` 是缩放因子;`Angle` 是旋转角,单位为弧;`HomMat2D` 是输出参数,表示输出的 2D 齐次变换矩阵。 3. hom_mat2d_translate 该算子用于创建一个 2D 齐次变换矩阵,表示一个平移变换。示例代码如下: ``` hom_mat2d_translate(HomMat2DIdentity, -OffsetX, -OffsetY, HomMat2DTranslate); ``` 其中,`HomMat2DIdentity` 是输入参数,表示需要进行平移变换的 2D 齐次变换矩阵;`-OffsetX`、`-OffsetY` 分别是需要平移的 X、Y 轴方向的偏移量;`HomMat2DTranslate` 是输出参数,表示输出的 2D 齐次变换矩阵。 4. hom_mat2d_rotate 该算子用于创建一个 2D 齐次变换矩阵,表示一个旋转变换。示例代码如下: ``` hom_mat2d_rotate(HomMat2DTranslate, Angle, HomMat2DRotate); ``` 其中,`HomMat2DTranslate` 是输入参数,表示需要进行旋转变换的 2D 齐次变换矩阵;`Angle` 是旋转角,单位为弧;`HomMat2DRotate` 是输出参数,表示输出的 2D 齐次变换矩阵。 通过使用以上算子,可以进行各种坐标转换操作,比如平移、旋转等。需要根据具体的应用场景进行调用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值