将角度从转换为最小/最大旋转的百分比

Posted

技术标签:

【中文标题】将角度从转换为最小/最大旋转的百分比【英文标题】:Convert angle from to percentage of min/max rotation 【发布时间】:2018-12-01 07:48:55 【问题描述】:

我有一个对象,我想设置它的轴心量(01 之间的数字)。当轴心为0 时,项目将设置为其最小角度,当它为1 时,项目将旋转至其最大角度。

通过获取此值将基于用户手指在屏幕上的位置,因此对象将注视手指。在01 之间转换值。

目前我有这个,但由于角度始终超过 1,因此它将枢轴最大化为 1。

public void SetAngle(Touch touch) 
  Vector3 position = Camera.main.ScreenToWorldPoint(new Vector3(touch.position.x, touch.position.y, Camera.main.nearClipPlane));
  float angle = Vector3.Angle(position, transform.position);
  CurrentAngle = angle;
  ToasterAnimator.SetFloat("Angle", CurrentAngle);

在动画中,x 旋转为 -100Angle0-160Angle1。如何将矢量3角度的触摸值转换为0-1值?

黑线 = 最小/最大角度 绿线 = 所需角度 红线 = 接地 黄点 = 用户手指

我需要的是一个介于 01 之间的数字,代表那个黄点的位置。

【问题讨论】:

touch.position 是世界位置还是屏幕位置?不确定这个角度代表什么 不,是屏幕坐标。 transform.position 在世界位置吗?如果是这样的话......将屏幕坐标与世界坐标进行比较并获得这些向量之间的角度并没有多大意义。 “角度”是动画偏移距离的百分比。其中0 是动画的开始(x 旋转为-100),1 是动画的结束(x 旋转为-160)。 你的参考点是什么?我假设它是相机。目前,浮动角度 = Vector3.Angle(position, transform.position);正在根据它们的世界位置获取两个对象之间的角度 【参考方案1】:

所以,从你的图像开始:

试试这个代码:

Vector3 position = Camera.main.ScreenToWorldPoint(new Vector3(touch.position.x, touch.position.y, Camera.main.nearClipPlane));
// subtract transform.position to bring it to local space
Vector3 vecOA = position - transform.position;
// subtract transform.position to bring it to local space
//Vector3 vecOB = (transform.position + new Vector3(1,0,0)) - transform.position;
Vector3 vecOB = new Vector3(1,0,0);
// angle between finger and X axis
float angleAB = Vector3.Angle(vecOA, vecOB);
// angle between point 1 and X axis
float angle1B = 20;
// angle between finger and point 1
float angleA1 = angleAB - angle1B;
// angle between point 0 and point 1
float angle01 = 60;
// angle between point 0 and finger
float angleA0 = angle01 - angleA1;
// angle between point 0 and finger normalized to [0,1]
float angleA0normalized = angleA0 / angle01;

希望代码中的cmets可以理解

【讨论】:

物体移动,但几乎没有。我不确定是不是因为数学在z 轴上旋转,但你所拥有的x 轴实际上是游戏中的z 轴。 当输出angleA0normalized 时,无论我的手指在屏幕上的哪个位置,我都会得到一个介于0.450.6 之间的数字。这是什么原因造成的? @GetOffMyLawn --1) 如果那是 Z 轴,您是否将 new Vector3(1,0,0) 更改为 new Vector3(0,0,1) ? --2) 是正轴还是负轴new Vector3(0,0,-1)? --3)所有向量都在同一平面上吗?如果您在 YZ 平面上,则 vecOA 和 vecOB 的 x 值必须为零 --> vecOA.x = 0;vecOB.x = 0;【参考方案2】:

以下是最适合我的方法:

public void SetAngle(Touch touch) 
  Vector3 screenSpace = Camera.main.WorldToScreenPoint(transform.position);
  float angle = (Mathf.PI / 2) - Mathf.Atan2(touch.position.y - screenSpace.y, touch.position.x - screenSpace.x);
  CurrentAngle = (angle - 20 * Mathf.PI / 180) / ((60 - 20) * Mathf.PI / 180);

  ToasterAnimator.SetFloat("Angle", CurrentAngle);

我使用屏幕空间而不是世界空间来计算百分比,这似乎工作得很好。

【讨论】:

以上是关于将角度从转换为最小/最大旋转的百分比的主要内容,如果未能解决你的问题,请参考以下文章

需要弹性说明:宽度、最小(最大)宽度、显式宽度、显式最小(最大)宽度、测量宽度、测量最小宽度、百分比宽度

将总和转换为百分比

父级具有最小/最大高度时的 CSS 百分比高度

Amazon ECS 中的最小健康百分比和最大百分比是多少

最小(最大)处理器状态的 API,C++

javascript 计算两个值(最小值,最大值)和值之间的百分比