Перспектива на трехмерных объектах - PullRequest
3 голосов
/ 01 сентября 2011

Я обновляю одно из наших старых приложений с vb6 до c # и в процессе должен воссоздать пользовательский элемент управления, разработанный первоначальным программистом.Элемент управления просто взял размеры объекта, прямоугольного или конического, и поместил эскиз объекта в 3D (технически я думаю, 2.5D).Конечно, кода для управления или алгоритма нигде нет.

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

        }
        double w = 400;
        double h = 250;
        double t = 0.6; // tilt angle   
        double X = w / 2 - x;
        double Y = h / 2 - y;
        double a = h / (h + Y * Math.Sin(t));
        double u = a * X + w / 2;
        double v = a * Y * Math.Cos(t) + h / 2;
        }

Последнее, что мне нужно, хотя это поворот перспективы на 30 градусов слева направо, поэтому я не смотрю прямона.

Спасибо за любую помощь.

1 Ответ

0 голосов
/ 11 октября 2012

Как комментатор говорит: Вы должны использовать матрицы, чтобы облегчить себе жизнь.

Вращение можно легко сделать, умножив таким образом 2 матрицы, матрицу вращения и матрицу перспективы:

// We don't have a view matrix here
Matrix4x4 modelProjection = Matrix4x4.Perspective(400, 250, Math.PI / 4) * Matrix4x4.RotationX(degree);
// Get a specifics point position, use x and y to determine the screen position and z for the z-order
Vector3 screenPosition = modelProjection * myPosition; // myPosition is a Vector3

Для запуска кода вам нужно сделать несколько вещей: Реализовать матрицу C # или получить ее из любого другого места. Здесь является отличным источником для реализации матриц.

...