Перспективная 3D-проекция на Java - PullRequest
3 голосов
/ 09 апреля 2011

Я работаю над созданием простого движка 3D рендеринга на Java. Я запутался и нашел несколько разных способов сделать перспективное проецирование, но единственный, который я получил, частично работал со странными эффектами растяжения при удалении от центра экрана, когда объект был перемещен, делая его очень нереалистичным. По сути, мне нужен метод (каким бы простым или сложным он ни был), который принимает 3D-точку для проецирования и 3D-точку и поворот (возможно?) «Камеры» в качестве аргументов и возвращает положение на экране, которое эта точка должна быть обращена в. Мне все равно, как долго / коротко / просто / сложно этот метод. Я просто хочу, чтобы он генерировал ту же перспективу, которую вы видите в современных 3D-шутерах от первого лица или в любой другой игре, и я знаю, что для этого, возможно, придется использовать матричное умножение. Я действительно не хочу использовать OpenGL или какие-либо другие библиотеки, потому что я очень хотел бы сделать это в качестве учебного упражнения и развернуть свою собственную, если это возможно.

Любая помощь будет высоко оценена :) Еще раз спасибо - Джеймс

Обновление: Чтобы показать, что я имею в виду под "эффектами растяжения", приведу несколько скриншотов демонстрации, которую я собрал. Здесь куб (40x40x10) с центром в координатах (-20, -20, -5) рисуется с помощью единственного метода проекции, с которым я когда-либо работал (код ниже). Три экрана показывают камеру в точке (0, 0, 50) на первом снимке экрана, а затем перемещаются в измерении X, чтобы показать эффект в двух других.

Camera at (0,0,50) Camera moved a bit in the X coord Camera moved even further

Код проекции, который я использую:

public static Point projectPointC(Vector3 point, Vector3 camera) {
    Vector3 a = point;
    Vector3 c = camera;
    Point b = new Point();

    b.x = (int) Math.round((a.x * c.z - c.x * a.z) / (c.z - a.z));
    b.y = (int) Math.round((a.y * c.z - c.y * a.z) / (c.z - a.z));

    return b;
}

1 Ответ

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

Вы действительно не можете сделать это, не увязнув в математике.В Интернете есть множество ресурсов, которые объясняют умножение матриц, однородные координаты, перспективные проекции и т. Д. Это большая тема, и нет смысла повторять какие-либо необходимые вычисления здесь.

Вот возможная отправная точка для вашегообучение:

http://en.wikipedia.org/wiki/Transformation_matrix

Почти невозможно сказать, что не так с вашим текущим подходом - но одна возможность, основанная на вашем объяснении, что это выглядит странно, когда объект удаляется от центра, состоит в том, чтоВаше поле зрения слишком широк.Это приводит к некоторому искажению объектива типа «рыбий глаз», когда слишком большая часть мировоззрения прижимается к краю экрана.

...