在WPF中繪制多維數據集
原文 https://stuff.seans.com/2008/08/13/drawing-a-cube-in-wpf/
是時候使用WPF繪制一個簡單的3D對象了。作為WPF中3D圖形的快速介紹,讓我們只渲染一個最簡單的對象 - 一個立方體。
在這個例子中,我將直接在XAML中定義我們需要的所有內容。與WPF中的其他內容一樣,我們可以直接在代碼中完成所有這些操作。但是在XAML中定義所有內容更加清晰,因為它使對象層次結構更加明顯。在實際項目中,您顯然會在代碼中執行此操作,例如創建或加載3D網格(我們要顯示的對象)。
讓我們從最終的XAML開始吧。以下是Window1.xaml文件的完整內容:
1 |
< 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中繪制多維數據集