The ultimate framework for .Net 3D
with cameras, 3D models, 3D lines,
3D text and more!
Download now


Ab3d.PowerToys is the ultimate helper library to create .Net applications with 3D content.

The main features of the library are:

  • The easiest to use 3D API with many great code samples
  • Cameras (SceneCamera, FirstPersonCamera, ThirdPersonCamera, etc.)
  • Camera Controllers (MouseCameraController, CameraControlPanel)
  • 3D Models and Visuals (Sphere, Box, Cylinder, etc.)
  • Generate extruded or lathe 3D objects
  • 3D Lines (the fastest implementation for connected, disconnected and lines with arrows)
  • 3D Text
  • Event Manager 3D (simplified event handling on 3D objects)
  • Complete solution for WPF 3D transparency problem
  • Many helper classes to ease work with WPF 3D
  • Support for touch and multi-touch to rotate, move and zoom the camera
  • Import 3D models from obj files (integrated in Ab3d.PowerToys) or almost all other 3D files with Assimp importer.
  • fully optimized to achive best possible performance

The Ab3d.PowerToys also works very well with Ab3d.DXEngine the DirectX 11 rendering engine for .Net and WPF applications.

With purchasing the Ab3d.PowerToys library you also get premium e-mail support for all questions regarding WPF 3D and our libraries.

Cameras, 3D Models, Lines and Text can be defined in XAML. The results are immediately shown in Visual Studio Designer so the whole 3D scene can be designed in Visual Studio almost as in a 3D modeling application.

Showing 3D content was never easier!

[all videos]

Cameras and Camera Controllers

The library defines a few new Cameras that can be used instead of the current WPF's cameras. The main difference between Ab3d Cameras and WPF cameras is that Ab3d Cameras does not use Vectors to define the LookDirection, but instead use angles in degrees to define it. This is much more natural. For example if you want to look at the scene a little bit from the right and from above, you just define the Heading to be 30 and Attitude to be -45. You can also define the Distance from the scene. The most important Ab3d Cameras are: SceneCamera, FirstPersonCamera and ThirdPersonCamera. A good overview of the new cameras can be seen in the Cameras cheat sheet document that can be opened from a link below.

Camera Controllers are used to control the camera. The MouseCameraController can be used to rotate and move the camera with the mouse. The rotation and movement can be configured to any combination of mouse buttons and keyboard modifiers (shift, control and alt). For example the following XAML sets the MouseCameraController to rotate the camera with left mouse button and to move the camera with left mouse button and alt key pressed:

            MoveCameraConditions="LeftMouseButtonPressed, AltKey"/>

The CameraControlPanel shows nice buttons to rotate and move the camera and also move the camera closer or farther away. There are also a CameraPreviewPanel and CameraAxisPanel that graphically show the current orientation of the camera.

3D Models

The Ab3d.PowerToys library also contains classes to create basic 3D models in code or XAML. It is possible to create Plane, Circle, Box, Arrow, Pyramid, Sphere, Cone and Cylinder 3D models. The library also supports creating objects by extruding a shape or by converting a shape to 3D object with lathe algorithm.

To make the 3D objects definitions cleaner a ModelTypeConverter is used for all Material properties used by 3D objects. This way it is possible to set the material with a color name or code (#FFFFAAAA) or image uri.

3D Lines

The library support 3D Lines with optimized update mechanism that makes the 3D lines implementation the most advanced and with the best performance for WPF.

3D Text

The library also supports 3D Text that can be defined anywhere in 3D space. The text is drawn as a series of connected 3D lines that are created from internal font definition.


The EventManager3D class is a helper class that enables user to simply subscribe to mouse events on 3D objects. The following mouse events are supported: MouseEnter, MouseLeave, MouseMove, MouseDown, MouseUp, MouseClick, BeginMouseDrag, MouseDrag, EndMouseDrag and MouseDoubleClick. This way you do not need to do the complicated 3D hit testing any more. The EventManager3D is also better than WPF's ModelUIElement3D because it supports more mouse events (including mouse drag in 3D), provides better event data and preserves the structure of the 3D models. This way your code is much simpler and better organized.

Transparency sorting

WPF 3D can show transparent 3D objects. But to show them correctly, the transparent objects need to be correctly sorted. Without this some of the objects are not visible through the transparent objects. Ab3d.PowerToys provide complete solution to this problem. More about that can be read in Transparency Sorting page.

Obj files reader

Ab3d.PowerToys includes a Ab3d.ReaderObj class that can be used to read 3D models from obj files. Obj file is very common file format to store 3D models. It usually comes with mtl file that defines the materials used in obj file. Because data in obj and mtl files is written in plain text, parsing the values can be quite slow and can consume a lot of memory (creating many string instances). Therefore the ReaderObj has been greatily optimized to read obj files very fast and with very low memory usage.

Beginner's guide

To get some additional information about using Ab3d.PowerToys and see how easy is to create great business applications with 3D graphics see the following blog post.

Ab3d.PowerToys cheat sheets:
(click to get full pdf)
Objects cheat sheet
             Cameras cheat sheet
Many basic 3D Objects Simplified cameras

Screenshots with XAML source:
(click to see full XAML for the image)
[xaml] [xaml] [xaml]
[xaml] [xaml]  

Other screenshots:
(click to see larger image)


Related blog post
To see the development history of Ab3d.PowerToys, check out the related blog posts.

Information about changes:
Subscribe to RSS feed to all Blog posts.
Subscribe to RSS feed to Blog posts related to Ab3d.PowerToys.
Subscribe to newsletter - enter your email into Newsletter box on my Blog.

Versions history

Version 7.5

  • Added ViewCubeCameraController.
  • Added TubePathVisual3D and TubePathMesh3D.
  • Added support to create extruded MeshGeometry3D that has custom orientation (not only in the direction of Y axis). This can be achieved with using a new override of CreateExtrudedMeshGeometry that also takes shapeYVector parameter.
  • Added IsStartPositionClosed and IsEndPositionClosed properties to TubeLineVisual3D. Also added additional isStartPositionClosed and isEndPositionClosed constructor parameters to the TubeLineMesh3D.
  • Added FreezeMeshGeometry3D to BoxVisual3D and SphereVisual3D to control if the MeshGeometry3D is frozen.
  • Improved TubeVisual3D that now allows setting Height to 0 - this creates an optimized TubeVisual3D without creating both bottom and top ring - in this case only bottom ring is created.
  • Fixed using adjustmentFactor in FitIntoView method.
  • Fixed using FitIntoView when it is called in Loaded method and the Viewport3D is shown in Ab3d.DXEngine.
  • Fixed type used by ShowMovablePlanes property.
  • Improved MouseCameraController to capture the mouse only when the mouse rotation / movement is bigger than a few pixels. This prevents "swallowing" MouseUp event for processing mouse click in EventManager3D.
  • Added UsePreviewEvents property to EventManager3D – when set to true the EventManager3D subscribes to Preview mouse and touch events instead of standard events - for example PreviewMouseUp event instead of MouseUp event. This can be used to use left mouse button for camera rotation and also for click events.
  • Added TurnTo method to FirstPersonCamera - this turns the camera towards the specified position or to the specified direction vector.
  • CameraControlPanel now moves the FirstPersonCamera forward or backwards when ZoomIn or ZoomOut buttons are clicked.
  • When MouseCameraController is used for FirstPersonCamera the mouse wheel now moves camera forward and backwards.

Version 7.4

  • Added ModelRotatorVisual3D that allows user to rotate selected Model3D around any axes.
  • Added SubscribeWithEventManager3D method to ModelMoverVisual3D and ModelRotatorVisual3D to allow them to use EventManager3D for processing mouse events. This allows using the ModelMoverVisual3D and ModelRotatorVisual3D in Ab3d.DXEngine.
  • Greatly reduced the initialization time when creating many instances of SphereVisual3D or BoxVisual3D objects.
  • Added ModelIterator class and two extension methods (ForEachVisual3D and ForEachGeometryModel3D) to simplify working with hierarchacly organized 3D models.
  • Added FitIntoView and GetFitIntoViewDistanceOrCameraWidth methods to TargetPositionCamera, SceneCamera, TargetRect3DCamera and ThirdPersonCamera. The method has greatly improved algorithm then it was available in the "Scene Editor" sample in the previous versions of Ab3d.PowerToys.
  • Fixed showing transparent 3D lines when LineColor's alpha value is less than 255.
  • Improved support for TextureCoordinates in ModelOptimizer.
  • Added WidthDirection and HeightDirection to WireGridVisual3D that allows to set custom direction of the WireGrid (not only horizontal or horizontal in another coordinate system).
  • Added CreateWireGrid to Line3DFactory that allows creating WireGrid object with custom widthDirection and heightDirection vectors.
  • Added GetTargetViewport3DSceneBounds method to all Camera classes in Ab3d.PowerToys – the method calculates the scene bounding box.
  • Change validation of Size property on BoxVisual3D, WireBoxVisual3D, MultiMaterialBoxVisual3D and PyramidVisual3D to allow having one component of size zero.
  • Fixed calculating scene size in SceneCamera when the scene hierarchy is complex.
  • Added GetBounds and CombineTransform methods to Ab3d.Utilities.ModelUtils.
  • Added CompositionRenderingHelper to help work with CompositionTarget.Rendering (allowing subscribed objects to be recycled by Garbage Collection and therefore preventing infinite rendering subscription in case when the Rendering is not unsubscribed).
  • Improved ModelMoverVisual3D so that it can also use EventManager3D for mouse event processing - this allows using ModelMoverVisual3D inside Ab3d.DXEngine.
  • Prevented throwing "Object reference" exception in ModelOptimiter that could occur sometimes when ImageBrush is used.
  • Added HeightDirection to TubeVisual3D and TubeMesh3D – this allows orienting the object in any direction and not only in up (0, 1, 0) direction.
  • Fixed throwing exception when Is3DAxesShown is initially set to false on CameraAxisPanel.
  • Added "Custom Up Axis" sample that shows how to show data in another coordinate system - for example where Z is up.
  • Added "Perspective Transformation" sample that shows how to convert 3D positions to the 2D positions on the screen.
  • BREAKING CHANGE: Moved the ModelMovedEventArgs class from Ab3d.PowerToys.Common to Ab3d.Common namespace.

Version 7.3

  • Fixed showing 3D lines that were created with IsVisible property set to false. When later the IsVisible is set to true, sometimes the 3D lines were not shown.
  • Fixed rendering 3D lines with arrows that were not rendered correctly under some circumstances.
  • Fixed reporting MouseLeave event that was sometimes not triggered when CustomEventsSourceElement was used.
  • Fixed changing BoxVisual3D and SphereVisual3D objects after Position is changed under some circumstances.
  • Added GetCameraMatrixes to BaseCamera that can calculate view and projection camera even if TargetViewport3D is not assigned to the camera.
  • Prevented throwing null reference exception in Dumper.Dump method when TextureCoordinates or Normals collection was null.
  • Prevented throwing null reference exception that could sometimes occur in MouseCameraControllerInfo when in XAML designer.
Ab3d.PowerToys.Assimp v1.1:
  • AssimpWpfImporter now implements IDisposable and have new Dispose method to easily dispose all managed and unmanaged resources.
  • Improved reading transformations - in case the transformation matrix is identity, the Transform property is set to null; in case the matrix is a simple translation, a TranslateTransform3D is created; in case of simple scale a ScaleTransform3D is created; otherwise a MatrixTransform3D is created.
  • Improved reading 3D models that are stored in left coordinate system.
  • Added ForceConvertToRightHandedCoordinateSystem property to AssimpWpfImporter and AssimpWpfConverter.

Version 7.2

  • Fixed problems with EventManager3D when events on wrong ModelEventSource3D object were triggered. This could happen when multiple GeometryModel3D objects were using the same MeshGeometry3D.
  • Improved performance of EventManager3D.
  • Improved design time behavior for MouseCameraControllerInfo with preventing calling BeginInit method when it was already called by WPF initializer (prevents thorwing exception in design time).
  • Added IsEmissiveSolidModelColor to WireframeVisual3D - when set to false it uses standard shaded color instead of single color produced by EmissiveMaterial.
  • Added modelSelectorFunc parameter to CreateWireframe method - it can be used to select which models are converted to wireframe.
  • Added new constructor to ModelMoverVisual3D that takes xAxisVector3D, yAxisVector3D and zAxisVector3D. This allows using custom axes for ModelMoverVisual3D.
  • Improved ModelDecoratorVisual3D when TargetModel3D is not defined in RootModelVisual3D.Content but in a ModelVisual3D that is defined in RootModelVisual3D.Children.

Version 7.1

  • Added FreeCamera - a new camera type that can be used to freely rotate the camera around without locking the rotation around y axis.
  • Fixed reading materials with ReaderObj - before a black EmissiveMaterial was added to each material.
  • Moved CameraLight and ShowCameraLight properties and StartRotate, EndRotate and all related methods from SphericalCamera to BaseCamera (this allows its usage on FreeCamera).
  • Added AutomaticallyUpdateWhenOriginalModelIsChanged to WireframeVisual3D
  • Improved WireframeVisual3D to not generate the wireframe geometry until it is added to the parent Visual3D / Viewport3D. This can prevent multiple wireframe geometry generation in the initialization phase. Also improved xml comment (for help) and sample regarding that.
  • Improved changing ShowCameraLight property at design time (before light was not always changed when the ShowCameraLight property was changed).
  • Improved using ShowCameraLight's Auto property - before when this property was set to Auto, the camera light was not shown if the scene contained AmbientLight; now camera light is added in this case (it is not added only when DirectionalLight, PointLight or SpotLight are defined).
  • Improved automatic finding of Viewport3D in BaseCamera faster and more reliable (when TargetViewport3D is not set).
Changes related to Ab3d.DXEngine:
  • Updated BaseCamera to correctly find the Viewport3D if used inside DXEngine and if TargetViewport3D or TargetViewport3DName are not set.
  • Fixed updating line color when the line color is changed after the line is already shown (when rendered with hardware accelerated in Ab3d.DXEngine).
  • Improved EventsManager3D when EventsManager3D.CustomEventsSourceElement is not set - now the default event source is DXViewportView instead of Viewport3D.
  • Improved MouseCameraController - it is not needed any more to set the EventsSourceElement to DXViewportView; now if EventsSourceElement is not set, it will be automatically set to DXViewportView.
  • Improved sending lines data to Ab3d.DXEngine (so that the lines can be created in geometry shader).

Version 7.0

  • Added LightingRigVisual3D that adds 3 DirectionalLights and one AmbientLight to the scene. The lights define the so called standard lighting rig with key, fill and back light.
  • Added TubeLinesVisual3D and TubeLinesMesh3D that can be used to create 3D lines from 3D tube objects. Those lines does not require LinesUpdater to update their geometry when camera is changed and can therefore greatly improve performance when the application is running (but require a little bit more time to initialize)
  • Added ModelMoverVisual3D that can be used to help users move 3D objects. The ModelMoverVisual3D shows 3 arrows for all three axes and allow users to move object along the axis. It can also show 3 rectangles that allow users to move the object on the plane defined by the rectangle.
  • Added support for touch events and touch manipulation events to EventManager3D (TouchEnter, TouchDown, TouchMove, TouchUp, TouchLeave; ManipulationStarted, ManipulationDelta and ManipulationCompleted) (only in .Net 4 version of the library)
  • Added MultiPolyLineVisual3D to show multiple polylines with one Visual3D – this improves performance because LinesUpdated needs to check less objects.
  • Added Ab3d.Utilities.RenderToBitmap method to render any FrameworkElement to bitmap (with support for custom size, antialasing and custom dpi setting).
  • Added RenderToBitmap to BaseCamera to render current Viewport3D to bitmap.
  • Added support for creating 3D trapezoid objects with TrapezoidVisual3D, TrapezoidUIElement3D and Ab3d.Meshes.TrapezoidMesh3D classes and with new Ab3d.Models.Model3DFactory.CreateTrapezoid and Ab3d.Meshes.TrapezoidMesh3D method
  • Added MouseCameraControllerInfo control that shows which mouse button and keyboard is required to rotate and move the camera. Also added MouseWithButtons, KeyboardKey user controls.
  • Added Ab3d.Utilities.Dump methods that can dump 3D model information into Visual Studio Immediate Window – useful for getting information about 3D objects during debugging.
  • Added MoveOnlyHorizontally property to MouseCameraController to restrict the camera movements to horizontal plane.
  • Added IsRotationDirectionAdjusted property to MouseCameraController. It can be used to enable adjusting camera rotation direction based on current mouse position and current attitude value.
  • Added CameraRotateStared, CameraRotateEnded, CameraMoveStared, CameraMoveEnded events to MouseCameraController
  • Fixed calculating camera bank angle when using Ab3d.Utilities.CameraUtils.CalculateCameraAngles method.
  • Added static GetCameraMatrixes method to BaseCamera that takes Viewport3D and returns camera matrixes. Also the GetCameraMatrixes now returns Boolean instead of void - it returns false if camera matrixes cannot be calculated.
  • Fixed showing camera light after the previous Light visual was manually removed from Viewport3D.Children
  • Improved CameraLight property in Ab3d.Cameras objects. The property is used to get or set a custom light for camera’s light. In previous version under some circumstances the property's value was not set to the actual Light object that is used to illuminate the scene.
  • Added GetMousePositionOnPlane method to all cameras from Ab3d.PowerToys library
  • Added GetNormalizedHeading, GetNormalizedAttitude, GetNormalizedBank methods that return Heading, Attitude and Bank angles that between 0 and 360.
  • Fixed updating 3D lines for WireGridVisual3D when its IsClosed property was set to true.
  • Improved LinesUpdater with adding a RegisteredLinesCount property to get number of registered lines. Also added UnregisterLine method that takes any 3D line visual from Ab3d.PowerToys.
  • Improved performance of LinesUpdater.
  • Removed memory leak from LinesUpdater - some lines that were disconnected from parent Visual3D were not disposed and were checked on each frame.
  • Improved LinesUpdater so that it did not regenerate some geometry models when the camera (or some other property) is not changed.
  • Improved rendering lines when Othographics camera is used and the lines have the same direction as the camera.
  • Fixed hiding 3D lines when IsVisible is set to false and the line is child of another ModelVisual3D
  • Improved rendering Arrow3D - before the arrow tip was rendered with a single position and that made the arrow shading too dark.
  • Changed default value for Length property on AxisVisual3D and ColorAxisVisual from 1 to 100.
  • Fixed changing DefaultMaterial on ObjModelVisual3D after the obj file has been already read. In previous version all materials were replaced by new DefaultMaterial even if obj file defined their own material and DefaultMaterial was not used.
  • Added DefaultBackMaterial to ObjModelVisual3D to specify the back material of the read models.
  • Added RayPlaneIntersection method to Ab3d.Utilities.MathUtils to calculate intersection of 3D ray and a plane.
  • Added ReplaceMaterial to Ab3d.Utilities.ModelUtils to replace one material with another material in a Model3D
  • Prevented freezing objects with ModelOptimizer when FreezeAll is not set to true.
  • Prevented throwing exception when MeshGeometry3D have TriangleIndices set to null in CollectModelCounters, GetDumpString and GetMeshInitializationCode methods.
  • Improved performance of ModelOptimizer and MeshUtils.CalculateNormals
  • Added new overloads to TransparencySorter constructor, SimpleSort and SortByCameraDistance methods that also take ContainerUIElement3D as parameter.
  • Improved ModelDecoratorVisual3D when showing normal vectors on an objects that has been scaled by transformation
  • Fixed CreateFromCurvePositions method in BezierCurve - the method has thrown an exception when there were less than 6 curve points (instead of less than 2).
  • Changed return type of the HeightMapMesh3D.GetGradientColorsArray method - now the method returns array of Color value instead of array of uint values. If you still want to get array of uint values, call the new GetGradientColorsUIntArray method.

Version 6.0

  • Added free Abd3.PowerToys.Assimp library that can be used with Assimp importer library to read 3D models from almost any 3D file.
  • Added Ab3d.Utilities.ModelOptimizer class that can greatly optimize 3D models so they are rendered faster.
  • Added ObjModelVisual3D to simplify loading 3D models from obj files in XAML and to control position and size of read model.
  • Added ReadModel3D method to ReaderObj - with this method you can get the Model3DGroup or GeomentryModel3D from obj file directly (before you first needed to read obj file into ObjFileData and than converted that to Model3DGroup or GeomentryModel3D).
  • Improved ReaderObj - improved reading textures for some obj files and prevented "An item with the same key has already been added to dictionary" error.
  • Improved ReaderObj ability to read pack URI schemas - for example "pack://application:,,,/Ab3d.PowerToys.Samples;component/Resources/ObjFiles/robotarm.obj".
  • Changed default value for ObjFileToWpfModel3DConverter.InvertYTextureCoordinate from false to true. This correctly loads the textures in most of the cases.
  • Renamed ObjFileToWpfModel3DConverter.ObjectNames dictionary to NamedObjects (to make the name the same as in Ab3d.Reader3ds library).
  • Improved CameraAxisPanel so it can now also show 3D arrows (this is not default style).
  • Changed CameraAxisPanel to use 2D shapes instead of 3D lines (this improves performance and removes depandency on LinesUpdater).
  • Fixed occasional problems with 3D lines when transformation on the line's MeshGeometry3D is changed after the line is created.
  • Fixed problems with rendering 3D lines when the lines are removed from parent Viewport3D or Visual3D and after a while they are added to the Viewport3D or Visual3D again (before LinesUpdates did not update the lines any more).
  • Added RegisterViewport3D and UnregisterViewport3D methods to LinesUpdater to fix problems with not updating 3D lines when the Viewport3D is dynamically added and removed from parent controls.
  • Added new method overloads for WireframeFactory.CreateNormals and Line3DFactory.CreateMultiLine3D that allows to pass a Transform3D that transforms all positions.
  • Improved FpsMeter control - prevented counting multiple frames for one actual rendered frame.
  • Added SetName and GetName extension methods on Model3D, MeshGeometry3D, Visual3D and Material. They can be used to set or get name the WPF 3D objects.
  • Added CollectModelCounters method to Ab3d.Utilities.Dumper that returns the number of positions, triangle indices and other counters of the specified model3D.
  • Properties to control touch and multi-touch in MouseCameraContoller are now part of the Ab3d.PowerToys .Net 3.5 build (but they still require .Net 4 version of the library to work). Before those properties were not part of the 3.5 Net build of the library.
  • Added Ab3d.Utilities.TransformationsHelper.GetModelTotalTransform method that can be used to get the total transformation of one Model3D inside models hierarchy.
  • Added ConvertToWpfCamera method to all Ab3d.PowerToys cameras. The method converts Ab3d.PowerToys camera to a standard WPF camera.
  • Added Point3DTo2D method to all Ab3d.PowerToys cameras that does not required to create an actual Viewport3D to convert 3D coordinates to 2D space.
  • Improved MaterialTypeConverter to support texture images in Visual Studio 2013 designer - now you can preview the texture image in Visual Studio designer with using: Material="/ImagesFolder/MyImage.jpg".
  • Added ModelDecoratorVisual3D - a Visual3D that can be used to show bounding box, normals and triangles for the specified TargetModel3D.

Version 5.3

  • Greatly improved performance of SphereVisual3D and BoxVisual3D with using cached MeshGeometry3D (added UseCachedMeshGeometry3D property to control mesh caching). The biggest performance improvement is when the position or size of many spheres or boxes is changed.
  • Fixed updating 3D lines when Viewport3D is inside TabControl or when the Viewport3D is moved from one control to another.
  • Optimized LinesUpdater to minimize the number of newly created object each rendering frame.
  • Added WinForms sample that shows how easy is to show 3D graphics in WinForms with embedded WPF and Ab3d.PowerToys

Version 5.2

  • Improved support for touch and multi-touch in MouseCameraController in the .Net 4 version of Ab3d.PowerToys assembly. Before the touch was supported with special MultiTouchMouseCameraController (available in source code in a separate project). Now this support is integrated into the core MouseCameraController.
  • To configure the touch support the following new properties are now available on MouseCameraController: IsTouchEnabled, IsTouchRotateEnabled, IsTouchMoveEnabled, IsTouchZoomEnabled and IsConcurrentTouchZoomEnabled. To get full control on what happened when user touches the screen users can also override the following methods: GetManipulationActions, OnManipulationDelta, OnManipulationStarted, OnManipulationCompleted (see help file for more info).
  • When camera is rotated by mouse and user suddenly releases the mouse or touch, the camera rotation is preserved. This is controlled by new RotationInertiaRatio and RotationEasingFunction properties on MouseCameraController.
  • StartRotation and StopRotation methods on cameras that derived from SphericalCamera now have additional parameters that can be used to specify acceleration and deceleration speed and easing function.
  • Changed the UpdateContent method in HeightMapVisual3D from private to public. The method updates the 3D mesh after the HeigthData is changed.

Version 5.1

  • Added WireframeVisual3D to simplify showing models with wireframe.
  • Improved triangulator - before in some cases a wrongly triangulated object was returned or an "Improperly formed polygon" error was thrown.
  • Added DirectedPyramidMesh3D to create a pyramid object that is oriented in a specified direction.
  • Added Ab3d.Utilities.ModelUtils class that contains ChangeMaterial (change material on all child Model3D objects) and CopyModel (copy child Model3D objects) methods.
  • Improved 3D Lathe creator - now it is allowed to specify only one segment when start and end positions are closed.
  • Added GetPerpendicularVectors to MathUtil - calculate two vectors that are perpendicular to the input vector.
  • Fixed calling PreviewCameraChanged and CameraChanged events when CameraWidth is changed in Orthographic camera.
  • Fixed Point3DTo2D and Rect3DTo2D if size of Viewport3D is changed or if CameraWidth in Orthographic camera is changed.
  • Added Dump extension methods that can dump (write to Debug console) various WPF 3D objects (Matrix3D, Model3D, Geometry3D, Transform3D, Material, Rect3D). This is very useful to get detaled information in Visual Studio Immediate Window - Window – for example you can write "Ab3d.Utilities.Dumper.Dump(myModel3D)".
  • Added GetWorldToViewportMatrix method to BaseCamera.
  • Fixed Creating wireframe with WireframeFactory when model groups have transformations.
  • Cleaned the code to remove compiler warings when compiling source code.
  • Added overrides to CreateWireframe with additional removedDuplicates parameter - when the parameter is true this can significanlty increase time to create wireframe model, but creates less lines because duplicate lines are removed (this was used in the previous version). Not it is possible to set removedDuplicates to false to greatly reduce the initial creation time but end up with having more 3D lines. This can be user when rendering the lines with DXEngine were rendering lines is super-fast compared to WPF 3D where it is very slow.
  • Added Microsoft Kinect 3D player sample.

Version 5.0

  • Added ReaderObj and ObjFileToWpfModel3DConverter that can read 3D objects from obj files.
  • Fixed performance of LinesUpdater when the camera or other property is not changed.
  • Added additional override of Dumper.Dump with Model3D as paramter to write Model3D info to Visual Studio output.
  • Added CalculateUpDirection to Ab3d.Utilities.CameraUtils.

Version 4.0

  • Added 3D objects:
  • Added Ab3d.Utilities.Triangulator to convert a polygon that is defined by a list of 3D points into triangles that can be than used to create 3D object.
  • Added Ab3d.Meshes.Mesh3DFactory to create 3D extruded objects.
  • Added LatheMesh3D to Ab3d.Meshes - used to create MeshGeometry3D that represents a 3D object that is created with rotating the shape for 360 degress.
  • Added ArrowMesh3D, ArrowVisual3D and ArrowUIElement3D that represent a 3D arrow object.
  • EventManager3D:
  • Added RegisterExcludedVisual3D and RemoveExcludedVisual3D methods to EventManager3D - this exclude some 3D objects from hit testing.
  • Added CustomEventsSourceElement property to EventManager3D - it can be used instead of TargetViewport3D to get the mouse events (MouseMove, MouseEnter, MouseLeave).
  • Added MouseMove event to EventManager3D.
  • Added FinalPointHit to all EventArgs used in EventManager3D event handlers - it gets the transformed 3D point that was hit by the mouse (if Visual3D uses Transformation, than HitPoint will be wrong, but FinalHitPoint will be transformed).
  • Improved debugging with improvements in Dumper class:
  • Added support to control the values format string (number of displayed decimals) when using Ab3d.Utilities.Dumper.
  • Fixed Dumper.GetTransformText that returns the formatted text that describes the Transform3D object (some string.Format parameters were wrong).
  • Added DumpMeshInitializationCode and GetMeshInitializationCode methods to Ab3d.Utilities.Dumper - the methods create C# text that can be used to create MeshGeometry3D.
  • When no Normals or TextureCoordinates are defined the Ab3d.Utilities.Dumper will not show zero values for them.
  • Other improvements and fixes:
  • Added CreateMouseRay3D to BaseCamera - it can be use used to calculate the 3D ray that goes from the mouse position into the 3D scene.
  • Improved Refresh method in LinesUpdater - calling this method now forces to redraw all visible lines.
  • Added MaxLineArrowLength and LineArrowAngle to LinesUpdater to better control the size and shape of the arrows on 3D lines.
  • Fixed LineWithTextVisual3D when it was created in code behind and the properties were set without using BeginInit and EndInit methods.
  • Fixed recreating the content of 3D objects derived from Visual3D (if initially IsVisible was set to false and was then set to true the object was not shown under some circumstances).
  • Added many possibilities to change the CameraAxisPanel with overriding CreateAxisVisual, SetAxisLength, SetAxisColors or EnsureAxisTextBlocks (the later also existed before)
  • Improved performance of Box3D geometry mesh creation when X, Y and Z segments count is 1 (simple box with 2 triangles for one plane) - the mesh is now created 10 times faster.
  • Moved initialization of RotationCursor in MouseCameaController from constructor to OnLoad event handler - this prevented calling virtual method in constructor.
  • Added support for the Ab3d.DXEngine (still under construction) - objects created with Ab3d.PowerToys library will work correctly when used inside Ab3d.DXEngine (DirectX 11 rendering engine).

Version 3.4

  • Added GetCameraPosition method to BaseCamera.
  • Fixed creating geometry for Visual 3D objects when no property is changed on the visual (for example if default size is used).
  • Fixed showing long 3d lines that cross the near camera plane (before such lines were not correctly shown).
  • Improved measuring size of CameraControlPanel - now it is possible to define only desired Width or Height and the control automatically sets the other (Height or Width).
  • In MouseCameraController the StartMouseProcessing and EndMouseProcessing are now protected virtual and can be overriden (before they were private).
  • Improved creation of sphere mesh - before some triangles were defined in such a way that they represented a line instead of triangle (two positions in the triangle were defined in the same position in space).
  • Added possibility to create a slightly improved sphere mesh when there is no need to create texture coordinates (this can be done with spefiying generateTextureCoordinates as false in the Ab3d.Meshes.SphereMesh3D constructor).
  • Added DumpMatrix3D to Dumper.
  • Improved FpsMeter when custom DisplayFormatString is set.
  • Fixed creating PolyLines when it is created with duplicate positions - Index out of range exception was thrown before.

Version 3.3

  • Improved support for Visual Studio 2012 designer - now cameras correctly discover Viewport3D control when TargetViewport3D is not manually set.
  • Fixed a typo with renaming WireBoxVisual3 into WireBoxVisual3D (BREAKING CHANGE!).
  • Improved 3D Text - now ? character is correctly displayed instead of a character that does not have its 3D shape defined.
  • Fixed problem with displaying 3D Text in Visual Studio designer.

Version 3.2

  • Added HeightMapVisual3D and HeightMapMesh3D.
  • Added TubeMesh3D, TubeVisual3D and TubeUIElement3D.
  • Added support to very easily create 3D curves: added Ab3d.Utilities.BezierCurve and Ab3d.Utilities.BSpline classes; also added CreateBSpline3D and CreateNURBSCurve3D to Line3DFactory.
  • Improved LinesUpdater performance and removed possible memory leaks.
  • Added Reset method to LinesUpdater that takes Viewport3D as parameter to reset (remove all lines) from specific Viewport3D.
  • Added MouseWheel event to EventManager3D.

Version 3.1

  • Fixed rotating with MouseCameraController and CameaControlPanel when the scene in vertically inverted when Attitude is between 90 and 270 degrees.
  • Fixed EventManager3D where under some circumstances a new object drag can be automatically stared just after end drag event.
  • Improved MaterialTypeConverter: Added support for simply defining SpecularMaterial and EmissiveMaterials. For example the "s:32;Blue" text can be used to define MaterialGroup with DiffuseMaterial and SpecularMaterial (SpecularPower = 32; SpecularBrush = White; DiffuseMaterial = Blue). The "e:Yellow" can be used to show yellow emissive material. Also improved support for defining textures path (now files from local disk and from http can be used).
  • Fixed occasional NullReferenceException in SphericalCamera when layout is updated in Visual Studio designer.

Version 3.0

  • Added support for transparency sorting with new TransparencySorter and TransparencyHelper classes.
  • Simplified animating camera rotation with new StartRotation, StopRotation methods on SphericalCamera. There is also a new IsRotating properties. The MouseCameraController is also adjusted to suspend animated rotation while user rotates the camera with the mouse.
  • Added axes names to CameraAxisPanel. Also added IsAxisNameShown, XAxisColor, YAxisColor and ZAxisColor properties to CameraAxisPanel.
  • Added support for OrthographicCamera for all Ab3d.PowerToys Cameras. Added CameraType and CameraWidth properties to BaseCamera.
  • Greatly improved creating wireframe from existing 3D models - now it is much faster and uses much less memory.
  • Improved LinesUpdater - the lines that are removed from the visual tree are now free to be cleaned by garbage collection.
  • Added Reset and UnregisterLine methods to LinesUpdater to manually remove lines from LinesUpdater. This enables better manual control of the registered lines.
  • Improved measuring scene bounds in SceneCamera when transformations are used on Visual3D objects. Before the used transformations prevented the camera to correctly show the scene.
  • Fixed selecting cameras with mouse click on camera icon in Visual Studio 2010 designer.
  • Added GetCameraMatrixes to BaseCamera to get view and projection Matrix3D of the current camera.
  • Improved Ab3d.Utilities.Dumper class - Added GetTransformText and GetMatrix3DText methods and made GetMaterialText public. Also the GetModelInfoString method now also displays the Transformation details.
  • Improved commercial licensing code to prevent delay caused in RSACryptoServiceProvider under some circumstances.
  • Added Ab3d.Licensing.PowerToys.EmbeddedLicenseAssembly property to speed-up looking for embedded license key in commercial version.

Version 2.1

  • Fixed licensing code for WPF Browser applications (partially trusted) - before licensing did not work when both Ab3d.Reader3ds and Ab3d.PowerToys were used (defined in license.licx file).

Version 2.0

New features:
  • Added Offset to all cameras to move the camera around.
  • Added support for moving camera with MouseCameraController and CameraControlPanel.
  • Added RotateCameraConditions and MoveCameraConditions properties to MouseCameraController to fine tune the conditions to rotate and move the camera.
  • Added 3D Text support with TextVisual3D, CenteredTextVisual3D and LineWithTextVisual3D.
  • Added MultiMaterialBox where each side of the box can have its own material.
  • Added CreateFrom method to all Ab3d.Cameras - it can be used to create any Ab3d.Camera from existing WPF's Camera (or camera read from 3ds file with Ab3d.Reader3ds).
  • Added CameraAxisPanel - a predefined panel that shows the axis orientation for the target camera.
  • Added RectangleVisual3D, WireBoxVisual3, WireCrossVisual3D, VerticalPlaneVisual3D and LineArcVisual3D.
  • Added IsVisible to all 3d models derived from Visual3D. Now all Visual3D are derived from BaseVisual3D.
  • Added CreateWireframe method that takes Model3D to create wireframe from Model3DGroup or GeometryModel3D.
  • Added IsClosed property to WireGridVisual3D - if true a rectangle is drawn around wire grid to close the grid.
  • Added possibility to set 3D line thickness to 0 to hide the line - the same as set IsVisible to false.
  • Added Refresh method to all UIElemet3D classes - this way it is possible to force creation of used Model3D also if the UIElemet3D is not added to Viewport3D.
  • Added EventsSourceElementName to MouseCameraController - now it is possible to specify the custom event source also by specifying the element name.
  • Added GetModelInfoString method to Ab3d.Utilities.Dumper class - it gets a string with details about the GeometryModel3D or Model3DGroup.
  • Added IsDesignTimeInfoIconShown property to Ab3d.Cameras to hide camera info icon in design time - useful for custom controls that use Ab3d.Cameras.
  • Added Ab3d.Utilities.CameraUtils with CalculateCameraAngles to get camera angles (heading, attitude, bank) from lookDirection and upDirection.
  • Added Ab3d.Utilities.MathUtils.Rotete method to rotate Vector3D or Point3D for heading and attitude.
  • Added Ab3d.Utilities.MathUtils with IsOne, IsZero and IsSame methods that take double precision errors into account.
  • Added Refresh method to all UIElemet3D classes - this way it is possible to force creation of used Model3D also if the UIElemet3D is not added to Viewport3D.
  • Improved the MaterialTypeConverter to support creating a DiffuseMaterial with ImageBrush from image resource name - for example Material="/Resources/PowerToysTexture.png".
  • Improved line arrows - improved displayed when camera is pointing almost in the direction of the line.
  • Improved 3D PolyLines - lines are now connected to each other.

  • Fixed for using in PartiallyTrusted environment - using Hand cursor instead of custom cursor.
  • Automatically Disable / Enable the MouseCameraController and CameraControlPanel if Traget Camera's IsEnabled property is changed.
  • Fixed using StartLineCap and EndLineCap on PolyLines.
  • Improved DoubleClick event in EventManager3D - now the DoubleClick event does not trigger the Click event on the second click (if the DoubleClick event is subscribed).
  • Fixed normalizing normals in MeshUtils.CalculateNormals method.
  • Fixed using TargetViewport3DName property on Cameras in Visual Studio Design Time - in Design Time there is no NameScope so the FindName method does not work. To fix this the code looks for Viewport3D manually by checking the Camera's Parents Children. This means that the Camera must be defined under the same parent as the Viewport3D in order that the TargetViewport3DName works in Design Time.
  • Fixed using StartLineCap and EndLineCap on PolyLines.
  • BREAKING CHANGE: Fixed Bank - now the positive bank values rotate the camera in the clockwise direction (before the direction was counter-clockwise). For example bank angle 30 means that the Camera is rotated as a head would be bended to the right.