3D-werelden, coördinaten en camera’s
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 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.
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/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.
# 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 en
laser-maze-3d.pliro.
Gerelateerde lemma’s
Syntaxis en waarden · Ingebouwde functies · Programmeergidsen
