1. 程式人生 > >在WPF中繪制多維數據集

在WPF中繪制多維數據集

立方體 jpg line 代碼 rip 方向 bject csharp ted

原文 https://stuff.seans.com/2008/08/13/drawing-a-cube-in-wpf/

是時候使用WPF繪制一個簡單的3D對象了。作為WPF中3D圖形的快速介紹,讓我們只渲染一個最簡單的對象 - 一個立方體。

在這個例子中,我將直接在XAML中定義我們需要的所有內容。與WPF中的其他內容一樣,我們可以直接在代碼中完成所有這些操作。但是在XAML中定義所有內容更加清晰,因為它使對象層次結構更加明顯。在實際項目中,您顯然會在代碼中執行此操作,例如創建或加載3D網格(我們要顯示的對象)。

讓我們從最終的XAML開始吧。以下是Window1.xaml文件的完整內容:

1
2 3 4 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 三十 31 32 33 34 35 36 37 38
<Window x:Class="SimpleCube.Window1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="398" Width="608" <Grid> <Viewport3D Name="viewport3D1"> <Viewport3D.Camera> <PerspectiveCamera x:Name="camMain" Position="6 5 4" LookDirection="-6 -5 -4"> </PerspectiveCamera>
</Viewport3D.Camera> <ModelVisual3D> <ModelVisual3D.Content> <DirectionalLight x:Name="dirLightMain" Direction="-1,-1,-1"> </DirectionalLight> </ModelVisual3D.Content> </ModelVisual3D> <ModelVisual3D> <ModelVisual3D.Content> <GeometryModel3D> <GeometryModel3D.Geometry> <MeshGeometry3D x:Name="meshMain" Positions="0 0 0 1 0 0 0 1 0 1 1 0 0 0 1 1 0 1 0 1 1 1 1 1" TriangleIndices="2 3 1 2 1 0 7 1 3 7 5 1 6 5 7 6 4 5 6 2 0 2 0 4 2 7 3 2 6 7 0 1 5 0 5 4"> </MeshGeometry3D> </GeometryModel3D.Geometry> <GeometryModel3D.Material> <DiffuseMaterial x:Name="matDiffuseMain"> <DiffuseMaterial.Brush> <SolidColorBrush Color="Red"/> </DiffuseMaterial.Brush> </DiffuseMaterial> </GeometryModel3D.Material> </GeometryModel3D> </ModelVisual3D.Content> </ModelVisual3D> </Viewport3D> </Grid> </Window>

這裏的基本思想是我們需要一個Viewport3D對象,它包含渲染立方體所需的一切。顯示Viewport3D及其子對象的簡化結構是:

1 2 3 4 6 7 Viewport3D ModelVisual3D (defines lighting) DirectionalLight ModelVisual3D (defines object to render) GeometryModel3D MeshGeometry3D DiffuseMaterial

以下是每個對象負責的內容:

  • Viewport3D - 渲染3D內容的地方
  • ModelVisual3D - 視口包含的3D對象,可以是燈光或幾何
  • DirectionalLight - 在特定方向照射的光
  • GeometryModel3D - 一個3D幾何對象
  • MeshGeometry3D - 定義3D對象的三角形集
  • DiffuseMaterial - 用於渲染3D對象的材質,例如畫筆

也許這些類中最有趣的是MeshGeometry3D“網格”基本上由一系列三角形組成,通常所有三角形都連接起來形成您想要渲染的3D對象。所述MeshGeometry3D對象通過指定一系列的點,然後三角形的集合定義了一個網格。點集合表示網格中的所有頂點,並由Positions屬性定義存儲在TriangleIndices屬性中的三角形是根據點使用索引到Positions集合中定義的。

起初這似乎有點奇怪。為什麽不定義一組三角形,每個三角形由三個點組成?為什麽將點定義為單獨的集合,然後通過引用點來定義三角形?答案是該方案允許在多個三角形中重復使用單個點。

在我們的例子中,繪制一個立方體,我們為立方體的八個頂點定義了八個點。下圖顯示了從0到7編號的點,與我們將它們添加到位置的順序相匹配立方體的左後角位於(0,0,0)。

技術分享圖片

定義點後,我們定義構成表面立方體的12個三角形 - 每個面兩個三角形。我們通過僅列出構成三角形的三個點的索引來定義每個三角形。

註意我們列出每個三角形的索引的順序也很重要。該順序指示垂直於三角形的向量的方向,該向量指示我們可以看到的三角形的哪一側。規則是:當您查看三角形的可見面時,逆時針添加頂點。

除了網格,我們還定義了用於渲染立方體的材質。在這種情況下,它是一個DiffuseMaterial,它允許用簡單的畫筆繪制立方體的表面。

我們還需要在我們的場景中添加一個攝像頭,通過指定它的位置以及它所在的方向。為了看到我們的立方體,我們將攝像機置於(6,5,4),然後設置其LookDirection,向量,到(-6,-5,-4),使它回頭看原點。

最後,為了看到立方體,我們需要照明。我們定義了一個單獨的光源,它是一個DirectionalLight - 一個沒有位置但只是在特定方向投射光線的光。

最終結果是一個簡單的紅色立方體。

技術分享圖片

在WPF中繪制多維數據集