愿你出走半生,归来仍是少年!
Cesium For Unity自带的Dynamic Camera,拥有优秀的动态展示效果,但是其对于场景的交互方式用起来不是很舒服。
通过模仿Cesium JS 的交互方式,实现在Unity中的交互:
- 通过鼠标左键拖拽实现场景平移
- 通过滚轮滑动实现场景的缩放
- 通过滚轮按下拖拽实现旋转
1.平移
通过鼠标左键的按下和弹起标记是否进行平移拖拽,拖拽期间将鼠标在上一帧和当前帧的坐标进行比较得出移动向量,用相机的当前位置减去移动向量得出相机新的位置。通过相机的反向移动实现场景的正向移动。
2.缩放
网上有很多通过鼠标滚轮进行场景缩放的文章,但是都存在相机位置不同时缩放速度相同的情况,在实际的三维场景缩放中会出现相机距地远近不同时缩放太慢或太快的情况。
通过获取屏幕中心点的坐标,计算相机与其距离,每次滚轮缩放时相机位置增加距离的十分之一,实现根据屏幕中心的距离缩放。
3.旋转
Cesium JS中旋转是通过滚轮按下后通过移动鼠标进行旋转,旋转中心为鼠标点击的位置。
在Unity中通过鼠标滚轮按下时确认此次的旋转中心,并通过鼠标的移动进行旋转。鼠标横向移动则对场景进行水平方向的选择,鼠标纵向移动则对场景进行垂直方向的旋转。
在计算旋转角度时,可通过屏幕大小设定旋转角度。横向上,半个屏幕宽度为360°的水平旋转;纵向上,半个屏幕高度为180° 的垂直旋转。
4.总结
至此,相同于Cesium JS 的相机操作完成。实现了在Windows(android上好像不行)上的平移、缩放、旋转。