Instructie 4 - Visualisatie

Opgave 4.1 - bereken shading

  1. Maak een vlak loodrecht op de z-as met behulp van een regelmatig 2-dimensionaal rooster (StructuredGrid dataset) met afmetingen n x n.
    Bereken in je eigen Java-programma de belichting van elk roosterpunt, gegeven: Gebruik de formule voor diffuse belichting: formule 3.2 op pagina 44.
    Hints:
    • uw programma zou globaal de volgende structuur kunnen hebben;
      class Opdracht4_2 {
        static double[] lightPosition = {?,?,?}; // position of light source
        static double[] lightColor    = {1,0,0}; // red = color of light source
        static double[] planeColor    = {1,1,1}; // white = color of plane
      
        public static void main(String[] argv) {
              // maak rooster
      
      	// bereken kleur in ieder roosterpunt
      
      	// schrijf weg naar vtk file
         }
      
        // bereken diffuse belichting in een punt op positie p met normal n.
        // Gegeven: een lichtbron op position pL, het object heeft de kleur cO, 
        // de lichtbron heeft de kleur cL.
        static double[] diffuse(
              double[] p,      // position
              double[] n,      // normal at p
              double[] pL,     // position of light source
              double[] cO,     // color of object
              double[] cL      // color of light source
      	) 
           {
              ...
           }
      }
      
    • kies de positie van de lichtbron zo dat het resultaat veel variatie in shading geeft. Moet hiervoor de lichtbron dichtbij het vlak staan of juist ver weg? Ga dit na aan de hand van de formule voor diffuse belichting.
    • gebruik het bijgeleverde package Calc voor vector berekeningen: Calc heeft onder andere methoden voor optellen en aftrekken van vectoren, inproduct, uitproduct, vermenigvuldigen met een scalar, elementsgewijze vermenigvuldiging van 2 vectoren en normalisatie.
    • Pas op! voor een kleur moet gelden dat ieder van de component R, G, en B groter of gelijk is aan 0 en kleiner of gelijk is aan 1; zo niet dan zal mayavi vreemde kleuren geven! De formule in het VTK boek is geen automatische garantie dat kleuren hieraan voldoen. Ga dat na en bedenk in welke situaties een 'negatieve' kleur uit deze formule komt en bedenk hoe dit te voorkomen is.
    • Bedenk wat de invloed van het aantal roosterpunten is op het eindresultaat.
    • Wat gebeurt er als de kleur van lichtbron en vlak verwisseld worden? Verklaar aan de hand van de formule.
    • gebruik de module SurfaceMap in het menu [Visualize/modules] van mayavi.
  2. vervang het vlakke rooster in deel A door een rooster waarbij bij ieder roosterpunt een z waarde gegeven is. Bijvoorbeeld:
    	z(x,y) = a * (Math.sin(f*x) + Math.cos(f*y))
    
    met
    	f = 2*Math.PI/n, 
    	a = 1/f,
    	n = aantal roosterpunten in bijvoorbeeld x-richting.
    
    Bedenk dat om een belichting te kunnen berekenen U een normaalvector nodig heeft in een punt (x,y,z(x,y)) van het oppervlak.
    Hints:
    • gebruik voor berekenen normalen partiele afgeleiden en het uitproduct
    • om zeker te zijn dat de normaalvectoren goed berekend zijn, stop deze in een VectorField en beeld ze af met de module HedgeHog.

Opgave 4.2 - bereken lookup tables

Maak een paar lookup-tables en gebruik ze voor de visualisatie van de scalar-dataset van de laatste opgave van instructie 3. Pas zonodig je oplossing van deze opgave zo aan dat alle scalarwaarden in je dataset tussen 0 en 1 zitten.