Pular para o conteúdo

Viewport3D por Hardware, Malhas & Câmeras (WpfViewport3DManager.cs)

O arquivo WpfViewport3DManager.cs gerencia a visualização de modelos 3D com aceleração de hardware via DirectX e pipeline de malhas triangulares do WPF.


No WPF, todo modelo tridimensional é constituído por triângulos descritos na classe MeshGeometry3D:

  • Positions: Vetores tridimensionais (X,Y,Z)(X, Y, Z) definindo a localização de cada vértice no espaço local.
  • TriangleIndices: Trios de índices inteiros que conectam os vértices para formar as faces triangulares.
  • Ordenação Anti-Horária (CCW): A ordem de indexação (V0→V1→V2)(V_0 \to V_1 \to V_2) define a face frontal através da regra da mão direita. Triângulos visualizados por trás são descartados por Back-Face Culling.
<!-- Malha Triangular de um Plano com Coordenadas UV de Textura -->
<MeshGeometry3D Positions="-1,0,-1 1,0,-1 1,0,1 -1,0,1"
TriangleIndices="0,1,2 0,2,3"
TextureCoordinates="0,0 4,0 4,4 0,4"/>

A classe PerspectiveCamera simula o olho humano e lentes ópticas:

  • Position: Localização do observador no espaço (X,Y,Z)(X, Y, Z).
  • LookDirection: Vetor direcional que aponta para onde a câmera está olhando.
  • UpDirection: Vetor vertical de orientação (usualmente (0,1,0)(0, 1, 0)).
  • FieldOfView: Ângulo do cone de visão em graus (ex: 60∘60^\circ).

Câmera Orbital Arcball com Coordenadas Esféricas

Seção intitulada “Câmera Orbital Arcball com Coordenadas Esféricas”

A câmera orbita ao redor da cena utilizando parametrização esférica:

  • Distância (rr): Controlada pelo Scroll do mouse.
  • Ângulo Azimutal (θ\theta): Rotação horizontal de 0∘0^\circ a 360∘360^\circ.
  • Ângulo Polar (ϕ\phi): Elevação vertical de −89∘-89^\circ a +89∘+89^\circ.
X=r⋅cos⁡(ϕ)⋅sin⁡(θ),Y=r⋅sin⁡(ϕ),Z=r⋅cos⁡(ϕ)⋅cos⁡(θ)X = r \cdot \cos(\phi) \cdot \sin(\theta), \quad Y = r \cdot \sin(\phi), \quad Z = r \cdot \cos(\phi) \cdot \cos(\theta)

Para iluminar superfícies foscas (como pedra, madeira ou argamassa), o motor 3D aplica a Lei de Reflexão de Lambert:

Idifusa=Iluz⋅kd⋅max⁡(0,  N⃗⋅L⃗)I_{\text{difusa}} = I_{\text{luz}} \cdot k_d \cdot \max(0, \; \vec{N} \cdot \vec{L})

Onde N⃗\vec{N} é a normal unitária da superfície e L⃗\vec{L} é a direção da luz incidente. O produto escalar N⃗⋅L⃗\vec{N} \cdot \vec{L} calcula o cosseno do ângulo de incidência da luz.

Em cenas arquitetônicas abertas, combinam-se duas instâncias de DirectionalLight com inclinação de 30∘30^\circ e rotação oposta para manter ambas as fachadas iluminadas sem sombras pretas absolutas.


4. Repetição de Texturas com TileMode=“Tile”

Seção intitulada “4. Repetição de Texturas com TileMode=“Tile””

Para aplicar texturas de piso e parede sem esticar a imagem, utiliza-se ImageBrush com repetição em mosaico:

<DiffuseMaterial>
<DiffuseMaterial.Brush>
<ImageBrush ImageSource="Assets/granite.png"
TileMode="Tile"
Viewport="0,0,0.25,0.25"
ViewportUnits="Relative"/>
</DiffuseMaterial.Brush>
</DiffuseMaterial>

Referências Oficiais Microsoft Learn


Próximo Passo: Explore a Modelagem Hierárquica e Grafos de Cena.