Как заставить два объекта, обращающихся вокруг точки, сделать это по кривой? Единство, C # - PullRequest
0 голосов
/ 30 апреля 2018

Итак, у меня есть эта функция, прикрепленная к сфере, и обратная, прикрепленная к другой. Они сфальсифицированы, чтобы испустить след, и игровой объект, вокруг которого они вращаются, является сферой, которая заблокирована в 0,0,0. Это мой код:

  float t = 0;
    float speed;
    float width;
    float height;
    int cat = 0;
    public GameObject orbit; //the object to orbit

    // Use this for initialization
    void Start()
    {
        speed = 2;
        width = 5;
        height = 2;
        InvokeRepeating("test", .001f, .009f);
    }

    void test()
    {
        t += Time.deltaTime * speed;

        Vector3 orbitv = orbit.transform.position;
        float inc = .0000000001f;

        inc += inc + t;
        float angmom = .00001f;
        angmom = angmom + t;

        float x = orbitv.x + Mathf.Cos(t);
        float z = orbitv.z + inc; //+ (Mathf.Cos(t)*Mathf.Sin(t));
        float y = orbitv.y + Mathf.Sin(t);

        transform.position = new Vector3(x, y, z);



    }}

Что делает это: enter image description here

Вместо того чтобы двигаться исключительно в направлении z, я бы хотел, чтобы они продолжали свое текущее вращение, но по кругу вокруг сферы на 0,0,0, оставаясь на том же уровне y. У кого-нибудь есть идеи, как мне это сделать?

Редактировать: Вот что я пытаюсь сделать: enter image description here

1 Ответ

0 голосов
/ 30 апреля 2018

Вот код, который я приготовил для вас. Все движение достигается с помощью основных тригонометрических функций и некоторой простой векторной математики.

Чтобы справиться с такими проблемами, попробуйте разбить вещи, как я делал, разделив движение на круговые / вверх-вниз и вбок. Это позволяет вам создать эффект звонка.

Добавление большего количества переплетенных волн должно быть тривиальным путем изменения фазы колебаний и добавления новых следов.

public class Orbit : MonoBehaviour {

    float t = 0;
    public float speed;
    public float width;
    public float height;
    public float radius;
    int cat = 0;
    public GameObject center; //the object to orbit
    public Vector3 offset;

    void Update()
    {
        t = Time.time * speed;
        OrbitAround();
        AddSideways();
    }

    void OrbitAround()
    {
        float x = radius * Mathf.Cos(t);
        float y = Mathf.Sin(offset.y * t);
        float z = radius * Mathf.Sin(t);

        transform.position = new Vector3(x, y, z);
    }

    void AddSideways()
    {
        float x = Mathf.Cos(offset.x * t);
        Vector3 dir = transform.position - center.transform.position;
        transform.position += dir.normalized * x;

    }
}

Это должно дать вам такой след: enter image description here

Вы можете поиграть с Vec3 offset, который изменяет частоту колебаний и, по сути, позволяет вам выбрать количество колец.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...