Рассчитать вектор направления заданной переменной гипотенузы на орбитальном пути - PullRequest
0 голосов
/ 13 апреля 2019

enter image description here

В игре Unity 3D я пытаюсь заставить объект (D) вращаться вокруг другого объекта (B) и нарисовать луч между другим объектом, расположенным над объектом, на котором происходит вращение (A), и объектом, находящимся на орбите, по существу описывающим треугольник (или конус, данное время + скорость орбиты):

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

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

Моя тригонометрия довольно проста, но я подумал, что вычисление угла от тангенса AC и AB и умножение его кватерниона на вектор направления (c - a) даст правильное направление от A. Это код на орбитальном объекте D:

private void Update()
{
    transform.RotateAround(transformB.position, Vector3.up, rotSpeed * Time.deltaTime);

    if (Physics.Raycast(transform.position, -transform.up, out hit, 100))
    {
        float angleDeg = Mathf.Atan2(transformA.position.y, 
            Vector3.Distance(hit.point, transformA.position)) * Mathf.Rad2Deg;

        Quaternion q = Quaternion.AngleAxis(angleDeg, Vector3.left);

        Vector3 dir = q * (new Vector3(hit.point.x, transformA.position.y, 
            hit.point.z) - transformA.position);

        Debug.DrawRay(firingTransform.position, dir, Color.green, 0.1f);

    }
}

Кажется, он работает правильно только для половины орбиты:

enter image description here

Я пробовал различные векторы для параметра оси Quaternion.AngleAxis.

...