Хобрук: Ваш путь к мастерству в программировании

проблемы с вращением произвольной точки вокруг другой произвольной точки

Я написал следующие методы для поворота произвольной точки вокруг другой произвольной точки на угол в течение продолжительности. Рассматриваемая точка теперь движется хаотично, но в конечном итоге оказывается там, где, как я полагаю, является желаемым пунктом назначения. Мне нужно, чтобы он плавно двигался в угол.

Обратите внимание, что очки не зависят от игрового объекта.

На приведенной ниже диаграмме я пытаюсь переместить одну точку кривой Безье (нарисованной с помощью LineRenderer) вокруг другой точки на угол за заданный период времени. Ни одна из этих точек не совпадает с положением игрового объекта, содержащего кривую Безье.

введите здесь описание изображения

IEnumerator runMovement()  {

    yield return new WaitForSeconds(2.0f);
    Vector2 pivot = points[3];

    StartCoroutine(RotateControlPointWithDuration(pivot, 2.0f, 90.0f));

}

   IEnumerator RotateControlPointWithDuration(Vector2 pivot, float duration, float angle)
{
    float currentTime = 0.0f;
    float ourTimeDelta = 0;
    Vector2 startPos = points[0];

    ourTimeDelta = Time.deltaTime;
    float angleDelta = angle / duration; //how many degress to rotate in one second

    while (currentTime < duration)
    {
        currentTime += Time.deltaTime;
        ourTimeDelta = Time.deltaTime;

        points[0] = new Vector2(Mathf.Cos(angleDelta * ourTimeDelta) * (startPos.x - pivot.x) - Mathf.Sin(angleDelta * ourTimeDelta) * (startPos.y - pivot.y) + pivot.x,
                                                        Mathf.Sin(angleDelta * ourTimeDelta) * (startPos.x - pivot.x) + Mathf.Cos(angleDelta * ourTimeDelta) * (startPos.y - pivot.y) + pivot.y);

        yield return null;
    }
}
27.06.2018

  • Я предлагаю вам добавить анимированный gif или ссылку на видео, которое показывает вашу текущую проблему. Кроме того, было бы лучше добавить еще одно видео, показывающее, что именно вы пытаетесь сделать. 29.06.2018
  • Кроме того, слушайте все, что говорит @Programmer :) 29.06.2018
  • @Fattie Я работаю над обновлением, которое скоро будет готово 29.06.2018
  • @Programmer Я только что обновил вопрос 29.06.2018
  • @Fattie Я был бы очень признателен за причину, по которой совершенно неправильно использовать кватернионы. 29.06.2018
  • Кватернионы просто никак не связаны с тем, о чем вы думаете и с чем имеете дело. Они даже отдаленно не связаны. 29.06.2018
  • У @Fattie все еще какие-то неустойчивые движения. Я только что обновил вопрос. Я искренне думаю, что этот вопрос имеет ряд динамик, которые отличают его от предоставленной вами ссылки. 29.06.2018
  • @Programmer Я только что снова обновил вопрос. 29.06.2018
  • ваш код должен быть больше похож на ..fraction = (Time.time - startTime)/duration .. и каждый раз перемещайте его в эту новую точку 29.06.2018
  • @Fattie, я отредактировал вопрос. Я пытаюсь работать с вашим предложением о дроби, но не слишком уверен, как заставить его работать. Был бы признателен за дополнительную информацию об этом или, возможно, ответ :) 29.06.2018
  • я вставил ответ с обычным шаблоном @TenOutOfTen. Обратите внимание, что у вас может быть множество других проблем. Вы говорите, что выполняете математические вычисления, абстрагированные от любого игрового объекта в сцене, но, если вы видите неустойчивое поведение, я предполагаю, что оно должно быть каким-то образом представлено в виде физических элементов; в этом случае может быть много проблем. 29.06.2018

Ответы:


1

Шаблон, который вы хотите, просто

public IEnumerator HowToSmoothly()
    {
    // move "X" from value "A" to value "B"

    float duration = 2.5f;
    float delta = B - A;

    float startTime = Time.time;
    float finishTime = Time.time+duration;

    while(Time.time<finishTime)
        {

        float soFarTime = Time.time-startTime;
        float fractionThisFrame = soFarTime / duration;
        float valueThisFrame = A + delta * fractionThisFrame;

        X = valueThisFrame
        if (X > B) X = B;

        yield return 0;
        }

    X = B;
    yield break;
    }
29.06.2018

2

Я действительно могу помочь вам с квартонианами, но я могу дать несколько советов о движении с течением времени. Тяжелый урок, который мне пришлось усвоить, заключался в том, чтобы избегать использования сопрограмм везде, где это возможно. Хотя они кажутся довольно гладкими, они немного сбивают с толку, чтобы их правильно понять, и Unity использует их не совсем так, как вы должны использовать их в других областях C#.

Везде, где это возможно, я просто использую класс единства, который обновляет каждый кадр. Его гораздо проще понять и отладить. Недостатком в вашем случае является то, что вам нужен новый компонент для каждой точки, которую вы пытаетесь повернуть, но это не должно иметь большого значения.

public class PointRotator : MonoBehaviour

{

bool rotating = false;
float rate = 0;
float angle;

Vector3 point;
Vector3 pivot;

public void Rotate(Vector3 point, Vector3 pivot, float duration, float angle)
{
    this.point = point;
    this.pivot = pivot;
    this.rate = angle/duration;
    this.angle = angle;

    rotating = true;
}

public void Update()
{
    if (rotating)
    {
        // use quartonian.Lerp with Time.deltatime here

    //if(angle > quartonian angle){rotating = false)
    }
}

}

Попробуйте что-нибудь подобное и посмотрите, исчезнет ли ваша проблема. В противном случае вам, возможно, придется немного больше исследовать квартонианы или просто выполнить тригонометрию вручную, поскольку вы находитесь в 2D-плоскости.

28.06.2018
  • Я собираюсь засечь ротацию нескольких точек, они могут исчисляться сотнями, пока не могу сказать. Это еще одна причина, по которой я хочу использовать сопрограммы. 28.06.2018
  • @TenOutOfTen, невозможно помочь вам больше, если вы не объясните в одном или двух предложениях, что вы пытаетесь сделать. Ваше здоровье 29.06.2018
  • Думали ли вы о том, чтобы сделать очки игровыми объектами? Это действительно упростило бы решение. 29.06.2018
  • Новые материалы

    Решения DBA Metrix
    DBA Metrix Solutions предоставляет удаленного администратора базы данных (DBA), который несет ответственность за внедрение, обслуживание, настройку, восстановление базы данных, а также другие..

    Начало работы с Блум
    Обзор и Codelab для генерации текста с помощью Bloom Оглавление Что такое Блум? Некоторые предостережения Настройка среды Скачивание предварительно обученного токенизатора и модели..

    Создание кнопочного меню с использованием HTML, CSS и JavaScript
    Вы будете создавать кнопочное меню, которое имеет состояние наведения, а также позволяет вам выбирать кнопку при нажатии на нее. Финальный проект можно увидеть в этом Codepen . Шаг 1..

    Внедрите OAuth в свои веб-приложения для повышения безопасности
    OAuth — это широко распространенный стандарт авторизации, который позволяет приложениям получать доступ к ресурсам от имени пользователя, не раскрывая его пароль. Это позволяет пользователям..

    Классы в JavaScript
    class является образцом java Script Object. Конструкция «class» позволяет определять классы на основе прототипов с чистым, красивым синтаксисом. // define class Human class Human {..

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

    Как построить любой стол
    Я разработчик программного обеспечения. Я люблю делать вещи и всегда любил. Для меня программирование всегда было способом создавать вещи, используя только компьютер и мое воображение...