3D Math / 2D Rotation Calculation: 3D-модель разделения / вырезания? - PullRequest
0 голосов
/ 05 апреля 2011

Я пытаюсь повернуть трехмерный объект вокруг своей оси Z (вверх / вниз).

public void RotateY(float angle)
{
    foreach (CoordinateVertices cv in this.GetAll<CoordinateVertices>())
    {
        for (int i = 0; i < cv.Coordinates.Length; i++)
        {
            Vector3 old = cv.Coordinates[i];

            float theta = Math.Atan2(old.Y, old.X) + angle;
            float rayon = Math.Sqrt(Math.Pow(old.X, 2) + Math.Pow(old.Y, 2));

            cv.Coordinates[i] = new Vector3(Math.Cos(theta) * rayon, Math.Sin(theta) * rayon, old.Z);
        }
    }
}

Тригонометрия довольно проста и, кажется, работает нормально, но по какой-то причине мой 3D-объект разрезается пополам.

Comparison

Кто-нибудь имеет представление о том, что происходит? Я написал бы это в математике StackExchange, но это может быть проблемой и с моим программированием, и тригонометрия действительно проста.

Ответы [ 3 ]

1 голос
/ 05 апреля 2011

Как уже было отмечено, ничего плохого в вашем коде.Тем не менее, вы также можете быть заинтересованы в использовании функции Transform (которая может работать сразу со всем вашим массивом координат).Vector3.Transform (Vector3[], Matrix).Вы можете получить вращение с помощью матрицы вращения , рассчитанной для заданного угла, тета, относительно любой оси.Я ожидаю, что это будет значительно быстрее для большого количества очков.(Меньше вычислений триггера и, возможно, аппаратного ускорения)

1 голос
/ 05 апреля 2011

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

Это должно выглядеть так:

double Xnew = X * cos(theta) + Y * sin(theta);
double Ynew = Y * cos(theta) - X * sin(theta);

Или в вашем коде:

public void RotateY(float angle)
{
    foreach (CoordinateVertices cv in this.GetAll<CoordinateVertices>())
    {
        for (int i = 0; i < cv.Coordinates.Length; i++)
        {
            Vector3 old = cv.Coordinates[i];
            float xnew = old.X * Math.Cos(angle) + old.Y * Math.Sin(angle);
            float ynew = old.Y * Math.Cos(angle) - old.X * Math.Sin(angle);

            cv.Coordinates[i] = new Vector3(xnew, ynew, old.Z);
        }
    }
}

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

Подробнее см. Здесь: http://en.wikipedia.org/wiki/Transformation_matrix#Rotation

0 голосов
/ 05 апреля 2011

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

Как это называется?Ошибки, которые исчезают сами собой.

...