首页 > 代码库 > Ab3d.PowerToys 3D辅助库更好性能的3Dlines实现
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 TargetCameraName="SceneCamera1"
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"/>
13.
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
另外,还支持具有优化机制的3D Lines。它使得为WPF提供更先进的和具有更好性能的3Dlines实现。