Úkolem je implementovat jednoduchou fyzikální simulaci ve 3D. Kuličky pohybující se v homogenním gravitačním poli a odrážející se od průhledných stěn a od sebe navzájem.
Bude potřeba promyslet a doimplementovat následující komponenty:
Základem poslouží projekt 058marbles z repository
grcis
(GIT).
Je připravena aplikace se základem pro realtime simulaci na CPU a zobrazování pomocí
OpenGL.
Pro implementaci potřebných algoritmů budete modifikovat předem založené
třídy (všechny naleznete ve zdrojovém souboru Marbles.cs):
O dokonale pružném rázu nebo nepružném rázu se můžete dočíst v každé učebnici mechaniky nebo např. na Wikipedii (sledujte i odkazy). Základy reakce na náraz jsou např. v tomto článečku, v dalším se lze dočíst o základy Eulerovské integrace apod. Předpokládá se, že si o problematice sami něco málo nastudujete..
Jeden krok fyzikální simulace světa se spouští v metodě Form1.Simulate(), jsou implementovány dvě varianty základních smyček simulátoru:
Synchronní: kdy je jeden krok simulace ihned následován jedním vykresleným snímkem. To je implementováno uvnitř funkce Application_Idle(). Rychlost simulace i vykreslování je při zapnuté vertikální synchronizaci omezena frekvencí zobrazovacího zařízení (můžete však VSync vypnout a sledovat příp. vyšší rychlost simulace a vykreslování).
Asynchronní: kdy se simulace i vykreslování počítají ve dvou samostatných vláknech. Pokud asynchronní MT režim zapnete, bude se simulace počítat maximální rychlostí v samostatném vláknu, zatíží tedy na 100% jedno jádro vašeho CPU (viz Form1.SimulationLoop()). Vykreslování zůstává ve funkci Application_Idle() a je obvykle řízeno rychlostí displeje (simulovaná scéna pravděpodobně příliš nezatíží Vaši grafickou kartu).
Pro zajímavost byla do projektu 058marbles zabudována funkce "screencast", tj. ukládání vykreslených snímků v reálném čase na disk (z nich by bylo možné později vyrobit video). Funkce nezávislého transparentního sreencastu zajišťuje třída OpenglSupport.Screencast, režim se zapíná v parametrické řádce screencast=true a musí se opět ručně vypnout screencast=false.
Během zapnutého režimu "screencast" se na disk do aktuálního adresáře zapisují jednotlivé snímky ve formátu PNG. Tento mechanismus je implementován asynchronně ve vedlejším vláknu CPU a neměl by zpomalovat Váš program. Pokud by disk nestíhal zapisovat, v paměti se uschová fronta až 500 dosud nezapsaných snímků, aktuální velikost fronty snímků se zobrazuje jako číslo v závorce ve stavové řádce programu. Pokud by se fronta systematicky zvětšovala, Váš počítač zřejmě nestíhá a byde lepší screencast vypnout (silně doporučujeme při tomto režimu používat VSync!).
Body navíc budu přidělovat za jakékoli nadstandardní řešení: dynamicky přidávané kuličky (mohou naopak i zanikat), složitější geometrie kolizní scény, otáčení kuliček a tření při nárazu, realističtější nedokonale-pružný ráz, tření o vzduch (realistická balistika), alternativní zajímavé gravitační pole (a la "Angry Birds Space"), apod.
Odevzdat do: 31. 8. 2021
Základ: 12 bodů (jednoduchá ale funkční simulace, povinné jsou kolize mezi kuličkami navzájem a
mezi kuličkami a stěnami, gravitační pole),
dalších až 10 bodů: bonus za zajímavá rozšíření (viz výše)
Visual Studio projekt: 058marbles
Modifikujte a odevzdejte soubor: Marbles.cs (a případně změněné soubory shaderů)
Do funkce InitParams() napište své celé jméno!
Copyright (C) 2012-2021 J.Pelikán, last change: 2021-06-07 13:52:48 +0200 (Mon, 07 Jun 2021)