Я работаю над созданием простого движка 3D рендеринга на Java. Я запутался и нашел несколько разных способов сделать перспективное проецирование, но единственный, который я получил, частично работал со странными эффектами растяжения при удалении от центра экрана, когда объект был перемещен, делая его очень нереалистичным. По сути, мне нужен метод (каким бы простым или сложным он ни был), который принимает 3D-точку для проецирования и 3D-точку и поворот (возможно?) «Камеры» в качестве аргументов и возвращает положение на экране, которое эта точка должна быть обращена в. Мне все равно, как долго / коротко / просто / сложно этот метод. Я просто хочу, чтобы он генерировал ту же перспективу, которую вы видите в современных 3D-шутерах от первого лица или в любой другой игре, и я знаю, что для этого, возможно, придется использовать матричное умножение. Я действительно не хочу использовать OpenGL или какие-либо другие библиотеки, потому что я очень хотел бы сделать это в качестве учебного упражнения и развернуть свою собственную, если это возможно.
Любая помощь будет высоко оценена :)
Еще раз спасибо
- Джеймс
Обновление: Чтобы показать, что я имею в виду под "эффектами растяжения", приведу несколько скриншотов демонстрации, которую я собрал. Здесь куб (40x40x10) с центром в координатах (-20, -20, -5) рисуется с помощью единственного метода проекции, с которым я когда-либо работал (код ниже). Три экрана показывают камеру в точке (0, 0, 50) на первом снимке экрана, а затем перемещаются в измерении X, чтобы показать эффект в двух других.
Код проекции, который я использую:
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;
}