Улучшение алгоритма вращения вокруг 3d-точки на определенной оси - PullRequest
1 голос
/ 10 февраля 2020

Я создал метод C# (с использованием библиотеки OpenTK), который вычисляет положение точки A, которая поворачивается на заданное расстояние вокруг точки B. Вращение происходит вокруг оси y (которая "вверх"). в моем игровом мире).

public static Vector3 CalculateRotationAroundPointOnAxis(Vector3 B, float distance, float 
              degrees)
{
    // First of all: convert degrees to radians
    float radians = MathHelper.DegreesToRadians(degrees % 360);

    // Create a translation matrix that stores the translation from (0|0|0) to point B:
    Matrix4.CreateTranslation(ref B, out translationPointMatrix);

    // Create a rotation matrix for the rotation around y-axis:
    Matrix4.CreateRotationY(radians, out rotationMatrix);
    // Create a second translation matrix that stores the translation from point B to the rotation distance:
    Matrix4.CreateTranslation(0, 0, distance, out translationMatrix);

    // First apply the translation to point B, then rotate:
    Matrix4.Mult(ref translationMatrix, ref rotationMatrix, out tempMatrix);
    // Afterwards, apply the second translation:
    Matrix4.Mult(ref tempMatrix, ref translationPointMatrix, out finalTranslationMatrix);

    // Apply finalTranslationMatrix to Vector3 (0|0|0) and return the new position:
    Vector3.TransformPosition(ref Vector3.Zero, ref finalTranslationMatrix, out finalTranslationPoint);
    return finalTranslationPoint;
}

Я понимаю, почему матрицы нужно умножать в указанном выше порядке. Но я думаю, что весь процесс слишком дорогой! У меня так много матричных операций, и я думаю, что весь процесс можно ускорить.

Вопрос: Как я могу сделать этот алгоритм быстрее?

...