Я использую свой собственный 3D-движок на JavaScript и использую только рисование на холсте, а не WebGL. Это еще один клон Minecraft; Я люблю коробки, не суди меня.
Пока что все работает чудесно, за исключением одного: в 3D, когда некоторые вершины идут за ближней плоскостью отсечения, их проекция на экран получается странной (если предположить, что другие вершины, используемые для трассировки плоскости, находятся впереди).
Я попытался обрезать эти точки, но затем я могу видеть поверхности, которые используют эти вершины. В WebGL / OpenGL графическая карта заботится об этих точках, и плоскость отображается правильно, но у меня нет доступа к оборудованию, поэтому я должен кодировать это сам.
Я не совсем уверен, что с этим делать, в настоящее время последнее, что пришло на ум, - это изменить проекцию точек позади плоскости отсечения игрока, что кажется логичным, поскольку я должен проецировать точку на экран, который находится впереди. вершины.
Вот мои мысли:
Вот несколько изображений, чтобы проиллюстрировать, что происходит:
С расстояния синяя коробка отрисовывается на отлично.
Когда некоторые вершины идут за плоскостью отсечения игрока, я делаю обратную проекцию, но она выглядит неправильно:
focalLength *= -1;
2d.x = x*focalLength/z;
2d.y = y*focalLength/z;
Обратите внимание, что серая рамка позади полностью удалена, поскольку все вершины, используемые для рисования граней, находятся позади игрока.
Вот что происходит, когда смотришь вверх или вниз.
Я не знаю, что делать с этой математикой, я надеюсь, что кто-то уже сталкивался с той же проблемой и может мне помочь.
lineTo(x,y)
функция все еще может быть вызвана, только я не знаю, как она себя ведет ... это странное измерение, я согласен.