Unity-带旋转的Sin&Cos圆周运动

时间:2018-09-24 17:13:15

标签: unity3d trigonometry sin cos

我正在尝试计算物体周围的圆周运动(轨道)。我拥有的代码给了我一个围绕物体的不错的圆形轨道。问题是当我旋转物体时,轨道的行为就像物体没有旋转一样。

我在下面放置了一个非常简单的图表,试图对其进行更好的解释。左边是圆柱体直立时得到的东西,中间是当前物体旋转时得到的东西。右边的图像是我想要发生的事情。

enter image description here

float Gx = target.transform.position.x - ((Mathf.Cos(currentTvalue)) * (radius));
float Gz = target.transform.position.z - ((Mathf.Sin(currentTvalue)) * (radius));
float Gy = target.transform.position.y;
Gizmos.color = Color.green;
Gizmos.DrawWireSphere(new Vector3(Gx, Gy, Gz), 0.03f);

我如何获得随物体旋转而变化的轨道?我尝试将轨道位置“ new Vector3(Gx,Gy,Gz)”乘以对象的旋转:

Gizmos.DrawWireSphere(target.transform.rotation*new Vector3(Gx, Gy, Gz), 0.03f);

但是那似乎什么都没做?

1 个答案:

答案 0 :(得分:2)

之所以发生这种情况,是因为您是在世界空间坐标中计算向量(Gx,Gy,Gz)的,而没有考虑target对象的旋转。

一种满足您需求的方法是使用target对象的局部空间坐标计算该旋转,然后将其转换为世界空间坐标。这将正确地使您的计算考虑target对象的旋转。

float Gx = target.transform.localPosition.x - ((Mathf.Cos(currentTvalue)) * (radius));
float Gz = target.transform.localPosition.z - ((Mathf.Sin(currentTvalue)) * (radius));
float Gy = target.transform.localPosition.y;

Vector3 worldSpacePoint = target.transform.TransformPoint(Gx, Gy, Gz);

Gizmos.color = Color.green;
Gizmos.DrawWireSphere(worldSpacePoint, 0.03f);

请注意,我不是使用target.transform.position来检索给定变换的世界空间坐标,而是使用target.transform.localPosition来进行计算,该方法将检索给定变换的局部空间坐标

此外,我正在调用TransformPoint()方法,该方法会将在本地空间中计算出的坐标转换为在世界空间中的相应值。 / p>

然后,您可以安全地调用Gizmos.DrawWireSphere()方法,该方法需要世界空间坐标才能正常工作。