3D-werelden, coördinaten en camera’s

Programmeergidsen

3D betekent drie afmetingen: breedte, hoogte en diepte. Een positie (x, y, z) wordt gemeten langs drie denkbeeldige linialen: assen. Hun ontmoetingspunt (0, 0, 0) heet de oorsprong. Pliro meet afstanden in wereldeenheden: eenheden die jij kiest voor je denkbeeldige wereld, geen schermpixels. +Y wijst hier omhoog. Bij de beginhoek van de camera is +X rechts en -Z vooruit.

De camera is het gezichtspunt vanwaar je de wereld ziet. Yaw is de horizontale draaiing naar links of rechts; pitch is de verticale kanteling omhoog of omlaag. Hoeken gebruiken graden: 90 is een kwartslag en 360 een hele rondgang. Bij horizontale hoek 0 kijkt de camera naar -Z. Positief horizontaal draait rechtsom; positief verticaal kijkt omhoog. Bewegen blijft horizontaal, ook wanneer je omhoog of omlaag kijkt; positief zijwaarts gaat naar rechts ten opzichte van de camera.

Een hoek terugbrengen binnen een rondgang, in het Engels wrapping, maakt van 370 graden weer 10. De notatie [0, 360) bevat 0 maar niet 360. Begrenzen, of clamping, stopt een waarde bij een limiet: verticale camerahoek 100 wordt 89. Het bereik [-89, 89] bevat beide grenzen. De absolute waarde is de afstand van een getal tot nul: -5 en 5 hebben allebei absolute waarde 5.

Vormen en de camera

Een primitieve vorm is een basisvorm, zoals een doos, bol of cilinder. De straal loopt van het midden naar de rand. De diameter loopt helemaal dwars door het midden en is twee keer zo groot. De as van een cilinder is de denkbeeldige lijn door de middelpunten van de ronde uiteinden. Geometrie betekent de wiskundige vorm en haar afmetingen. Een georiënteerde doos volgt haar draaiing; een asuitgelijnde doos zou haar randen evenwijdig aan de wereldassen houden.

Een botsingsvorm, of collider, is een onzichtbare vorm waarmee wordt gecontroleerd of beweging ergens tegenaan zou komen. De camerabotsingsvorm van Pliro is een klein bolletje. Een stevig object kan beweegCamera3D tegenhouden. Stevigheid uitzetten verbergt het object niet en sluit het niet uit bij raakt3D en richt3D.

Een richtstraal is een denkbeeldige rechte lijn vanuit de camera waarmee je vraagt waarnaar die wijst. De dichtstbijzijnde treffer is het eerste object op die lijn binnen de toegestane afstand. Deze controles gebruiken vormen, niet de kleuren van schermpixels. Invoegvolgorde betekent de volgorde waarin objecten voor het eerst zijn gemaakt.

Het beeldveld is hoe breed de camera kijkt, uitgedrukt als hoek. Nabije en verre vlakken begrenzen de afstanden waarmee wordt getekend; het zijn geen muren in de wereld. Een textuur is een oppervlaktepatroon. De schaal bepaalt hier hoeveel patroonherhalingen in één eenheid langs het object passen.

Een frame is één volledig getekend beeld. Een HUD, kort voor heads-up display, toont informatie zoals een score over de wereld heen. Renderen betekent dat beeld maken. WebGL2 is een grafische browserinterface die de GPU kan gebruiken: de processor die gespecialiseerd is in tekenen. Een softwarerenderer doet de tekenberekeningen op de hoofdprocessor, de CPU. Zie de WebGL-uitleg van MDN.

Wereldinstellingen en grenzen

Dozen gebruiken volledige breedte, hoogte en diepte. Cilinders gebruiken straal en volledige hoogte, met hun as langs +Y. Objecten beginnen op (0, 0, 0), horizontale hoek 0, kleur "#f59e0b", stevigheid waar, patroon "none" en textuurschaal 1. Opnieuw maken onder dezelfde naam herstelt al die eigenschappen en bewaart de invoegvolgorde.

Waarde Vereiste
Objectnaam Hoofdlettergevoelige, niet-blanke Text, maximaal 64 UTF-8-bytes.
Wereldgrootte Maximaal 1024 objecten.
Positiecomponent Eindig getal, absolute waarde maximaal 10.000.
Afmeting of straal Eindig getal, groter dan 0 en maximaal 1.000.
Draaiing Eindig getal, absolute waarde maximaal 1.000.000.000.
Camerabewegingscomponent Eindig getal, absolute waarde maximaal 10 per aanroep.
Richtafstand Eindig getal, groter dan 0 en maximaal 1.000.
Textuurschaal Eindig getal, groter dan 0 en maximaal 32.

Objectbewerkingen verwachten een bestaande naam, behalve vormcreatie en het onschuldige verwijderen van een ontbrekende naam. Ongeldige argumenten wijzigen de wereld niet gedeeltelijk. Kleuren volgen de tabel met overdraagbare kleuren.

De begin-/resetcamera staat op (0, 1.5, 5) met beide hoeken 0, een verticaal beeldveld van 60 graden en nabije/verre afstanden van 0,05 en 1.000. camera3D plaatst de camera rechtstreeks, eventueel binnen een object, met behoud van kijkrichting. kijkNaar3D verandert alleen de kijkrichting en weigert een doel op precies de camerapositie.

beweegCamera3D gebruikt een camerabol met straal 0,2 tegen stevige objecten. De beweging bestaat uit begrensde stappen, eerst X en dan Z, waardoor de camera langs muren kan schuiven. Een geblokkeerde component blijft op zijn vorige positie. Er is geen automatische zwaartekracht, sprong, snelheid of beweging van objecten.

raakt3D test de werkelijke vormen inclusief raakvlakken, onafhankelijk van stevigheid. richt3D test ook niet-stevige objecten en kiest de dichtstbijzijnde treffer. Bij gelijke afstand wint de invoegvolgorde. Een straal die in een object begint, raakt dat object op afstand nul. Deze uitkomsten hangen niet af van getekende pixels.

textuur3D accepteert none, checker, brick, wood, stone, grass, sand, tile, metal of een verpakte PNG zoals assets/muur.png. Patroonnamen zijn niet taalafhankelijk; afbeeldingspaden blijven hoofdlettergevoelig. Schaal betekent herhalingen per lokale wereldeenheid, standaard 1. Zie zelf texturen maken voor de studio, kleurwerking en afbeeldingsgrenzen.

Wereldwijzigingen tekenen niet automatisch. teken3D() legt een volledig beeld vast en vervangt vorige 2D-vormen en sprites. Teken 2D-tekst of vormen erna voor een informatielaag en gebruik een positieve wacht in animatielussen. wisScherm verbergt het 3D-beeld zonder de wereld te verwijderen. wis3D herstelt wereld en camera; roep daarna teken3D() aan om het resultaat te zien. Reset en sessieopruiming geven de wereld vrij; normale Stop bewaart het laatste zichtbare beeld.

IDE/browser gebruikt WebGL2 met een terugval of diagnose wanneer dit ontbreekt. Native Windows, Linux en Raspberry Pi gebruiken een softwarerenderer met het weergaveprofiel van het project, tot 1920 × 1080. Logische coördinaten blijven 640 × 360. Pixelranden mogen verschillen; wereldtoestand, beweging, botsingen en richtresultaten hebben dezelfde betekenis.

# taal: nl
wis3D("#16213e")
doos3D("krat", 1.5, 1.5, 1.5)
kleur3D("krat", "orange")
textuur3D("krat", "checker", 2)
draai3D("krat", 25)

cilinder3D("pilaar", 0.35, 2)
plaats3D("pilaar", 2, 0, 0)
kleur3D("pilaar", "blauw")
textuur3D("pilaar", "brick")

bol3D("bal", 0.5)
plaats3D("bal", -2, 0, 0)
kleur3D("bal", "rood")
stevig3D("bal", onwaar)

camera3D(0, 2, 6)
kijkNaar3D(0, 0, 0)
zeg "Krat raakt pilaar:", raakt3D("krat", "pilaar")
zeg "Gericht object:", richt3D(20)
teken3D()
tekenTekst(320, 20, "Mijn 3D-wereld", 24, "white", "sans", "center")

Patroonteksten en gemengde Engelse/Nederlandse kleurwaarden blijven behouden bij syntaxisconversie.

Gerelateerde lemma’s

Syntaxis en waarden · Ingebouwde functies · Programmeergidsen