Tworzę własny silnik 3D w JavaScript i używam tylko rysunku na płótnie, bez WebGL. To kolejny klon Minecrafta; Uwielbiam pudełka, nie oceniaj mnie.
Jak dotąd wszystko działa wspaniale, z wyjątkiem jednej rzeczy: w 3D, gdy niektóre wierzchołki wychodzą za bliską płaszczyznę tnącą, ich rzut na ekran wychodzi dziwnie (zakładając, że inne wierzchołki używane do śledzenia płaszczyzny znajdują się z przodu).
Próbowałem wyciąć te punkty, ale potem widzę koryta powierzchni wykorzystujących te wierzchołki. W WebGL / OpenGL karta graficzna zajmuje się tymi punktami, a płaszczyzna jest renderowana poprawnie, ale nie mam dostępu do sprzętu, więc sam muszę to kodować.
Nie jestem do końca pewien, co z tym zrobić, obecnie ostatnią rzeczą, jaka przyszła mi do głowy, jest odwrócenie projekcji punktów za zbliżającą się płaszczyzną tnącą gracza, co wydaje się logiczne, ponieważ muszę rzutować punkt na ekran przed nim wierzchołka.
Oto moje przemyślenia:
Oto kilka zdjęć ilustrujących to, co się dzieje:
Z daleka niebieskie pudełko renderuje się doskonale.
Kiedy niektóre wierzchołki znajdują się za płaszczyzną przycinania odtwarzacza, odwracam projekcję, ale nie wygląda to dobrze:
focalLength *= -1;
2d.x = x*focalLength/z;
2d.y = y*focalLength/z;
Zauważ, że szare pole z tyłu zostało całkowicie usunięte, ponieważ wszystkie wierzchołki użyte do narysowania jego twarzy znajdują się za graczem.
Tak dzieje się, gdy patrzysz w górę lub w dół.
Nie wiem, co sądzić o matematyce, mam nadzieję, że ktoś już napotkał ten sam problem i może mi pomóc.
lineTo(x,y)
można było wywołać tę funkcję, ale nie wiem, jak się zachowuje ... to dziwny wymiar, zgadzam się.