3D Math / 2D Rotation Calculation: Разделить/разрезать 3D-модель?

Я пытаюсь повернуть 3D-объект по оси 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-объект разрезается пополам.

Сравнение

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


person Lazlo    schedule 05.04.2011    source источник
comment
Примечание: мне кажется, что половина координат выводится в 0, но я не знаю, почему.   -  person Lazlo    schedule 05.04.2011


Ответы (3)


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

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

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

person Mike Bailey    schedule 05.04.2011
comment
На самом деле я делал это правильно, так как это работает сейчас. Но спасибо за попытку. - person Lazlo; 05.04.2011
comment
Да, я понял это только после того, как посмотрел на него несколько минут. Мне потребовалось некоторое время, чтобы понять, что он был точно идентичен приведенному выше коду. - person Mike Bailey; 05.04.2011
comment
Да, это просто перевод в полярную и обратно (только по оси Z). Хотя странно, что поначалу не работало. Подозреваю ошибку где-то в программе. - person Tom Zych; 05.04.2011
comment
Ну, я отредактировал свое сообщение, чтобы отразить ошибку, которую я сделал. Удачи в поиске настоящей ошибки! - person Mike Bailey; 05.04.2011
comment
Вы не заслужили отрицательных отзывов. Вот ответ от меня. о.о - person Lazlo; 05.04.2011
comment
Что ж, я немного поторопился и предположил, что ваш код неверен. Мне пришлось смотреть на них двоих, прежде чем я понял ошибку. - person Mike Bailey; 05.04.2011

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

person afranz409    schedule 05.04.2011

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

Как это называется? Баги, которые исчезают сами по себе.

person Lazlo    schedule 05.04.2011
comment
@Tom Zych: Не совсем так. Heisenbugs возвращаются, когда вы их не изучаете. - person Lazlo; 05.04.2011
comment
Я люблю говорить, что это фаза лунного жука. - person Mike Bailey; 05.04.2011
comment
Жуки Чеширского кота? Ошибки буджума? Д.Б. Ошибки Купера? - person Tom Zych; 03.09.2011