# 3D-werelden, coördinaten en camera’s [Programmeergidsen](LEESMIJ.md) **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](https://developer.mozilla.org/en-US/docs/Web/API/WebGL_API). ## 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 256 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](kleuren.md). 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"` en `"brick"`, ongeacht hoofdletters en omringende witruimte. Schaal is het aantal patroonherhalingen per lokale wereldeenheid; weglaten kiest opnieuw 1. Patronen bewegen met het object, vereisen geen afbeeldingsbestanden en behouden kleur, geometrie en stevigheid. De patroonteksten zijn gegevenswaarden en worden **niet vertaald**. 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](../begrippen/ontwikkelomgeving.md)/browser gebruikt WebGL2 met een terugval of diagnose wanneer dit ontbreekt. Native Windows, Linux en Raspberry Pi tekenen met een softwarerenderer op 640 × 360. Pixelranden mogen verschillen; wereldtoestand, beweging, botsingen en richtresultaten hebben dezelfde betekenis. Zie de [3D-specificatie](../../../docs/spec/scene3d.md). ```pliro # 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. Bekijk ook [rotating-box.pliro](../../../examples/nl/rotating-box.pliro) en [laser-maze-3d.pliro](../../../examples/nl/laser-maze-3d.pliro). ## Gerelateerde lemma’s [Syntaxis en waarden](../syntaxis/LEESMIJ.md) · [Ingebouwde functies](../ingebouwde-functies/LEESMIJ.md) · [Programmeergidsen](LEESMIJ.md)