![]() |
Om det här är ditt första besök, se till att gå till vår FAQ (finns även länk till FAQ i navigeringsmenyn ovan). Du kan behöva att registrera dig innan du kan posta (finns även en länk till registrering i navigeringsmenyn ovan). För att titta på inlägg, välj det forum som du vill besöka från de som är listade nedan. |
|
![]() |
|
Ämnesverktyg | Visningsalternativ |
|
![]() |
#1 |
Medlem
Reg.datum: Nov 2009
Ort: Gävle
Inlägg: 163
|
![]()
Kolbädden har jag satt upp ett material med emission i Blender.
fyr_emit.jpg Bakade ut emission materialet, sparade av det för att kopiera över det till albedon i materialet för trainz (maskade förståss av allt utom kolbädden), sedan gjorde jag en svartvit version av mitt emission-materialet som sparade av för att sedan kopiera in det i det slutliga materialet för Trainz. Resten av fyrens, valvets och väggarnas material satte jag upp med "area light" under kolbädden och bakade ut och gjorde på samma sätt med kolbädden. Materialet till Trainz består av både kolbädden, fyrens väggar och valvet. Vad gäller displacementet på kolbädden använde jag mig av AO-mappen som ingick i PBR-materialet som jag laddat ned. Justerade den i Gimp så att de högsta punkterna var helt vita. Bakade ut den till lämplig ställe på Principeld BSDF (tror att jag valde metallic) och lade in den i normalmappens alphakanal. Vad gäller nivåerna i height i normalmappen så har jag förstått det så att Trainz tolkar det så att 100% vitt är i nivå med meshet och alla mörkare nyanser hamnar lägre än meshets nivå, vilket gör det ju väldigt svårt att få att fungera när det är ett komplicerat objekt som är texturerat. |
![]() |
![]() |
![]() |
#3 |
Medlem
Reg.datum: Jan 2008
Ort: Uppland, Sverige
Inlägg: 2 728
|
![]()
Ah, väldigt snyggt! Jag ska se om jag kan knåpa ihop något liknande!
![]() Fixade färdigt med scriptet för att öppna rätt lucka beroende på om det lastas kol eller vatten idag. Här är de relevanta delarna: Kod:
class #### isclass STLSteamEngine { Asset coalAsset; Asset waterAsset; public void Init() { inherited(); .... // Initialize STLSteamEngine things coalAsset = me.GetAsset().FindAsset("coal"); waterAsset = me.GetAsset().FindAsset("water"); } float BeginLoad(LoadingReport report) { int i; for (i = 0; i < report.srcQueue.GetProductList().size(); i++) { if (report.srcQueue.GetProductList()[i] == coalAsset) { // Öppna kolboxluckorna } else if (report.srcQueue.GetProductList()[i] == waterAsset) { // Öppna vattentankluckorna } } return 1.0; } float EndLoad(LoadingReport report) { int i; for (i = 0; i < report.srcQueue.GetProductList().size(); i++) { if (report.srcQueue.GetProductList()[i] == coalAsset) { // Stäng kolboxluckorna } else if (report.srcQueue.GetProductList()[i] == waterAsset) { // Stäng vattentankluckorna } } return 1.0; } }; Init är den metod som anropas först när man skapar ett lok av denna typen och den letar först reda på referenser till Assetsen för coal och water och sparar dem i variablerna coalAsset och waterAsset. Sedan är det BeginLoad och EndLoad som anropas före och efter lastningen sker. Dessa är väldigt lika. Jag har en for-loop som går igenom alla produkter som kommer att lastas enligt den LoadingReport som skickas med till dessa metoder. Sedan kollar jag bara att om någon av de produkter som lastas är coalAsset eller waterAsset så får man lägga till kod för att öppna/stänga luckorna. Det gör man antagligen med: Kod:
SetMeshAnimationState("tank_lid", true); Kod:
SetMeshAnimationState("tank_lid", false); Antagligen har du redan ett script till ditt lok, så då är det bara att lägga till de nya delarna från exemplet ovan. Init metoden finns redan, så där räcker det med att kopiera in de två sista raderna med coalAsset = ...osv. BeginLoad och EndLoad är bara att kopiera och klistra in, samt lägga till kod för att faktiskt öppna eller stänga luckor och så vidare. Om du skulle behöva hjälp att scripta loken sedan så är det bara att säga till så kan jag hjälpa till! ![]()
__________________
-k- |
![]() |
![]() |
![]() |
#4 |
Medlem
Reg.datum: Nov 2009
Ort: Gävle
Inlägg: 163
|
![]()
Det var verkligen snabbt marscherat med "luck-scriptandet".
![]() Att kunna öppna luckorna manuellt verkar mycket intressant, hade faktiskt funderat på om det skulle vara möjligt. Blev inte riktigt klok på om det sista med "SetMeshAnimationState", gäller för manuellt öppnade eller hör till det automatiska. Måste verkligen ta i tu med att börja sätta mig in i scriptande ![]() Skulle vara oerhört tacksam om hjälp med scripten om jag skulle stöta på patrull (vilket jag förmodligen kommer att göra) |
![]() |
![]() |
![]() |
#5 |
Medlem
Reg.datum: Jan 2008
Ort: Uppland, Sverige
Inlägg: 2 728
|
![]()
Har suttit och grejat med fyrboxen bland annat sedan sist. Jag upptäckte att det finns ett väldigt välgjort lok QR PB15 i TRS2019 som har mycket snygga texturer och dessutom en väldigt snygg fyrbox! Jag kontaktade byggaren (GDennish) på det internationella Trainz-forumet och fick ett väldigt hjälpsamt tillmötesgående med massor av bra tips på hur man ska animera och texurera fyrboxar för att det ska bli snyggt.
![]() Ett tips är att kolla på hans egna mesh-bibliotek som han nyss släppt. Finns på DLS: <kuid:217537:2064>,<kuid:217537:2091>,<kuid:217537 :2333>,<kuid:217537:2039> Jag tog med mig dessa idéer och vidareutvecklade dem lite ytterligare. Jag använder tre olika delar: * En mesh för själva fyrboxen, vilket är en statisk mesh med emission * En animerad eldsflamma-mesh som jag har satt ut 10 stycken av och som har Aurans gamla texture * En statisk mesh som bara är en polygon som sitter i fyrboxöppningen med en semitransparent texture med emission för att förhöja känslan av värme inne i fyrboxen. Alltså typ samma setup som på PB15-loket. Flamman har jag gjort tre olika animationer av, med tre olika storlekar på flammorna, så jag kan styra flammornas storlek enbart genom att med ett script byta animation på dem. Dessutom använder jag texture-replacement för att byta ut Albedo-texturen på fyrboxens väggar så att de varierar mellan en rödare nyans när fyrboxen inte är så varm, en orangeare när den är medelvarm och en vitare när den är riktigt varm. Samma sak med eldsflammorna, fast med bara två nivåer, en orangeare när fyrboxen är kallare eller medelvarm och en med vitare flammor när fyrboxen är riktigt varm. Så dessa två "dimensioner" av fyrboxen styr jag med hjälp av ett script. Färgen styrs baserat på Trainz interna parameter över hur varm fyrboxen är. Flammornas höjd styr jag baserat på draget i fyren, det vill säga en kombination av ifall hjälpblästern är på, samt trycket i ånglådan. Eftersom trycket i ånglådan går upp och ned med ångslagen så får jag dessutom en liten effekt att flammornas storlek fladdrar upp och ned mellan medel och höga flammor med ångslagen vid igångsättning, precis som de gör på riktigt (men då på grund av att avloppsångan som dras upp i skorstenen drar med sig extra mycket luft genom rosterna och fyren). Hur detta ser ut i verkligheten kan man se ganska tydligt på denna video: https://www.youtube.com/watch?v=-LXOLjCGPOM ![]() De olika storlekarna på flammor samt de två varmare färgnyanserna Själva animationen av flamman var lättare sagt än gjort att få till. ![]() Jag har använt Aurans gamla flame-texture (Denna, fast i original-upplösning: https://online.ts2009.com/mediaWiki/...:CCG_Fire1.jpg) Jag har sedan gjort en animerad mesh med denna textur på en ensam flamma som jag med hjälp av attachments satt ut 10 stycken av i fyrboxen. En sådan flam-mesh består av 8 planes, en för varje bild i textur-animationen. Varje plane är kopplat till en empty längst ned på flamman , b.r.flameX, som styr själva animationen. Sedan animerar jag Z-skalan på varje empty, så att Z-skalan är 0 när den är osynlig och 1 när den är synlig. Här kommer dock ett krux: Trainz interpolerar animationen, så om man använder 8 frames i Blender för sin animation(alltså en för varje bild i texturen), så kommer man se en massa tillfällen i Trainz när animationen är halvvägs mellan frame 1 och 2 till exempel, så man har två halvhöga flammor istället för en fullhög. Så det löste jag (med GDennish hjälp) genom att låta varje bild visas i 10 frames och att låta bilderna överlappa med en frame mellan varje bildbyte. Så att b.r.flame0 visas mellan frame 1 och frame 10. På frame 11 så har den Z-scale 0 och blir osynlig. Men redan på frame 10 kommer b.r.flame1 att börja visas och den är alltså dold på frame 9. Sedan visas den till frame 19. Och så vidare. Så i Blender kommer det vara vissa frames där två bilder syns överlappande, men det kommer inte att synas i spelet på grund av interpoleringen. Dessutom satte jag "interpolation" till "constant" i Blender. Sedan ett tips om man animerar scale i Blender som jag också hade en massa trassel med. För att det ska fungera i spelet så måste man exportera mesherna på en frame där de har full skala (X-scale=1, Y-scale=1, Z-scale=1), annars dyker de kanske inte upp i spelet. Jättekonstigt, men så är det. Jag löste det genom att låta animationen gå från frame 1 till frame 73 och sedan lägga till en keyframe med alla b.r.flameX på frame 0, där de har full skala. Sedan måste man bara se till att stå på frame 0 när man exporterar. ![]() Därefter var det bara att göra tre sådana animationer och exportera, där jag varierade vilken Z-skala jag hade när flammorna var synliga. Såhär ser det ut i Blender: ![]() Sedan fick jag ett tips om en feature som jag inte visste om. Trainz stödjer HDR-texturer! ![]() Detta sker dock bara på pixlar som blir rendrerade i spelet till att vara ljusare än vad högsta ljusheten i emission på parameter-texturen kan åstadkomma med PNG, så jag trodde det bara fungerade när solen lyser på en yta och gör den ljusare och inte genom materialets egna emission som ju är begränsad av PNG-filens maxljushet. Men man kan istället för en 8 bitars PNG använda en 32 bitars .hdr-bild, vilken kan spara värden som är "ljusare" än vad som är möjligt i en PNG! Så jag tog in min PBR parameter-texture som jag hade gjort som en PNG och i Photoshop, bytte till 32-bitars färgdjup och ökade på nyansen i den röda färgkanalen (som motsvarar emission) till över 1.0, (vilket alltså motsvarar 255 i PNG) På det sättet så kommer ljusheten inne i Trainz att gå över tröskelvärdet som en pixel måste ha för att få den här bloomeffekten. Det tillförde rätt mycket till det hela faktiskt, se själva på följande gif som alltså är inifrån spelet ![]() ![]()
__________________
-k- |
![]() |
![]() |
![]() |
#6 |
Medlem
Reg.datum: Nov 2009
Ort: Gävle
Inlägg: 163
|
![]()
Fantastiskt
![]() |
![]() |
![]() |
![]() |
#7 |
Medlem
Reg.datum: Jan 2008
Ort: Uppland, Sverige
Inlägg: 2 728
|
![]()
Scriptandet kan jag hjälpa dig med när du kommer dit!
![]() ![]()
__________________
-k- |
![]() |
![]() |