天天看點

Ab3d.PowerToys 3D輔助庫更好性能的3Dlines實作

Ab3d.PowerToys是與WPF 3D一起使用的輔助庫。

該庫的主要部分是:

Cameras (SceneCamera, FirstPersonCamera, ThirdPersonCamera, 等)

Camera Controllers (MouseCameraController, CameraControlPanel)

3D Models and Visuals (Sphere, Box, Cylinder,等)

3D Lines

Event Manager 3D (簡化了3D對象的事件處理)

Cameras, 3D Models和Lines可以在XAML中定義。并且結果能夠馬上就顯示在Visual Studio

Designer(可視化工作室設計器)中。

使用Ab3d.PowerToys進行3D程式設計式在容易不過了!

Cameras 與 Camera Controllers

該庫定義了一些新的Cameras,它能被用于代替目前WPF的攝像頭。Ab3d

Cameras與WPFcameras的主要差別是,Ab3d

Cameras不需要使用Vectors來定義LookDirection,而是利用角度來定義它。這使得更自然。例如,如果您想檢視的場景需要偏上和偏右一點點,您隻需要定義Heading角度為30度和Attitude角度為-45度。您也可以定義場景的Distance。對于Ab3d

Cameras最重要的是:SceneCamera, FirstPersonCamera 和ThirdPersonCamera。所有的Ab3d

Cameras及他們的屬性能夠在類圖上可以看到。

Camera Controllers用于控制攝像頭。MouseCameraController能夠被用于使用滑鼠改變攝像頭的角度和距離。這種方法可以非常簡單的左右旋轉攝像頭。CameraControlPanel顯示的漂亮按鈕用于旋轉攝像頭和移動攝像頭的遠近。這裡還有一個CameraPreviewPanel,它可以圖形化地顯示目前錄影機正在注視的對象或場景。

下面的代碼展示的是一個WPF應用程式隻需要幾行xaml代碼就可以使用攝像頭來顯示整個場景(SceneCamera)并能夠通過滑鼠(MouseCameraController)或通過漂亮按鈕(CameraControlPanel)旋轉攝像頭。這裡還有一個攝像頭的預覽,它顯示攝像頭特定的角度的注視的場景。此外,如果WindGeneratorModel模型不包含燈光,一個攝像頭的燈光會自定地被添加當場景中并從攝像頭的位置照亮場景(ShowCameraLight=”Auto”)。

01.<Window x:Class="Ab3d.PowerToys.Samples.Window1"

02.xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

03.xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

04.xmlns:cameras="clr-namespace:Ab3d.Cameras;assembly=Ab3d.PowerToys"

05.xmlns:ab3d="clr-namespace:Ab3d.Controls;assembly=Ab3d.PowerToys">

06.  <Grid>

07.     <Viewport3D Name="MainViewport3D">

08.         <ModelVisual3D

Content="{StaticResource WindGeneratorModel}"/>

09.     </Viewport3D>

10.       

11.     <cameras:SceneCamera

Name="SceneCamera1"

12.                             Heading="30" 

13.                             Attitude="-30" 

14.                             Distance="3"

IsDistancePercent="True"

15.                             IsDynamicTarget="True"

16.                             ShowCameraLight="Auto"/>

17.                            

18.     <ab3d:MouseCameraController

TargetCameraName="SceneCamera1" 

19.                                    IsMouseWheelZoomEnabled="True"/>

20.                                 

21.     <ab3d:CameraControlPanel

TargetCameraName="SceneCamera1"

22.                                 VerticalAlignment="Bottom" 

23.                                 HorizontalAlignment="Left"/>

24.                                

25.     <ab3d:CameraPreviewPanel

26.                                 Width="100"

Height="100" 

27.                                 VerticalAlignment="Bottom" 

28.                                 HorizontalAlignment="Right"/>

29.  </Grid>

30.</Window>

EventManager3D 

EventManager3D類是一個輔助類,它可是使得使用者能夠簡單地預定3D對象上的滑鼠事件。支援一下滑鼠事件:ouseEnter,

MouseLeave, MouseDown, MouseUp, MouseClick, BeginMouseDrag, MouseDrag,

EndMouseDrag and

MouseDoubleClick。這樣您就不需要做複雜的3D沖擊測試了。EventManager3D也是比WPF的ModelUIElement3D更好,因為它支援更多的滑鼠事件(包括滑鼠在3D中的拖放),提供更好的事件資料并儲存3D模型的結構。這樣您的編碼更簡單,更好組織。

下面的代碼顯示的是一個使用EventManager3D的樣例:

01.                      

02.ModelEventSource3D eventSource;

03.EventManager3D eventManager;

04.  

05.eventManager = new

ModelEventSource3D(MainViewport);                                 

06.  

07.  

08.eventSource = new EventSource3D();

09.eventSource.TargetModel3D = myButton3D;

10.eventSource.MouseClick += new

MouseButton3DEventHandler(myButton3D_MouseClick);

11.  

12.eventManager.RegisterEventSource3D(eventSource);                                 

13.  

14.  

15.eventSource = new ModelEventSource3D();

16.eventSource.TargetModel3D = myMovableObject3D;

17.eventSource.BeginMouseDrag += new

Mouse3DEventHandler(myMovableObject3D_BeginMouseDrag);

18.eventSource.MouseDrag += new

MouseDrag3DEventHandler(myMovableObject3D_MouseDrag);

19.eventSource.EndMouseDrag += new

Mouse3DEventHandler(myMovableObject3D_EndMouseDrag);

20.  

21.eventManager.RegisterEventSource3D(eventSource);

 3D Models

Ab3d.PowerToys庫還包含一些類用于以代碼或XAML來建立基本的3D模型。它可以建立Plane(平面),

Circle(圓), Box(箱), Pyramid(金字塔), Sphere(球), Cone(圓錐)和Cylinder(圓柱)3D模型。

下面的XAML建立了一些3D對象:WireGrid, 3D Sphere, 3D Box和3D

Cone。需要注意的是Sphere也擁有ToolTip定義。另一件有趣的事情是通過提供的顔色的名字定義Materials.

01.                          

02.<Page

x:Class="Ab3d.PowerToys.Samples.Objects3D.UIElementsToolTipSample"

03.    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

04.    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

05.    xmlns:cameras="clr-namespace:Ab3d.Cameras;assembly=Ab3d.PowerToys"

06.    xmlns:visuals="clr-namespace:Ab3d.Visuals;assembly=Ab3d.PowerToys"  

07.    xmlns:uiElements="clr-namespace:Ab3d.UIElements;assembly=Ab3d.PowerToys">

08.    <Grid>

09.        <Viewport3D

Name="MainViewport">

10.            <visuals:WireGridVisual3D

CenterPosition="0 0 0" Size="70 30" 

11.                                         WidthCellsCount="7"

HeightCellsCount="3" 

12.                                         LineColor="Gray"

LineThickness="2"/>

14.            <uiElements:SphereUIElement3D

CenterPosition="-20 5 0"

15.                                             Radius="5" 

16.                                             Material="Green"

17.                                             ToolTip="This

is a simple tooltip"/>

18.  

19.            <uiElements:BoxUIElement3D

CenterPosition="20 5 0" 

20.                                       Size="10

10 10" 

21.                                       Material="Red"/>

22.              

23.            <visuals:ConeVisual3D

BottomCenterPosition="0 0 0" 

24.                                  BottomRadius="5"

TopRadius="2" 

25.                                  Height="10"

Segments="6" 

26.                                  IsSmooth="False"

Material="Blue"/>            

27.        </Viewport3D>

28.          

29.        <cameras:SceneCamera

Heading="30" Attitude="-20" Bank="0" 

30.                             Distance="100"

ShowCameraLight="Always"/>

31.    </Grid>

32.</Page>

下面的圖像顯示的是能夠通過Ab3d.PowerToys建立的幾乎所有的3D對象。該圖像顯示的3D對象在Design Time in Visual

Studio一直可見。這裡還有一些Ab3d.PowerToys項在工具箱中(不幸地是它不能在Toolbox中顯示3D對象)。屬性編輯器顯示的目前被標明的ConeVisual3D的屬性。

下面的圖像時摘自一個球形樣例,它顯示的是一個在3D球形上繪制三角形和法線。對于該球形的相關設定顯示在圖像的右下角。

另外,還支援具有優化機制的3D

Lines。它使得為WPF提供更先進的和具有更好性能的3Dlines實作。