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

时间:2018-06-21 21:29:11

标签: c# unity3d

我有一个要设置其枢纽量的对象(介于01之间的数字)。当枢轴为0时,该项目将设置为其最小角度;当枢轴为1时,该项目将枢转到其最大角度。

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

目前我有这个,但是由于角度总是大于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-100Angle的旋转为0,而-160为{{1}时的Angle的旋转}。如何将触摸值从vector3角度转换为0-1值?

Diagram

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

我需要的是介于10之间的黄点所在的数字。

2 个答案:

答案 0 :(得分:2)

因此,从您的图片出发:

enter image description here

尝试此代码:

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;

我希望代码中的注释可以理解

答案 1 :(得分:0)

这是最适合我的方法:

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);
}

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