2026-10-30 14:48:06 +01:00
2026-10-30 14:48:06 +01:00
2026-10-30 14:48:06 +01:00
2026-10-30 14:48:06 +01:00
2026-10-30 14:48:06 +01:00
2026-10-30 14:48:06 +01:00
2026-10-30 14:48:06 +01:00
2026-10-30 14:48:06 +01:00
2026-10-30 14:48:06 +01:00

Universe

En proceduriell 3D-universumsgenerator för Windows med C#/.NET 10, Silk.NET och OpenGL 3.3.

Starta

dotnet run --configuration Release --project src/Universe.App/Universe.App.csproj

Appen börjar framför Jorden (earth) i vårt solsystem i cell (0,0,0). Startmål och vy väljs i config.json.

Solen och de åtta planeterna definieras i KnownSolarSystem/solar-systems.json. Där finns även Jordens måne, Saturnus ringar, planeternas axellutning, atmosfärer och material. Jordens färg- och höjdkartor ligger i KnownSolarSystem/Textures/. Se katalogens dokumentation för fler solsystem och för kombinationen heightmap + noise.

Content/README.md beskriver markmaterialen och den regionala höjdrutan för Alperna. Materialkatalogen och varje planets materials-inställningar är redigerbara i JSON.

Kontroll Funktion
WASD + mus Fri flygning och riktning
P Öppna/stäng menyn. Välj Play, Free Camera, Debug, Benchmark Earth, Benchmark Unknown eller Quit med musen eller piltangenter och Enter
Space / Ctrl Upp / ner relativt kameran
Mushjul Logaritmisk hastighet, 0,1 m/s till 1 000 000 c
Q Mjuk flygning till närmaste planet
1–9 Flyg till planeten på motsvarande plats i startup.planetHotkeys i config.json
F2 Mjuk flygning till en bergsvy nära ytan; hastigheten sänks till 1 200 m/s
F3 Närbild av närmaste stjärna
F4 Mjuk flygning till närmaste ringsystem; lokala isstenar och låg flyghastighet
F1 Släpp / fånga muspekaren
F5 Ladda om shaders; Debug läser direkt från shaderfilerna
F6 Flyg till en solbelyst havsvy nära vattenytan; hastigheten sänks till 10 m/s
F7 Flyg till en vy ovanför närmaste molnlager; hastigheten sänks till 100 m/s
Esc Stäng pausmenyn, eller avsluta när menyn är stängd

Play växlar till förstapersonsläge. WASD går längs marken, musen ser sig omkring, Space hoppar och Ctrl hukar. Spelaren dras mot närmaste fasta planet och orienteras efter dess lokala gravitation. Från stora avstånd används en snabbare inflygning för att landningen ska vara spelbar. Free Camera återställer fri flygning. Pausmenyn stoppar rörelsen medan den är öppen. Gasjättar har ingen fast mark och väljs därför inte som landningsmål.

Benchmark Earth kör en fast 72-sekunders kameraresa vid Jorden: rymdvy, inflygning och separat mjuk bromsning sista 10 km mot Alpernas Copernicus-terrängdata, följt av en långsam promenadslinga med kameran 1,8 m över marken. Benchmark Unknown kör samma resa på den största tillgängliga proceduriella stenplaneten bland närliggande system som är större än Jorden; dess högre terrängamplitud ger kraftigare proceduriell relief. Blicken sveper runt under promenaden. När testet är klart återgår kameran till sin ursprungliga vy mot Jorden. Panelen uppe till höger visar målplanet och FPS över tid, medelvärde, lägsta bildfrekvens och 1 %-låg. Tryck P eller Esc för att avbryta och öppna menyn. Benchmarken återställer Debug-läget så debug-prober inte påverkar mätningen.

Välj Debug i P-menyn för en panel till vänster med asynkron GPU-tid för separata renderpass och varje ritad planet, CPU-tid för renderingsanropet, FPS och terrängens LOD/chunkstatus. En gång var åttonde bildruta gör debugläget dessutom en osynlig extrarendering av den dyraste planeten med en effekt avstängd. Panelen visar tidsvinsten jämfört med normalrenderingen för material, molnskuggor, bergsskuggor, planet-/ringskuggor och ytdetalj-noise. Varje effekt mäts separat, och skillnaden medelvärdesbildas över de senaste matchande mätningarna. Proberna är asynkrona och påverkar FPS något när debugläget är på; GPU FRAME visar den vanliga bildrenderingen utan probe-drawen. Skuggorna ingår också i planetens ordinarie tid eftersom de räknas i samma terrängshader.

Värld och grafik

  • Kända system från JSON ersätter proceduriell generering i sina tilldelade celler. Övriga 100 AU-celler bestäms av global seed och SectorCoordinate(long X, long Y, long Z). Positionerna behåller dubbelprecision och konverteras till kamerarelativa GPU-koordinater.
  • Systemens centrum förskjuts med 3D-noise. Stjärnor, lutade elliptiska planetbanor och månar får olika seedade riktningar, faser och avstånd. Alla himlakroppar hålls inom sina celler.
  • Berg består av domain-warped ridged multifractal-noise. Samma höjdfält används för kollisionsytan, CPU-meshar och GPU-skuggning.
  • Terrängen är en adaptiv cube-sphere med quadtree-chunks. Rutor utanför synfältet och bakom horisonten sorteras bort med konservativa gränser för berg, dalar och skarvar. Närmaste terräng förfinas först, med högre detalj nära kameran och grövre geometri på avstånd. Föräldrachunken visas tills synliga barn är klara. Chunks förankras i dubbelprecision så närflygning behåller precisionen.
  • Material varierar med höjd, lutning, mineral-noise och geologiska lager. Terrängnormaler beräknas från höjdfältet vid meshgenerering, kompletteras med finare normaldetaljer och används tillsammans med höjdfältet för bergsskuggor. Alla systemets stjärnor bidrar med ljus och planetförmörkelser.
  • Atmosfären integrerar Rayleigh- och Mie-spridning längs både kamera- och solljusstrålar. Djupbufferten begränsar integrationen framför marken. Det ger blå himmel, färgade horisonter, dis mellan berg och en atmosfärsrand från rymden.
  • Stjärnorna har långsamt animerad plasma, filament, aktiva områden, granulation och kantförmörkning. Korona, HDR-bloom, ACES-tonmappning, kantutjämning och dithering behandlas i separata pass.
  • Bakgrunden består av ett seedat stjärnfält och stjärnorna i granncellerna. Atmosfär och dagsljus dämpar stjärnfältet nära marken.
  • Gas- och isjättar renderas som ljussatta, tillplattade gasvolymer med band, polarfärger och dimma vid inflygning. De har ingen terrängmesh eller fast kollisionsyta.
  • Ringarnas optiska profil innehåller oregelbundna band och separata luckor. Samma täthet styr skuggor och lokal generering av isstenar. Nära ringarna ersätts ringmaterialet gradvis av instanser med detaljbyte mellan punktpartiklar och oregelbundna 3D-stenar. Inställningar finns i planetens gas och rings i JSON; se katalogens dokumentation.
  • Ringstenar får upp till 81 920 trianglar på riktigt nära håll, med gradientnoise, individuella proportioner, kratrar och finare ytstruktur. rings.rocks.asteroid styr geometrins LOD och detaljbudget.
  • Varje sol har avståndsdämpade HDR-strålar, halo och färgade linsreflexer. Glöden förblir synlig långt ut i systemet och kontrolleras mot framförliggande objekt. Solens glow-block styr effekten.
  • Jorden har ett separat sfäriskt hav med animerade vågor, Fresnelreflektion, solljusglitter, skum, refraktion och djupberoende ljusabsorption. Havsbotten och kustmasken används av både terrängen och kollisionen. ocean i planetens JSON styr vattenmaterialet; F6 visar havet nära ytan.
  • Sfäriska 3D-moln använder fraktal noise och Worley-noise, vind, självskuggning och ljus från systemets solar. Valfria equirektangulära gråskalekartor styr den geografiska täckningen; jordens Content/Clouds/earth-clouds.png används i solsystemets JSON, där vitt betyder moln och svart klart. Molnen skuggar mark och hav, dämpar solglöden och speglas i vattnet. clouds i planetens JSON styr karta, utseende och kvalitet.

Detta är en visuell realtidsprototyp. Banorna är statiska och terrängen använder proceduriell relief; ingen hydrologisk erosionssimulering eller atmosfär med multipel spridning beräknas.

Projekt

  • src/Universe.Core: koordinater, systemgenerering, noise, terräng, streaming och svept kollision.
  • src/Universe.App: fönster, kamera och OpenGL. Shaderkoden finns under Graphics/Shaders/ och bäddas in i bygget.
  • tests/Universe.Tests: koordinater, determinism, cellgränser, terrängkanter, normaler och FTL-kollision.

Bygg och verifiera

dotnet build Universe.sln --configuration Release -m:1
dotnet test tests/Universe.Tests/Universe.Tests.csproj --configuration Release

Kontrollera även den faktiska GPU-höjdfunktionen mot CPU/kollision med:

dotnet run --configuration Release --project src/Universe.App/Universe.App.csproj -- --validate-graphics

Kontrollen läser ett separat numeriskt GPU-testfält och stoppar appen om höjdfälten skiljer sig för mycket. Även Jordens heightmap, axellutning och extra noise jämförs med CPU/kollision. Den vanliga renderingens färgbuffert använder 16-bitars flyttal; testfältet använder 32-bitars flyttal.

En marknära terrängvy med ruttider och diagnostiska, synkroniserade mätningar per renderingspass kan köras med dotnet run -c Release --project src/Universe.App -- --terrain-perf-report. Resultaten varierar med vy, upplösning, laddade rutor och maskin; synkroniseringen i rapporten påverkar också tiderna.

Atmosfärens integrationsmodell bygger på principerna i GPU Gems 2, Accurate Atmospheric Scattering.

Skärmbilder

Bilder direkt från Release-appens OpenGL-rendering:

Jorden som startmål med de bifogade kartorna

Jordens animerade hav med reflektioner och solglitter

Berg, atmosfär och måne

Stjärnans plasma och glöd

Även standardvyn för tangent 2 finns sparad i artifacts/surface-view.jpg.

Närbild och avståndsdämpad solglöd, sparade från den riktiga renderingskedjan:

Asteroid med kratrar i Saturnus ringar

Solen med synlig glöd från 30 AU

Automatiska GPU-kontroller och nya bilder kan genereras med --graphics-report respektive --scene-report. Se katalogens dokumentation för kommandon och JSON-inställningar.

Description
No description provided
Readme 336 MiB
Languages
C# 84.7%
GLSL 13.3%
JavaScript 1.2%
Python 0.6%
PowerShell 0.2%