wtorek, 31 sierpnia 2010

[WPF 3D] Niech stanie się światłość! [PL]

Ten wpis jest kontynuacją tematyki związanej z WPF 3D, w którym przedstawiony zostanie ważny element każdej sceny, a mianowicie światło.
Niniejszy wpis poza prezentacją różnych i niezależnych od konkretnego wykorzystania treści stanowi również opis pewnych zagadnień związanych z projektem Mesh Diagram 3D.Informacje dotyczące projektu oznaczone są etykietą MeshDiagram3D.
W WPF 3D światło (Light) jest elementem każdej sceny i tak jak każdy element sceny jest umieszczone w scenie jako zawartość (Content) obiektu ModelVisual3D (wspominałem o tym już wcześniej na etapie omawiana podstawowych elementów sceny w WPF 3D). W scenie możemy stosować kilka różnych świateł, a każde może być innego typu. Mamy do dyspozycji następujące typy świateł: AmbientLight, DirectionalLight, PointLight, SpotLight

AmbientLight

Jest ono najprostszym sposobem oświetlenia sceny i nazywane jest światłem otoczenia. Światło cechuje duże jego rozproszenie. Obiekty nim oświetlane, są oświetlone równomiernie i chciałyby się rzec, że światło to świeci z każdej strony. Często jest ono stosowane, jako dodatkowe źródło światła, gdyż dzięki niemu łatwiej spowodować, by żadne (nie oświetlone przez inne źródła światła) ściany (trójkąty) w scenie nie były „czarne”. Jego jedynym parametrem jest kolor (Color).

DirectionalLight

Jest to światło kierunkowe. Można je porównać do bardzo odległego źródła światła, którego promienie padające na obiekty w scenie są niemal równoległe. Posiada kolor (Color) oraz kierunek promieni (Direction). Nie posiada określonej pozycji, więc oświetla wszystkie obiekty na scenie w ten sam sposób.

PointLight

Jest to źródło światła o charakterze punktowym, świecące we wszystkich kierunkach. Przy konfiguracji tego oświetlenia wskazujemy jego pozycję (Position) i kolor (Color). Światło to może również przygasać wraz z rosnącą odległością od oświetlanego obiektu (właściwości: ConstantAttenuation, LinearAttenuation, QuadraticAttenuation).

SpotLight

To światło to „lampka” lub „reflektor”, który punktowo świeci na obiekt. Jednak w odróżnieniu od oświetlenia typu PointLight, światło to ma pewien charakter kierunkowy (wskazujemy Direction) oraz charakteryzuje je też kąt przestrzenny świecenia (właściwości InnerConeAngle oraz OuterConeAngle)

Porównanie oświetlenia w scenie 3D

Poniższy rysunek przedstawia porównanie wspomnianych źródeł światła:
To porównanie powstało w oparciu o scenę (opisaną w XAML):
<Viewport3D Name="mainViewport" ClipToBounds="True">
    <Viewport3D.Camera>
        <PerspectiveCamera
    FarPlaneDistance="100"
    LookDirection="-10,-11,-12"
    UpDirection="0,1,0"
    NearPlaneDistance="1"
    Position="10,11,12"
    FieldOfView="70" />
    </Viewport3D.Camera>
    <ModelVisual3D>
        <ModelVisual3D.Content>
               <!--<DirectionalLight Color="White" Direction="-1,-2,0" />-->
               <!--<PointLight  Color="White"  Position="2,2,2"/>-->
               <!--<SpotLight  Color="White"  Position="2,2,2"  Direction="-1,-2,0"/>-->
               <AmbientLight Color="White" />
        </ModelVisual3D.Content>
    </ModelVisual3D>
</Viewport3D>
Światło w scenie było wybrane jako jedno z występujących w kodzie XAML powyżej (od-komentowane było to właściwe). Dodatkowo na scenie umieszczono dwa obiekty sześcian i czworościan (zgodnie z omawianymi wcześniej funkcjami):
ModelVisual3D mv3d = new ModelVisual3D();
mv3d.Content = CreateCubeModel3DGroup( -5, 0, 0, 4, 4, 4 );
this.mainViewport.Children.Add( mv3d );
ModelVisual3D mv3d_2 = new ModelVisual3D();
mv3d_2.Content = CreateTetraederModel3DGroup( 5, 0, 0, 4, 4, 4 );
this.mainViewport.Children.Add( mv3d_2 );
Promuj

3 komentarze:

Posty powiązane / Related posts