4. GridMap Raycasting
Maak een raycasting system om muis positie naar grid cells te converteren
Overzicht
In dit hoofdstuk leer je:
GridMapRaycaster utility class maken
Mouse position converteren naar 3D ray
Ray-ground plane intersection berekenen
World position naar grid cell converteren
GetCellUnderMouse() helper method implementeren
Wat is raycasting?
Raycasting projecteert een onzichtbare straal (ray) vanuit de camera door de muis cursor naar de 3D wereld. Door te berekenen waar deze ray objecten raakt, kan je bepalen waar de speler klikt.
Gebruik in city builders:
Bepaal welke grid cell onder de cursor is
Valideer of een positie geldig is voor placement
Highlight cellen waar de muis over zweeft
Dit is de basis voor alle click-to-place building mechanics!
GridMapRaycaster Setup
Zet de node en het script op voor raycasting functionaliteit.
Node aanmaken:
Open scenes/main.tscn
Selecteer de Main root node
Voeg een Node3D child node toe en noem deze
GridMapRaycaster
Voeg een script toe aan de nieuwe GridMapRaycaster Node:
Class Name:
GridMapRaycasterInherits:
Node3DKlik Create
Exports toevoegen: Open het script en voeg referenties toe naar de Camera en GridMap:
Ray-Plane Intersection
Bereken het punt waar de ray van de camera kruist met de grond (Y = 0). Dit is de muisklikpositie.
Nieuwe wiskundige concepten:
Ray-Plane intersection - Bereken waar een lijnstuk een plat vlak snijdt
Nullable types -
Vector3?kannullzijn wanneer er geen intersectie is
Voeg een lege
RayHitsGroundhelper method toe aan je script:
Definieer het grondvlak en bereken de afstand
t. De grond ligt opY=0. Los de vergelijking op:0 = origin.Y + direction.Y * t.
Check of de ray naar beneden wijst. Als
tnegatief is, wijst de ray omhoog en raakt deze de grond nooit. Returnnullin dat geval.
Bereken het exacte raakpunt. Gebruik de parametrische vergelijking
P = origin + direction * t.
Muis coordinaten omzetten naar Grid coordinaten
Converteer de muispositie naar een grid coördinaat in vier stappen: muis → ray → world → grid.
Nieuwe Godot-specifieke elementen:
GetViewport().GetMousePosition()- Geeft de huidige 2D muispositie op het schermProjectRayOrigin()- Berekent het startpunt van de ray vanuit de cameraProjectRayNormal()- Geeft de genormaliseerde richting van de rayGridMap.LocalToMap()- Converteert een local 3D positie naar grid coördinatenGridMap.ToLocal()- Converteert world space naar GridMap local space
Voeg een lege
GetCellUnderMousemethod toe:
Haal de 2D muispositie op het scherm op:
Maak een 3D ray vanuit de camera door de muispositie.
ProjectRayOrigin()geeft het startpunt,ProjectRayNormal()de richting.
Check waar de ray de grond raakt met de helper method. Return
nullals de ray niet de grond raakt.
Converteer de world position naar een grid coördinaat.
ToLocal()converteert naar GridMap space,LocalToMap()naar grid indices.
Forceer Y naar 0 en return het grid coördinaat. Gebouwen plaatsen alleen op de begane grond, niet op verschillende hoogtes.
Voeg een lege
GetTileUnderMousehelper method toe:
Gebruik
GetCellUnderMouse()om de cell te verkrijgen. Return-1als er geen cell onder de muis is.
Return de tile ID op die positie.
GetCellItem()geeft de MeshLibrary index, of-1als de cell leeg is.
Configuratie en Testen
Koppel alles aan elkaar in de editor en test of het werkt.
Script koppelen:
Selecteer de GridMapRaycaster node in
main.tscnSleep
scripts/GridMapRaycaster.csnaar het Script veld
Exports instellen:
Sleep de Camera node naar de Camera property
Sleep de GridMap node naar de GridMap property
Testen (Tijdelijk): Voeg deze tijdelijke code toe aan je script om te testen:
Druk F5 en beweeg je muis over het grid.
Zie je coördinaten in de Output tab? Dan werkt het!
Vergeet niet de
_Inputmethod weer te verwijderen na het testen.
Volledig script
Laatst bijgewerkt