08
2020
06

场景的平移和缩放

工作中经常要做工作区(场景)的漫游(平移)和缩放功能。

我们不讨论具体的交互细节,使用左键还是右键,滚轮或者双指。

我们只研究抽象的模型。

对于漫游功能,最容易想到的是直接改变场景的x/y坐标。

对于缩放功能,最容易的想到的是直接改变场景的scale属性。

实现起来很简单,但是加上屏幕分辨率变化的情况,就很困难了。

目前,同事用的方法是,屏幕分辨率变化的情况和漫游缩放分层来实现,漫游缩放通过改变显示元件的属性来实现,屏幕分辨率变化,通过调整canvas的width和height来实现。

效果很不错。

但是,由于没有理论的支撑,没有抽象出模型,也存在一些问题。

1、可移植性差;

2、可扩展性差;

3、对于未知的问题,可预测性差;

4、可读性差。

对于应对分辨率变化的情况,最初我总结的模型是:设计-显示尺寸模型。canvas的width/height属性可以理解为设计尺寸,style里边width/height可以理解为显示尺寸。本来我们只需要固定设计尺寸,在开发阶段不用考虑显示尺寸,但是由于分辨率的变化,设计尺寸的宽高比不能保证不变,所以我们还需要动态的调整设计尺寸,保证宽高比不变。但是不管怎么变化,设计尺寸里边的width和height总有一个是不变的。所以我们并不需要额外的存储一些参数。这样可能更好理解一点:对于设计尺寸,宽或高,一个保持不变,另一个进行扩展。

后来发现了这个:https://blog.csdn.net/zqiang_55/article/details/51089479

我们用到的其实就是ExtendViewport,虽然效果上是一样的,但是有理论的支撑,可以封装的更好一点(可以参考别人的封装),对于可能发生的问题,也可以预测(或者别人已经给出了答案)。

对于漫游缩放,可以用摄像机模型。原来直接平移场景,现在平移摄像机,原来直接缩放,现在改为拉近和拉远摄像机,这样在缩放的效果上也会有很大的改善。加缓动效果也更容易一些。

3D里边对相机和视口和相机的研究已经很成熟,我们可以直接拿来用到2D里边。

我们甚至可以通过变换视口和相机的模型来达到不同的效果,这些会变得很简单(可以直接抄别人或者书上的源码)。原来自己写的想要实现这些效果,可能就要花费大量的时间和精力了,写完还会有一堆的bug。



« 上一篇下一篇 »

相关文章:

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。