我有一个要设置其枢纽量的对象(介于0
和1
之间的数字)。当枢轴为0
时,该项目将设置为其最小角度;当枢轴为1
时,该项目将枢转到其最大角度。
通过获取此值将基于用户手指在屏幕上的位置,因此对象将看着手指。在0
和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
为-100
时Angle
的旋转为0
,而-160
为{{1}时的Angle
的旋转}。如何将触摸值从vector3角度转换为0-1值?
我需要的是介于1
和0
之间的黄点所在的数字。
答案 0 :(得分:2)
因此,从您的图片出发:
尝试此代码:
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);
}
我使用屏幕空间而不是世界空间来计算百分比,这似乎效果很好。