随机旋转发生,我不明白
Random rotation happening, I don't get it
我有一个场景是这样的:
我有播放器对象,它是一个 Z 锁定的立方体,我使用脚本使用各种 AddForce 调用来移动它。里面最重要的方法是这个:
public void SetDirections(Vector3 down)
{
down.Normalize();
this.down = down;
forward = Vector3.Cross(down, new Vector3(0, 0, 1));
}
同一脚本中与旋转相关的其他代码是这样的:
void Turning ()
{
// Irányitó gombok hatására a Taxi elforduljon 180fokot
Vector3 lookDirection = forward;
// balra forditás
if (inputh > 0)
{
faceLeft = false;
}
// jobbra forditás
if (inputh < 0)
{
faceLeft = true;
}
if (faceLeft)
{
lookDirection *= -1;
}
transform.LookAt(transform.position + lookDirection, new Vector3(0, 1, 0));
}
我在场景中的另一个物体上有这个位:
public class RotateGravity : MonoBehaviour
{
public GameObject Taxi;
public float MinLimit, MaxLimit;
private TaxiController tControl;
private Rigidbody tRigidbody;
private Transform tTransform;
void Start()
{
tControl = Taxi.GetComponent<TaxiController>();
tRigidbody = Taxi.GetComponent<Rigidbody>();
tTransform = Taxi.GetComponent<Transform>();
}
void OnTriggerStay()
{
Vector3 originalDown = tControl.Down;
Vector3 newDown = tTransform.position - gameObject.transform.position;
if (Vector3.SignedAngle(newDown, new Vector3(1, 0, 0), new Vector3(0, 0, 1)) > MinLimit &&
Vector3.SignedAngle(newDown, new Vector3(1, 0, 0), new Vector3(0, 0, 1)) < MaxLimit)
{
newDown.Normalize();
tControl.SetDirections(newDown);
float angle = Vector3.SignedAngle(originalDown, newDown, new Vector3(0, 0, 1));
tRigidbody.velocity = Quaternion.AngleAxis(angle, new Vector3(0, 0, 1)) * tRigidbody.velocity;
}
Debug.Log("Stay: " + newDown);
}
void OnTriggerExit()
{
float angle = Vector3.Angle(tTransform.position - gameObject.transform.position, new Vector3(1, 0, 0));
Vector3 newDown;
float newAngle;
if (Mathf.Abs(angle - MinLimit) < Mathf.Abs(angle - MaxLimit))
{
newDown = Quaternion.AngleAxis(MinLimit, new Vector3(0, 0, -1)) * new Vector3(1, 0, 0);
newAngle = MinLimit;
}
else
{
newDown = Quaternion.AngleAxis(MaxLimit, new Vector3(0, 0, -1)) * new Vector3(1, 0, 0);
newAngle = MaxLimit;
}
Debug.Log("Exit: " + newDown + " " + newAngle);
tControl.SetDirections(newDown);
tRigidbody.velocity = Quaternion.AngleAxis(newAngle, new Vector3(0, 0, 1)) * tRigidbody.velocity;
}
}
基本上这个想法是当玩家沿着物体移动时重力方向会改变,所以只要向右移动它就会围绕物体旋转,介于 MinLimit 和 MaxLimit 角度之间。它是做什么的。最后我想把方向固定在这些限制上,这就是奇怪的事情发生的地方。在我的示例中,我将 MinLimit 设置为 0,将 MaxLimit 设置为 90。这意味着玩家从左侧水平进入,重力从 (0, -1, 0) 变为 (1, 0, 0)。除了,最后玩家对象围绕其前向矢量旋转 90 度。
有人可以解释我哪里出错了吗?我讨厌 Unity 中的旋转 :(
在下面的视频中,红色球体只是玩家对象下方的一个指示器,以更好地显示其朝向。
https://www.youtube.com/watch?v=z4p9UQb7inA
好吧,我没有在 Turning() 方法中正确设置向上矢量,它指向正 Y 方向,所以当我的前向最终相同时,它不知道将对象旋转到哪里在那个轴上。我很笨我将向上向量设置为指向 -1 * 向下,结果很成功。
我有一个场景是这样的: 我有播放器对象,它是一个 Z 锁定的立方体,我使用脚本使用各种 AddForce 调用来移动它。里面最重要的方法是这个:
public void SetDirections(Vector3 down)
{
down.Normalize();
this.down = down;
forward = Vector3.Cross(down, new Vector3(0, 0, 1));
}
同一脚本中与旋转相关的其他代码是这样的:
void Turning ()
{
// Irányitó gombok hatására a Taxi elforduljon 180fokot
Vector3 lookDirection = forward;
// balra forditás
if (inputh > 0)
{
faceLeft = false;
}
// jobbra forditás
if (inputh < 0)
{
faceLeft = true;
}
if (faceLeft)
{
lookDirection *= -1;
}
transform.LookAt(transform.position + lookDirection, new Vector3(0, 1, 0));
}
我在场景中的另一个物体上有这个位:
public class RotateGravity : MonoBehaviour
{
public GameObject Taxi;
public float MinLimit, MaxLimit;
private TaxiController tControl;
private Rigidbody tRigidbody;
private Transform tTransform;
void Start()
{
tControl = Taxi.GetComponent<TaxiController>();
tRigidbody = Taxi.GetComponent<Rigidbody>();
tTransform = Taxi.GetComponent<Transform>();
}
void OnTriggerStay()
{
Vector3 originalDown = tControl.Down;
Vector3 newDown = tTransform.position - gameObject.transform.position;
if (Vector3.SignedAngle(newDown, new Vector3(1, 0, 0), new Vector3(0, 0, 1)) > MinLimit &&
Vector3.SignedAngle(newDown, new Vector3(1, 0, 0), new Vector3(0, 0, 1)) < MaxLimit)
{
newDown.Normalize();
tControl.SetDirections(newDown);
float angle = Vector3.SignedAngle(originalDown, newDown, new Vector3(0, 0, 1));
tRigidbody.velocity = Quaternion.AngleAxis(angle, new Vector3(0, 0, 1)) * tRigidbody.velocity;
}
Debug.Log("Stay: " + newDown);
}
void OnTriggerExit()
{
float angle = Vector3.Angle(tTransform.position - gameObject.transform.position, new Vector3(1, 0, 0));
Vector3 newDown;
float newAngle;
if (Mathf.Abs(angle - MinLimit) < Mathf.Abs(angle - MaxLimit))
{
newDown = Quaternion.AngleAxis(MinLimit, new Vector3(0, 0, -1)) * new Vector3(1, 0, 0);
newAngle = MinLimit;
}
else
{
newDown = Quaternion.AngleAxis(MaxLimit, new Vector3(0, 0, -1)) * new Vector3(1, 0, 0);
newAngle = MaxLimit;
}
Debug.Log("Exit: " + newDown + " " + newAngle);
tControl.SetDirections(newDown);
tRigidbody.velocity = Quaternion.AngleAxis(newAngle, new Vector3(0, 0, 1)) * tRigidbody.velocity;
}
}
基本上这个想法是当玩家沿着物体移动时重力方向会改变,所以只要向右移动它就会围绕物体旋转,介于 MinLimit 和 MaxLimit 角度之间。它是做什么的。最后我想把方向固定在这些限制上,这就是奇怪的事情发生的地方。在我的示例中,我将 MinLimit 设置为 0,将 MaxLimit 设置为 90。这意味着玩家从左侧水平进入,重力从 (0, -1, 0) 变为 (1, 0, 0)。除了,最后玩家对象围绕其前向矢量旋转 90 度。
有人可以解释我哪里出错了吗?我讨厌 Unity 中的旋转 :(
在下面的视频中,红色球体只是玩家对象下方的一个指示器,以更好地显示其朝向。 https://www.youtube.com/watch?v=z4p9UQb7inA
好吧,我没有在 Turning() 方法中正确设置向上矢量,它指向正 Y 方向,所以当我的前向最终相同时,它不知道将对象旋转到哪里在那个轴上。我很笨我将向上向量设置为指向 -1 * 向下,结果很成功。