最近项目中有个需求,需要让N个物体围绕一个点旋转,Unity中旋转本身比较好实现,关键是为了美观,需要围绕该点的物体间隔一致,也就是进行等分啦。所以套用了一下公式,实现了这个需求,记录一下,也许以后还用的到。
写一个类定义一下用到的点,由于我的摄像机是在上方俯视的,所以坐标点以x,z表示:
public class Point
{
public float x;
public float z;
public Point()
{
}
public Point(float x, float z)
{
this.x = x;
this.z = z;
}
}
接着是获取所有坐标的计算用的类:
public class CalculatePoints {
/// <summary>
/// 获得圆心坐标为center 半径为r的圆cutNum等分后的圆上坐标
/// </summary>
/// <param name="center"></param>
/// <param name="r"></param>
/// <param name="cutNum"></param>
/// <returns></returns>
public static Point[] GetAll(Point center,float r,int cutNum)
{
Point[] points = new Point[cutNum];
float angle = 360 / cutNum;
for (int i = 0; i < cutNum; i++)
{
Point point = new Point();
points[i] = point;
float redians = (Mathf.PI/180)* ((i + 1) * angle);
points[i].x = center.x + Mathf.Sin(redians) * r;
points[i].z = center.z + Mathf.Cos(redians) * r;
}
return points;
}
}
第一参数代表圆心的点坐标,第二个参数代表圆的半径,第三个参数代表等分数,大概解释一下里面的公式
首先用360度除以等分数获得每个等分的角度。
用PI除以180再乘以角度数转为弧度,用for循环就可以得知第i个点的角度数,
x坐标为圆心x坐标加上Sin(弧度数)乘以圆的半径,z坐标为圆心z坐标加上Cos(弧度数)乘以圆的半径,得出所有的点的坐标。
下面再写一个测试类测试一下,在Unity中跑可以立刻看到效果:
public class TestCalculate : MonoBehaviour {
public List<GameObject> cubes;
void Start () {
Point[] points = CalculatePoints.GetAll(new Point(0,0),10, cubes.Count);
for (int i = 0; i < cubes.Count; i++)
{
cubes[i].transform.position = new Vector3(points[i].x,0, points[i].z);
cubes[i].transform.eulerAngles = new Vector3(0,180 + (i+1)* 360/cubes.Count,0);
}
}
}
把脚本挂载在一个物体上,在创建几个cube拖到List里运行就可以看到效果,cubes[i].transform.eulerAngles = new Vector3(0,180 + (i+1)* 360/cubes.Count,0);其中这句主要作用是让方块背向圆心,如果把公式里的180去掉不加的话,则是面向圆心,这个可以按照自己的需求进行旋转。