【适配】屏幕拖拽-滑动手感在不同分辨率下的机型适配

接到一个需求是类似下图的3D多房间视角,需要拖拽屏幕

问题

在做这种屏幕拖拽的时候发现,需要拖拽起来有跟手的感觉,会存在不同分辨率机型的适配问题。

即:美术调整好了机型1的手感,能做到手指按下顶层地板上下挪动,看起来手指始终按在顶层地板上(跟手)到了分辨率不同的机型2,可能首次按在顶层地板上,往下一划手指看起来就按到下面的房间了

原因分析

不同屏幕的分辨率不同,但相机缩放只能对准长/宽一边。如此缩放就一定会导致没对准的那一边屏占比发生变化

以相机水平向对准为例:

对于水平长度X比较长的屏幕,看到的楼层屏占比较大,拖动一层划过的长度比较长

但对于水平长度X比较窄的屏幕,看到的楼层屏占比就比较小,拖动一层划过的绝对长度更短

我们计算++拖动距离++ 应用到++相机移动++ 的数值,一般是上图标识的++手指拖拽轨迹++ 的长度: δ y = y 2 − y 1 \delta y = y_2 - y_1 δy=y2−y1

而3d游戏,不同分辨率的屏幕会导致层高在屏幕上渲染出来的高度不一样。水平向对齐的相机,屏幕越宽(X越大),渲染出来的层高越大。

解决

知道了原因以后,其实只需要对不同分辨率的屏幕 乘上一个系数就可以了

那么具体应该乘多少呢?

具体系数

先说结论:对于水平向对准的相机,竖直滑动的系数为: x 1 x 2 \frac{x_1}{x_2} x2x1

其中 x 1 x_1 x1是一个基准值,是美术同学调整好的机型1的水平像素值

x 2 x_2 x2则是当前机型的水平像素值

推导

以水平向对准的相机为例

设屏幕尺寸水平像素x,竖直像素为y。相机映射能看到的楼层的实际高度为h,实际宽度为m。实际楼层映射到二维屏幕的映射系数为f,即: x × f = m x\times f=m x×f=m、 y × f = m y\times f=m y×f=m

因为相机是水平向对准,不同机型虽然x不同,但m是一样的。这也是不同机型唯一相同的字母

问题就抽象成了:

已知: x 1 x_1 x1, y 1 y_1 y1, x 2 x_2 x2, y 2 y_2 y2,且 x 1 × f 1 = m x_1\times f_1=m x1×f1=m, y 1 × f 1 = h 1 y_1\times f_1=h_1 y1×f1=h1, x 2 × f 2 = m x_2\times f_2=m x2×f2=m, y 2 × f 2 = h 2 y_2\times f_2=h_2 y2×f2=h2

求:系数 n n n,使得 δ y 1 = n × δ y 2 \delta y_1=n\times \delta y_2 δy1=n×δy2时, δ h 1 = δ h 2 \delta h_1=\delta h_2 δh1=δh2


x 1 × f 1 = m x_1\times f_1=m x1×f1=m
y 1 × f 1 = h 1 y_1\times f_1=h_1 y1×f1=h1

得到
m x 1 = h 1 y 1 \frac{m}{x_1}=\frac{h_1}{y_1} x1m=y1h1即: m = x 1 × h 1 y 1 m=\frac{x_1\times h_1}{y_1} m=y1x1×h1

代入机型2的 m x 2 = h 2 y 2 \frac{m}{x_2}=\frac{h_2}{y_2} x2m=y2h2,得到:
x 1 × h 1 x 2 × y 1 = h 2 y 2 \frac{x_1\times h_1}{x_2\times y_1}=\frac{h_2}{y_2} x2×y1x1×h1=y2h2

有 h y = δ h δ y \frac{h}{y}=\frac{\delta h}{\delta y} yh=δyδh ,得到:

x 1 × δ h 1 x 2 × δ y 1 = δ h 2 δ y 2 \frac{x_1\times \delta h_1}{x_2\times \delta y_1}=\frac{\delta h_2}{\delta y_2} x2×δy1x1×δh1=δy2δh2

即:
δ y 1 = x 1 × δ h 1 x 2 × δ h 2 × y 2 \delta y_1=\frac{x_1\times \delta h_1}{x_2\times \delta h_2}\times y_2 δy1=x2×δh2x1×δh1×y2

又: δ h 1 = δ h 2 \delta h_1=\delta h_2 δh1=δh2

得到: δ y 1 = x 1 x 2 × y 2 \delta y_1=\frac{x_1}{x_2}\times y_2 δy1=x2x1×y2

即: n = x 1 x 2 n=\frac{x_1}{x_2} n=x2x1

相关推荐
tainshuai1 小时前
用 KNN 算法解锁分类的奥秘:从电影类型到鸢尾花开
算法·分类·数据挖掘
幻雨様5 小时前
UE5多人MOBA+GAS 45、制作冲刺技能
android·ue5
Coovally AI模型快速验证7 小时前
农田扫描提速37%!基于检测置信度的无人机“智能抽查”路径规划,Coovally一键加速模型落地
深度学习·算法·yolo·计算机视觉·transformer·无人机
pusue_the_sun7 小时前
数据结构:二叉树oj练习
c语言·数据结构·算法·二叉树
RaymondZhao348 小时前
【全面推导】策略梯度算法:公式、偏差方差与进化
人工智能·深度学习·算法·机器学习·chatgpt
三只坚果8 小时前
blender制作动画导入unity两种方式
unity·游戏引擎·blender
zhangfeng11338 小时前
DBSCAN算法详解和参数优化,基于密度的空间聚类算法,特别擅长处理不规则形状的聚类和噪声数据
算法·机器学习·聚类
benben0448 小时前
《Unity Shader入门精要》学习笔记二
unity·unity shader
啊阿狸不会拉杆9 小时前
《算法导论》第 32 章 - 字符串匹配
开发语言·c++·算法
小学生的信奥之路9 小时前
洛谷P3817题解:贪心算法解决糖果分配问题
c++·算法·贪心算法