úloha 038: Uživatelské rozhraní pro otáčení 3D objektem
Úvod: cílem je vytvořit uživatelské rozhraní pro otáčení 3D objektem. Chceme, aby si uživatel
mohl pomocí myši pohodlně prohlížet objekt, podobně jako např. v 3D Studiu, Blenderu, nebo při
vizualizaci medicínských dat. Měl by mít především možnost objektem libovolně a intuitivně otáčet
a objekt si rozumně přibližovat a oddalovat. Podívejte se na ilustrativní
video.
Podstata úlohy: problém se typicky řeší tak, že si kolem manipulovaného objektu představíme
kouli (trackball), se kterou je objekt pevně spojený. Uživatel na kouli kliknutím vybere bod a táhnutím
myši po obrazovce určuje jeho novou pozici. Podstatou řešení je tedy určit které body na kouli
odpovídají počátku a konci přetahování a určit z nich osu rotace. Technické detaily lze odvodit
na papíře, nebo najít na
Implementace: jako kostru aplikace použijte projekt
038trackball
z repository
grcis. Ta vykresluje
jednoduchou 6-barevnou kostku nebo scénu načtenou z OBJ souboru. Nejspíš budete chtít
předělat některé z těchto metod:
- glControl1_MouseDown - tlačítko myši stlačeno
- glControl1_MouseUp - tlačítko myši uvolněno
- glControl1_MouseMove - myš se pohnula
- glControl1_MouseWheel - kolečko myši se otočilo (o kolik, to zjistíte
z parametru e.Delta tak, že hodnotu dělíte 120 /pro většinu myší/)
- glControl1_KeyDown - stisknutí klávesy
- glControl1_KeyUp - uvolnění klávesy
- buttonReset_Click - stisk tlačítka na resetování scény
- Render - kreslení scény
Různé kurzory myši můžete nastavit pomocí Cursor.Current = Cursors.Hand a
Cursor.Current = Cursors.Default. Rotační matice se dá sestrojit pomocí
Matrix4.CreateFromAxisAngle, quaterniony můžete a nemusíte použít.
Velikost okna v pixelech zjístíte pomocí glControl1.Width a
glControl1.Height.
Dodefinování rozhraní mimo trackball:
zašktnutá volba "restrict to trackball": je-li myš mimo trackball,
objekt se jenom natáčí za myší (hledá se nejbližší bod na trackballu). V opačném
případě má platit: je-li myš mimo trackball, objekt se dál otáčí ve směru tažení.
Když si uživatel sníží citlivost, může tak lépe využít zbytku obrazovky k otáčení,
aniž by musel přehmatávat na druhou stranu trackballu.
Odevzdání: jako řešení úlohy posílejte mailem modifikovaný zdrojový soubor
Trackball.cs. Pokud jste vymysleli nebo použili nějakou netradiční metodu,
doplňte ji krátkým průvodním textem.
BODY: 6 až 14 + bonus:
- 6b - základní rozhraní, které umožní libovolné natočení a (rozumné) přiblížení objektu
- 1b - dodefinování rozhraní mimo samotný trackball a nastavení rychlosti otáčení
- 4b - vyřešení nespojitostí (osy rotace jsou dvě v závislosti na směru tažení,
os rotace je nekonečně mnoho, další, pokud najdete) modelu při dodefinování rozhraní mimo
trackball - řešení podle Shoemakeho, kap. 4 z
Virtual Trackballs Revisited
bez nespojitostí bude hodnoceno čtyřmi body, to neplatí pro hyperbolické rozšíření
z kapitoly 5!.
- 1b - možnost přepínání ortografické a perspektivní projekce (klávesnicí)
- 1b - vykreslování obrysu trackballu
- 1b - přepínání tvaru trackballu mezi elipsoidem a koulí
- bonus - za inovativní a funkční řešení, rozšíření existující metody,
více metod.
TERMÍN: do 18. 12. 2011
PROJEKT: 038trackball
ZDROJOVÝ SOUBOR: Trackball.cs
ŘEŠENÍ POSÍLEJTE Honzovi Benešovi,
do předmětu připište "038trackball".
Copyright (C) 2011 J.Pelikán,
last change: $Date: 2014-10-03 15:44:39 +0200 (Fri, 03 Oct 2014) $
Send comments/requests to
pepca.at.cgg.mff.cuni.cz