unity让物体做圆周运动、椭圆运动、双曲线运动

最近突然想到数学知识,一些公式也是忘记了,查阅了一下,就记录下来了。

上代码。新建工程,创建个MotionOfAnObject类,挂空物体或者摄像机上ok了。当然,你也可以用拖尾组件,做拖尾效果。也可以画圆、椭圆、双曲线。思路:用list把路过的点保存下来,可以把点连成线,读者可以自己尝试。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;



/// 
///                     圆的参数方程 x=a+r cosθ y=b+r sinθ(θ∈ [0,2π) ) (a,b) 为圆心坐标,r 为圆半径,θ 为参数,(x,y) 为经过点的坐标
///                     椭圆的参数方程 x=a cosθ  y=b sinθ(θ∈[0,2π)) a为长半轴长 b为短半轴长 θ为参数
///                     双曲线的参数方程 x=a secθ (正割) y=b tanθ a为实半轴长 b为虚半轴长 θ为参数    secθ (正割)即1/cosθ 
///                     
/// 
public class MotionOfAnObject : MonoBehaviour
{
    [Tooltip("要移动的物体")]
    public GameObject go;

    [Tooltip("长轴长")]
    public float Ellipse_a;

    [Tooltip("短轴长")]
    public float Ellipse_b;

    [Tooltip("角度")]
    float angle;

    [Tooltip("半径")]
    public float Circular_R;

    [Tooltip("原点")]
    public GameObject Point;

    [Tooltip("双曲线实轴")]
    public float Hyperbola_a;

    [Tooltip("双曲线虚轴")]
    public float Hyperbola_b;


    private void Update()
    {
        //角度
        angle += Time.deltaTime / 50f ;

        if (Input.GetKey(KeyCode.A))
        {
            //椭圆运动
            Move(Ellipse_X(Ellipse_a, angle), Ellipse_Y(Ellipse_b, angle));
        }

        if(Input.GetKey(KeyCode.S))
        {
            //圆运动
            Move(Circular_X(0, Circular_R, angle), Circular_Y(0, Circular_R, angle));
        }

        if (Input.GetKey(KeyCode.D))
        {
            //双曲线运动
            Move(Hyperbola_X(Hyperbola_a, angle), Hyperbola_Y(Hyperbola_b, angle));
        }
    }

    /// 
    /// 移动
    /// 
    /// 
    /// 
    private void Move(float x,float y)
    {
        go.transform.position = new Vector3(x + Point.transform.position.x, y + Point.transform.position.y, 0);
    }


    /// 
    /// 椭圆x坐标
    /// 
    /// 长半轴
    /// 
    /// 
    private float Ellipse_X(float a,float angle)
    {
        return a * Mathf.Cos(angle * Mathf.Rad2Deg);
    }

    /// 
    /// 椭圆y坐标
    /// 
    /// 短半轴
    /// 
    /// 
    private float Ellipse_Y(float b, float angle)
    {
        return b * Mathf.Sin(angle * Mathf.Rad2Deg);
    }


    /// 
    /// 圆x坐标
    /// 
    /// 圆心x坐标
    /// 半径
    /// 角度
    /// 
    private float Circular_X(float a, float r, float angle)
    {
        return (a + r * Mathf.Cos(angle * Mathf.Rad2Deg));
    }

    /// 
    /// 圆y坐标
    /// 
    /// 圆心y坐标
    /// 半径
    /// 角度
    /// 
    private float Circular_Y(float b, float r, float angle)
    {
        return (b + r * Mathf.Sin(angle * Mathf.Rad2Deg));
    }

    /// 
    /// 双曲线x坐标
    /// 
    /// 实轴
    /// 角度
    /// 
    private float Hyperbola_X(float a,float angle)
    {
        return a * 1 / Mathf.Cos(angle * Mathf.Rad2Deg);
    }

    /// 
    /// 双曲线y坐标
    /// 
    /// 虚轴
    /// 角度
    /// 
    private float Hyperbola_Y(float b, float angle)
    {
        return b *  Mathf.Tan(angle * Mathf.Rad2Deg);
    }
}

 

你可能感兴趣的:(unity让物体做圆周运动、椭圆运动、双曲线运动)