Starten met Programmeren van een 3D omgeving in Unreal Engine – Dynamische tijdlijn (Dag cyclus)

print
Deze handleiding maakt deel uit van het programmeertraject:


Inhoud


Wat vooraf ging


Inleiding

In deze handleiding gaan we zien hoe we eigenschappen dynamisch kunnen wijzigen. Hiertoe gaan we de eigenschappen van de Sky en Directional Light dynamisch wijzigen.

Omdat de Blueprintcode nogal uitgebreid is, en we ondertussen al wat gevorderd zijn, gaan we de Blueprintcode niet stap voor stap aanmaken maar ga ik me beperken tot het bespreken van de eigenlijke code.

  • Start een nieuw Third Person Desktop/Console project van Maximum Quality With Starters Content en geef het een passende naam.

Een overzicht van de verschillende elementen die een scene bouwen:

Het “weer”, de lucht, wordt bepaald door de Skylight, de SkySphereBlueprint (BP_Sky_sphere).

Merk een hele reeks van eigenschappen op zoals:

  • Sun Brightness
  • Cloud Speed
  • Cloud Opacity
  • Star Brigtness
  • Sun Height
  • Horizon Falloff
  • en de kleuren voor Zenith, Horizon, Cloud en Overall

die we allen kunnen instellen maar ook dynamisch wijzigen via programmeercode.

Merk ook op dat de eigenschap Directional Light Actor gekoppeld is aan Light Source, een Directional Light dat dienst doet als de zon.

Ook hier zijn eigenschappen die we dynamisch gaan wijzigen.


Regeneffect importeren

We gaan het ook laten regenen. De regen gaan we niet zelf aanmaken maar gaan halen in een bestaand, gratis project van Epic, namelijk Soul: City.

  • Klik op Add To Project en selecteer uw project waar u het wilt aan toevoegen. Het is een nogal groot project om enkel een effect eruit te gebruiken. Voeg in dit geval het project toe aan een tijdelijk project, dat u nadien kunt verwijderen.
  • In de map SoulCityEffectsParticles – water vindt u het gewenste effect P_RainStorm.

  • Klik P-RainStorm aan met de rechtermuisknop en kies voor Asset ActionsMigrate….

  • U krijgt een overzicht van alle bestanden die gemigreerd worden.

  • Klik op OK. Vervolgens selecteert u de Content-map van het project waar u het Regeneffect naar toe wilt migreren. Herhaal dit eventueel voor het geluidsbestand Rain_Heavy_Ext_Cue.

De migratie is beëindigd.

  • In het gewenste project, sleep P_RainStorm centraal naar uw level.
  • Merk dat het meteen begint te regenen. We wensen dit niet, we wensen het pas na een zekere tijd te laten regenen. Om de automatische activatie van het regeneffect uit te schakelen selecteert u P_RainStorm (in het level) en bij Details vinkt u Auto Activate uit.


Dynamisch weer

Het dynamische weer verandert het weer van zonnig naar bewolkt en uiteindelijke een regenbui.

  • In de Content Browser, klik op Add NewBlueprint Class (of klik met de rechtermuisknop in de net aangemaakte folder en klik op Blueprint Class).

  • Kies de Parent Class Actor.

  • Geef het een gepaste naam.
  • Dubbelklik om de Blueprint te openen.

We hoeven geen componenten toe te voegen.

We maken wel drie variabelen aan die we gaan koppelen aan de te gebruiken Sky, Light en Rain.

De 3 variabelen:

SkyRef is van het type BP_Sky_Sphere.

LightRef is van het type Directional Light.

RainRef is van het type Emitter (een particle effect)

Zorg dat voor alle 3 de variabelen de eigenschap Instance Editable aangevinkt is.

  • Maak de 3 variabelen aan.
  • Compileer en bewaar.
  • Sleep de Blueprint in het level.
  • Selecteer de Blueprint, merk de mogelijkheid op om een waarde aan de 3 variabelen toe te kennen. Selecteer de juiste actor uit het level voor iedere variabele. Bij het aanklikken van de keuzelijst is de lijst beperkt tot actors van hetzelfde type.

Omdat de Blueprintcode nogal uitgebreid is, en we ondertussen al wat gevorderd zijn, gaan we de Blueprintcode niet stap voor stap aanmaken. Ik heb ze reeds aangemaakt en ga ze nu bespreken.

Bij het begin van het spel, controleert u of de instantie van de variabele SkyRef bestaat en “geldig” is (IsValid). Indien de SkyRef bestaat start de tijdlijn.

De tijdlijn bevat 2 curven:

  • De eerste curve start bij waarde 0 en loopt tot waarde 1 over 30 seconden.
  • De tweede curve is een event die start na 25 seconden en het zal laten regenen.

Het laten regenen gebeurt door het activeren van de RainRef (P_RainStorm) gevolgd door het afspelen van een “regengeluid” (Play Sound 2D Rain_Heavy_Ext_Cue).

Verschillende eigenschappen van de variabele/referentie SkyRef worden ingesteld via Set Vector Parameter Value.

  • Target is de variabele/referentie SkyRef.
  • U moet de juiste Parameter Name opgeven.
  • De Value wordt aangestuurd door een Lerp (LinearColor)  voor kleurwaarden of een “gewone” Lerp voor Float-waarden. Een Lerp functie gaat van een waarde A naar B op basis van de waarde van Alpha. Alpha wordt hier aangestuurd door de tijdlijn die van 0 naar 1 gaat over 30 seconden. Vrij vertaald, in 30 seconden verandert de kleur/waarde van de kleur/waarde in A naar de kleur/waarde in B.De kleur/waarde voor A is de standaardkleur/waarde (of, de startwaarde u de standaardwaarde gewijzigd hebt (of wilt wijzigen). De kleur/waarde voor B is eerder proefondervindelijk, uitproberen wat u het meest geschikte effect lijkt (u moet dus zeker niet mijn waarden overnemen, experimenteer gerust).

De waarden voor de LightRef worden op een gelijkaardige manier als de SkyRef gewijzigd.

De tijdlijn bevat 2 curven:

  • De eerste start bij waarde 0 en loopt tot waarde 1 over 30 seconden.
  • De tweede curve is een event die start na 25 seconden en het zal laten regenen.


Dag cyclus

Dag en nacht wordt bepaald door de rotatie van de Directional Light Actor die gekoppeld is aan de Sky_Sphere.

Middernacht is een rotatie van:

  • X = 0
  • Y = 90
  • Z = 0

We gaan de bestaande BP_Sky_Sphere aanpassen of beter gezegd, we gaan niet het origineel aanpassen maar een kopij maken en deze gebruiken en aanpassen.

  • Zoek naar BP_Sky_Sphere binnen de Engine Content (die u eventueel eerst moet zichtbaar maken).

  • Kopiëer BP_Sky_Sphere naar uw eigen map.
  • Verwijder de originele BP_Sky_Sphere in uw level en plaats uw eigen uw kopij in het level.
  • Vergeet niet om de Directional Light Actor te koppelen.

  • Dubbelklik op uw kopij om de Blueprint aan te passen.

Er is reeds code aanwezig, we gaan deze aanpassen.

  • Voeg eerst de nodige variabelen toe:

  • UseDayCycle – Een Boolean (True of False) die aanduidt of we de Dagcyclus gebruiken of niet.
  • UseRealTime – Een Boolean (True of False) die aanduidt of we Real Time momenten wensen te gebruiken.
  • DaySpeed – Een Float die gebruikt wordt om de snelheid van de voortgang van de dag aan te duiden (zodat we geen 24 uur moeten wachten om een volledige cyclus waar te nemen).

In Constructor geven we mee dat de Directional Light Actor Movable moet zijn.

Bij Event BeginPlay controleer of Real Time actief is (op basis van de waarde van de variabele UseRealTime), indien dit het geval is zetten we de variabele DaySpeed op 1. Nadien gaan we controleren of de DagCyclus gebruikt wordt (op basis van de waarde van de variabele UseDayCycle), is dit het geval dan starten we een eigen Custom Event (functie) Start Day.

Er wordt een TimeLine gebruikt om de voortuitgang te bepalen. De gebruikte TimeLine noemt hier Day Circle. Deze Timeline loopt gewoon lineair van 0 naar 360 (graden) over 1 seconde.

De Eigen Custom Event Start Day:


De functionaliteit Set Play Rate bepaald de afpeelsnelheid van de TimeLine Day Cycle. De afspeelsnelheid wordt bepaald door de berekening waarbij:

1 / (86400 (aantal seconden in een dag) x Day speed) (door ons bepaald met een waarde tussen 0 en 1 via de variabele Day Speed).

Nadien wordt gecontroleerd of Real Time actief is (waarde van de variabele UseRealTime), is dit het geval dan moet:

1: eerst een nieuwe starttijd worden ingesteld voor de TimeLine (via New Time) op basis van de huidige tijd (de functie Now) van de dag in seconden gedeeld door 86400 (het aantal seconden in een dag)

2: De TimeLine wordt gestart (Play).

Indien niet Real Time wordt de Timeline (via Play from Start) opgestart op het beginmoment (middernacht).

De TimeLine, gaande van 0 tot 360, bepaalt de rotatie van de Directional Light Actor door het wijzigen van de Y-as, gecombineerd via de functie CombineRotators, met de stand om middernacht (Y = 90). Een nieuwe rotatie voor de Directional Light Actor wordt ingesteld via SetActorRotation. Tenslotte wordt de reeds bestaande functionaliteit RefreshMaterial aangeroepen om te vernieuwen.

Als de TimeLine eindigt wordt de Custom Event Start Day opnieuw aangeroepen (recursie) en start een nieuwe dag.

Onderstaande video was een inspiratiebron.


Geografisch accurate zonpositie

Sinds Unreal Engine 4.21 kan een geografisch accurate zonpositie bepaald worden door middel van de plugin Sun Position Calculator.

Dit kan vooral handig zijn voor architecturale visualisaties opdat u nu de correcte positie van de zon kunt opnemen in uw project.

  • Activeer eerst de plugin via EditPlugins en zoek naar de plugin Sun Position Calculator.
  • Vink Enabled aan en start uw project opnieuw op, de plugin wordt geïnstalleerd.

  • U kunt nu een nieuwe Blueprint aanmaken gebaseerd op BP_Sunposition.

  • Sleep de aangemaakte Blueprint in uw level. U krijgt een kompas te zien in het level. Dit kompas verwijst naar de BP_Sunposition Blueprint.
  • Klik het aan om een hele reeks van eigenschappen te zien die u kunt instellen waaronder Latitude, Longitude, Date, Time,… Merk ook de automatisch aangemaakte koppeling met de Sky Sphere uit uw level.

De Latitude en Longitude zijn deze van het PCVO Groeipunt. U kunt deze in o.a. Google Maps opzoeken.

Onderstaande code zal de stand van de zon iedere minuut wijzigen op basis van de huidige datum en tijd (opgevraagd via de functie Now). Ik denk dat de code op zich duidelijk is. Vergeet de functie Update Sun niet op het einde!.


Light Shafts

Hieronder ziet u de standaard zon.

Oké, niet echt… wow.

Gelukkig zijn er opties waar we wat meer kunnen spelen om het niet alleen mooier maar ook realistischer te maken.

Selecteer de Directional Light (het zonlicht) en in het Details-panel, onder Light Shafts vink:

  • Light Shaft Occlusion
  • Light Shaft Bloom

aan.

Nu kunt u met de parameters wat spelen.

  • Zet bv. de eigenschap Bloom Scale op 0.3.

Dit lijkt me beter, maar u mag van mening veranderen.

En als we nu nog wat vegetatie voor de zon brengen…

dan hebben we God Rays.


Behandelde Basiscompetenties uit de module ICT Programmeren – Integratie externe functionaliteiten

  • IC BC024 – * kan zijn eigen deskundigheid inzake ICT opbouwen
  • IC BC232 – kan digitale tools gebruiken om modellen, simulaties en visualisaties van de realiteit te maken
  • IC BC254 – kan externe content integreren en structureren
  • IC BC255 – kan de geïntegreerde content in functie van het beoogde eindresultaat aanpassen
  • IC BC256 – kan diverse elementen tot een nieuw betekenisvol geheel samenstellen
  • IC BC258 – houdt rekening met regelgeving m.b.t. licenties voor het gebruik en de publicatie van broncode
  • IC BC288 – kan ICT-problemen oplossen

Geef een reactie

Deze website gebruikt Akismet om spam te verminderen. Bekijk hoe je reactie-gegevens worden verwerkt.

  • Abonneer je op deze website d.m.v. e-mail

    Voer je e-mailadres in om je in te schrijven op deze website en e-mailmeldingen te ontvangen van nieuwe berichten.