úloha 071: Rotační těleso pro ray-tracing

Úkolem je implementovat rotační těleso do paprskového zobrazovače (CSG scéna). Těleso bude definováno jako rotační plocha vzniklá rotací rovinné subdivision křivky kolem osy procházející v téže rovině. Subdivision křivka podle tzv. Chaikinova schématu je zadána posloupností řídících bodů (řídící lomenou čárou), viz obrázek a úlohu 069.

Chaikin

Upřesnění: plášť rotačního tělesa je zadán řídící lomenou čárou v rovině (která se poté podrobí subdivision dělení) definovanou posloupností vrcholů [ri,zi] pro i = 1 .. k+1, kde k je počet úseček. Subdivision křivka rotuje kolem osy z, tím vznikne plášť rotačního tělesa. Počáteční a koncový vrchol by měly ležet přímo na ose z, aby byl povrch uzavřený. Pokud tomu tak není, doplňte data o úsečku[y] kolmo k ose z směřující.
Pozn: má-li výsledná křivka začínat (končit, procházet přesně) daným bodem, musí se v definici zdrojového řídícího polygonu tento bod zduplikovat!
Zadání řídící lomené čáry v kódu: vrcholy definujte jednoduše v 1D poli double[], kde budou za sebou uloženy 2D souřadnice vrcholů: { r[1], z[1], r[2], z[2], .. r[k+1], z[k+1] }. Nejlepší bude deklarovat konstruktor public Revolution ( double[] v ), ve kterém si vstupní pole dále zpracujete (okopírujete, doplníte koncové úseky, apod.).

Náměty: použijte přímo v definici použitý cylindrický prostor souřadnic ([r,z], kde r2=x2+y2), v něm zůstává plášť rotačního tělesa 2D subdivision křivkou, paprsek se naopak trochu zkomplikuje (viz slajdy k přednášce).
Můžete potom úlohu řešit jako hledání průsečíku dvou křivek ve 2D.
Nebo si rozdělte plášť rotačního tělesa na pláště velice úzkých komolých kuželů a válců a paprsek se všemi těmito komponentami protněte (pozor, je třeba správně ošetřit vstupy a výstupy paprsku do a z tělesa).
Svoje řešení důkladně otestujte, nezapomeňte na výpočet normálového vektoru (v metodě CompleteIntersection()), všímejte si chování okolo obrysu a kontrolujte aspoň vizuálně odrazy a odlesky na povrchu testovacích těles.

Co modifikovat: ve zdrojovém souboru RayTracing.cs (příp. MonteCarloRT.cs) založte novou třídu public class Revolution : DefaultSceneNode, ISolid a do ní napište svoji implementaci (inspirace viz class Sphere).
Do definice scény (CustomScene) přidejte vaše těleso/tělesa, možná budete potřebovat modifikovat i polohu kamery, světelné zdroje, materiály, apod.

Co odevzdat: samozřejmě musíte poslat zdrojový soubor RayTracing.cs (MonteCarloRT.cs). U této úlohy navíc ocením pár spočítaných obrázků se zajímavými scénami, ve zdrojácích by měly být varianty scén dostupné v komentářích..

TERMÍN: do 20. 4. 2014

BODY: základ 25 bodů

PROJEKT: 019raytracing nebo 048rtmontecarlo

ZDROJOVÝ SOUBOR: RayTracing.cs nebo MonteCarloRT.cs


[Cvičení NPGR004]  [Návody k zápočtům v C#]  [Přednášky a semináře]  [Odkazy na demonstrace]

Valid XHTML 1.1 Copyright (C) 2011-2014 J.Pelikán, last change: $Date: 2014-03-17 12:25:24 +0100 (Mon, 17 Mar 2014) $
Send comments/requests to pepca.at.cgg.mff.cuni.cz