@MyOnAsSalat

Как построить геодезическую линию между двумя точками?

Привет тостер, корплю над вопросом пару месяцев.
Есть сфера в начале координат, тоесть 0,0,0
На ней две точки заданные в сферических и декартовых координатах(меши к ним привязаны).
Необходимо построить геодезическую прямую(кратчайшее расстояние между точками на сфере.
Логично что для отрисовки линии нужны промежуточные точки.
Пытался применить тригонометрию и сделать формулу с шагом, но рогалики не заработали.
Подскажите способ отрисовки этой линии либо алгоритмом либо костылём из движка Unity, заранее премного благодарю.
  • Вопрос задан
  • 581 просмотр
Решения вопроса 1
BasmanovDaniil
@BasmanovDaniil
Геймдизайнер-телепат
Можно лерпить кватернион для нахождения промежуточных точек. Насчёт оптимальности пути ничего не скажу, но выглядит корректно. Сначала находите локальные координаты объектов, потом нормализуете их и получаете направление. Создаёте вращение от одного направления к другому и ступеньками его применяете для расчёта точек. Рисовать проще всего с помощью LineRenderer.
5b7d2daabd031313608343.png
using UnityEngine;

public class LineExample : MonoBehaviour
{
    public LineRenderer lineRenderer;
    public Transform a;
    public Transform b;
    public float sphereRadius = 0.5f;
    public int positionCount = 10;

    private void Awake()
    {
        Vector3 aDirection = transform.InverseTransformPoint(a.position).normalized;
        Vector3 bDirection = transform.InverseTransformPoint(b.position).normalized;

        var fromRotation = Quaternion.identity;
        var toRotation = Quaternion.FromToRotation(aDirection, bDirection);

        lineRenderer.positionCount = positionCount;
        for (int i = 0; i < positionCount; i++)
        {
            float t = i/(positionCount - 1f);
            Quaternion rotation = Quaternion.Lerp(fromRotation, toRotation, t);
            Vector3 point = rotation*aDirection*sphereRadius;
            lineRenderer.SetPosition(i, point);
        }
    }
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@Karpion
Пусть конечные точки имеют декартовы координаты {x0,y0,z0} и {x1,y1,z1}
Берём отрезок прямой, соединяющий конечные точки (проходящий внутри сферы); координаты его точек будут:
{x0+(x1-x0)*k,y0+(z1-z0)*k,z0+(z1-z0)*k}, где k пробегает все хначения от нуля до единицы.
Переводим эти координаты в сферическую систему, а затем принудительно делаем радиус равным радиусу окружности (углы не меняются). Всё, мы имеем все точки нужно Вам дуги окружности.

Как это использовать, т.е. какие именно точки Вам нужны (из того бесконечного набора, который я дал) - решайте сами.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы