Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将角度从转换为最小/最大旋转的百分比_C#_Unity3d - Fatal编程技术网

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

C# 将角度从转换为最小/最大旋转的百分比,c#,unity3d,C#,Unity3d,我有一个对象,我想设置它的轴量(介于0和1之间的数字)。当轴为0时,项目将设置为其最小角度,当轴为1时,项目将轴为其最大角度 通过获取此值,将基于用户手指在屏幕上的位置,因此对象将查看手指。在0和1之间转换值 目前,我有这个,但它最大化了枢轴为1,因为角度始终大于1 public void SetAngle(Touch touch) { Vector3 position = Camera.main.ScreenToWorldPoint(new Vector3(touch.position.x

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

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

目前,我有这个,但它最大化了枢轴为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);
}
在动画中,当
角度
0
时,
x
旋转为
-100
,当
角度
1
时,
-160
。如何将触摸值从矢量3角度转换为0-1值

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

我需要的是黄点所在位置的
0
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;

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

因此,从您的图像:

请尝试以下代码:

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;

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

以下是最适合我的:

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

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

以下是对我最有效的方法:

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

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

touch.position是世界位置还是屏幕位置?不确定这个角度代表什么不,这是屏幕坐标。transform.position在世界位置吗?如果是的话。。。将屏幕坐标与世界坐标进行比较并获得这些向量之间的角度,这并没有多大意义。“角度”是动画偏移距离的百分比。其中
0
是动画的开始(其中x旋转为-100),而
1
是动画的结束(其中x旋转为-160)。您的参考点是什么?我想这是对摄像机的。当前,浮动角度=Vector3.angle(位置,transform.position);是否根据两个对象的世界位置获取它们之间的角度是触摸。位置是世界位置还是屏幕位置?不确定这个角度代表什么不,这是屏幕坐标。transform.position在世界位置吗?如果是的话。。。将屏幕坐标与世界坐标进行比较并获得这些向量之间的角度,这并没有多大意义。“角度”是动画偏移距离的百分比。其中
0
是动画的开始(其中x旋转为-100),而
1
是动画的结束(其中x旋转为-160)。您的参考点是什么?我想这是对摄像机的。当前,浮动角度=Vector3.angle(位置,transform.position);是根据两个对象的世界位置获取两个对象之间的角度。对象移动,但几乎不移动。我不确定这是否是因为数学是在
z
轴上旋转的,但你所拥有的
x
轴实际上是游戏中的
z
轴。当输出
angleA0normalized
时,无论我的手指在屏幕上的什么位置,我都会得到一个介于
0.45
0.6
之间的数字。是什么导致了这种情况?@GetOffMyLawn--1)如果这是Z轴,您是否将
新向量3(1,0,0)
更改为
新向量3(0,0,1)
--2) 它是正轴还是负轴
新矢量3(0,0,-1)
--3) 所有向量都在同一平面上吗?如果您在YZ平面上,那么vecOA和vecOB的x值必须等于零-->
vecOA.x=0
vecOB.x=0对象移动,但几乎不移动。我不确定这是否是因为数学是在
z
轴上旋转的,但你所拥有的
x
轴实际上是游戏中的
z
轴。当输出
angleA0normalized
时,无论我的手指在屏幕上的什么位置,我都会得到一个介于
0.45
0.6
之间的数字。是什么导致了这种情况?@GetOffMyLawn--1)如果这是Z轴,您是否将
新向量3(1,0,0)
更改为
新向量3(0,0,1)
--2) 它是正轴还是负轴
新矢量3(0,0,-1)
--3) 所有向量都在同一平面上吗?如果您在YZ平面上,那么vecOA和vecOB的x值必须等于零-->
vecOA.x=0
vecOB.x=0