Пример #1
0
        internal void cleanManipulator()
        {
            //Remove all Tooth manipulators
            List <Visual3D> childs = tc.Children.ToList();

            foreach (var m in childs)
            {
                if (m is CombinedManipulator)
                {
                    tc.Children.Remove(m);
                }
            }

            try
            {
                //Remove all Brace manipulators
                childs = bc.Children.ToList();
                foreach (var m in childs)
                {
                    if (m is BraceVisual3D)
                    {
                        ((BraceVisual3D)m).cleanManipulator();
                    }
                }
            }
            catch (Exception e) { }
            //this.parent.Children.Remove(_manipulator);
            _manipulator = null;
        }
Пример #2
0
        public void showHideManipulator()
        {
            if (showManipulator)
            {
                if (_manipulator == null)
                {
                    Rect3D r = this.Content.Bounds;
                    _manipulator = new CombinedManipulator();
                    //_manipulator.Position = new Point3D(r.X + (r.SizeX/2),r.Y + (r.SizeY / 2),r.Z + (r.SizeZ/2));
                    _manipulator.Offset = new Vector3D(r.X + (r.SizeX / 2), r.Y + (r.SizeY / 2), r.Z + (r.SizeZ / 2));
                    _manipulator.Pivot  = new Point3D(r.X + (r.SizeX / 2), r.Y + (r.SizeY / 2), r.Z + (r.SizeZ / 2));
                    //_manipulator.Pivot = new Point3D(0, 0, 0);
                    _manipulator.Diameter = Math.Max(r.SizeX, Math.Max(r.SizeY, r.SizeZ));
                    _manipulator.Length   = _manipulator.Diameter * 0.75;
                    _manipulator.Bind(this);
                }

                this.parent.Children.Add(_manipulator);
                showManipulator = false;
            }
            else
            {
                this.parent.Children.Remove(_manipulator);
                _manipulator    = null;
                showManipulator = true;
            }
        }
Пример #3
0
        /// <summary>
        /// @Deprecated
        /// Not used anymore since changes in CONTAINER design.
        /// <see cref="cleanManipulator"/>
        /// </summary>
        internal void clearManipulator()
        {
            if (this.parent.Children.Count > 0)
            {
                List <Visual3D> childs = this.parent.Children.ToList();
                foreach (var m in childs)
                {
                    if (m is CombinedManipulator)
                    {
                        this.parent.Children.Remove(m);
                    }
                }

                try
                {
                    childs = this.Children.ToList();
                    foreach (var m in childs)
                    {
                        if (m is BraceVisual3D)
                        {
                            ((BraceVisual3D)m).clearManipulator();
                        }
                    }
                }
                catch (Exception e) { }
            }
            //this.parent.Children.Remove(_manipulator);
            _manipulator = null;
        }
Пример #4
0
        //==============using Container ==========

        public void cleanManipulator()
        {
            List <Visual3D> childs = bc.Children.ToList();

            foreach (var m in childs)
            {
                if (m is CombinedManipulator)
                {
                    bc.Children.Remove(m);
                }
            }
            _manipulator = null;
        }
        public CombinedManipulatorExploration()
        {
            var manipulator = new CombinedManipulator();

            Sphere = new SphereVisual3D()
            {
                Radius = 1
            };
            manipulator.Bind(Sphere);
            InitializeComponent();

            viewport.Children.Add(Sphere);
            viewport.Children.Add(manipulator);
        }
Пример #6
0
        private void AllFramesModeButton_Click(object sender, RoutedEventArgs e)
        {
            HelixViewportLeft.Children.Remove(FrameStartEulerManipulator);
            HelixViewportLeft.Children.Remove(FrameEndEulerManipulator);
            HelixViewportRight.Children.Remove(FrameStartQuaternionManipulator);
            HelixViewportRight.Children.Remove(FrameEndQuaternionManipulator);

            PlayButton.IsEnabled               = false;
            PauseButton.IsEnabled              = false;
            ResetButton.IsEnabled              = false;
            FramesCountBox.IsEnabled           = false;
            AllFramesModeButton.IsEnabled      = false;
            AllFramesModeClearButton.IsEnabled = true;

            if (FramesCount < 2)
            {
                FramesCount = 2;
            }

            allFramesEuler      = new CombinedManipulator[FramesCount];
            allFramesQuaternion = new CombinedManipulator[FramesCount];

            CalibrateEulerAngles();
            for (int i = 0; i < FramesCount; i++)
            {
                var timeFactor = i / (FramesCount - 1.0);
                CalculateCurrentPosition(timeFactor);
                CalculateCurrentAngle(timeFactor);
                CalculateCurrentQuaternion(timeFactor);
                SetupCurrentConfiguration();

                allFramesEuler[i] = new CombinedManipulator()
                {
                    Transform  = new MatrixTransform3D(frameEuler.Transform.Value),
                    CanRotateX = false,
                    CanRotateY = false,
                    CanRotateZ = false
                };
                allFramesQuaternion[i] = new CombinedManipulator()
                {
                    Transform  = new MatrixTransform3D(frameQuaternion.Transform.Value),
                    CanRotateX = false,
                    CanRotateY = false,
                    CanRotateZ = false
                };

                HelixViewportLeft.Children.Add(allFramesEuler[i]);
                HelixViewportRight.Children.Add(allFramesQuaternion[i]);
            }
        }
Пример #7
0
        /// <summary>
        /// @Deprecated
        /// Will be removed soon.
        /// <see cref="cleanManipulator"/>
        /// </summary>
        public void clearManipulator()
        {
            List <Visual3D> childs = this.parent.Children.ToList();

            foreach (var m in childs)
            {
                if (m is CombinedManipulator)
                {
                    this.parent.Children.Remove(m);
                }
            }

            //this.parent.Children.Remove(_manipulator);
            _manipulator = null;
        }
Пример #8
0
 /// <summary>
 /// @Deprecated
 /// Not used anymore since changes in CONTAINER design.
 /// <see cref="displayManipulator"/>
 /// </summary>
 public void showHideManipulator()
 {
     this.brace1.clearManipulator();
     if (_manipulator == null)
     {
         Rect3D r = this.Content.Bounds;
         _manipulator = new CombinedManipulator();
         //_manipulator.Position = new Point3D(r.X + (r.SizeX/2),r.Y + (r.SizeY / 2),r.Z + (r.SizeZ/2));
         _manipulator.Offset = new Vector3D(r.X + (r.SizeX / 2), r.Y + (r.SizeY / 2), r.Z + (r.SizeZ / 2));
         _manipulator.Pivot  = new Point3D(r.X + (r.SizeX / 2), r.Y + (r.SizeY / 2), r.Z + (r.SizeZ / 2));
         //_manipulator.Pivot = new Point3D(0, 0, 0);
         //_manipulator.Diameter = Math.Max(r.SizeX, Math.Max(r.SizeY, r.SizeZ)) + 1;
         //_manipulator.Length = _manipulator.Diameter * 0.75;
         _manipulator.Bind(this);
     }
     this.brace1.Children.Add(_manipulator);
 }
Пример #9
0
        public void displayManipulator()
        {
            this.parent.cleanManipulator();
            if (_manipulator == null)
            {
                Rect3D r = this.Content.Bounds;
                _manipulator = new CombinedManipulator();
                //_manipulator.Position = new Point3D(r.X + (r.SizeX/2),r.Y + (r.SizeY / 2),r.Z + (r.SizeZ/2));
                _manipulator.Offset = new Vector3D(r.X + (r.SizeX / 2), r.Y + (r.SizeY / 2), r.Z + (r.SizeZ / 2));
                _manipulator.Pivot  = new Point3D(r.X + (r.SizeX / 2), r.Y + (r.SizeY / 2), r.Z + (r.SizeZ / 2));
                //_manipulator.Pivot = new Point3D(0, 0, 0);
                _manipulator.Diameter = Math.Max(r.SizeX, Math.Max(r.SizeY, r.SizeZ)) + 1;
                _manipulator.Length   = _manipulator.Diameter * 0.75;
                _manipulator.Bind(this);
                Bind(_manipulator);

                //addTeethRoot();
                //test
                //MeshGeometry3D mesh = GetMesh();
                //drawBorderEdges(mesh);
            }
            tc.Children.Add(_manipulator);
        }
Пример #10
0
        /// <summary>
        /// @Deprecated
        /// Not used anymore since changes in CONTAINER design.
        /// <see cref="cleanManipulator"/>
        /// </summary>
        internal void clearManipulator()
        {
            List <Visual3D> childs = this.brace1.Children.ToList();

            foreach (var m in childs)
            {
                if (m is CombinedManipulator)
                {
                    this.brace1.Children.Remove(m);
                }
            }

            childs = this.Children.ToList();
            foreach (var m in childs)
            {
                if (m is BraceVisual3D)
                {
                    ((BraceVisual3D)m).clearManipulator();
                }
            }

            //this.parent.Children.Remove(_manipulator);
            _manipulator = null;
        }
Пример #11
0
        private void InitializeScene()
        {
            const double maxVal = 8;

            var arrowX = new ArrowVisual3D();

            arrowX.Direction = new Vector3D(1, 0, 0);
            arrowX.Point1    = new Point3D(0, 0, 0);
            arrowX.Point2    = new Point3D(maxVal, 0, 0);
            arrowX.Diameter  = 0.1;
            arrowX.Fill      = System.Windows.Media.Brushes.Black;
            HelixViewportLeft.Children.Add(arrowX);

            arrowX           = new ArrowVisual3D();
            arrowX.Direction = new Vector3D(1, 0, 0);
            arrowX.Point1    = new Point3D(0, 0, 0);
            arrowX.Point2    = new Point3D(maxVal, 0, 0);
            arrowX.Diameter  = 0.1;
            arrowX.Fill      = System.Windows.Media.Brushes.Black;
            HelixViewportRight.Children.Add(arrowX);

            var arrowMX = new ArrowVisual3D();

            arrowMX.Direction = new Vector3D(-1, 0, 0);
            arrowMX.Point1    = new Point3D(0, 0, 0);
            arrowMX.Point2    = new Point3D(-maxVal, 0, 0);
            arrowMX.Diameter  = 0.1;
            arrowMX.Fill      = System.Windows.Media.Brushes.Black;
            HelixViewportLeft.Children.Add(arrowMX);

            arrowMX           = new ArrowVisual3D();
            arrowMX.Direction = new Vector3D(-1, 0, 0);
            arrowMX.Point1    = new Point3D(0, 0, 0);
            arrowMX.Point2    = new Point3D(-maxVal, 0, 0);
            arrowMX.Diameter  = 0.1;
            arrowMX.Fill      = System.Windows.Media.Brushes.Black;
            HelixViewportRight.Children.Add(arrowMX);

            var arrowY = new ArrowVisual3D();

            arrowY.Direction = new Vector3D(0, 1, 0);
            arrowY.Point1    = new Point3D(0, 0, 0);
            arrowY.Point2    = new Point3D(0, maxVal, 0);
            arrowY.Diameter  = 0.1;
            arrowY.Fill      = System.Windows.Media.Brushes.Black;
            HelixViewportLeft.Children.Add(arrowY);

            arrowY           = new ArrowVisual3D();
            arrowY.Direction = new Vector3D(0, 1, 0);
            arrowY.Point1    = new Point3D(0, 0, 0);
            arrowY.Point2    = new Point3D(0, maxVal, 0);
            arrowY.Diameter  = 0.1;
            arrowY.Fill      = System.Windows.Media.Brushes.Black;
            HelixViewportRight.Children.Add(arrowY);

            var arrowMY = new ArrowVisual3D();

            arrowMY.Direction = new Vector3D(0, -1, 0);
            arrowMY.Point1    = new Point3D(0, 0, 0);
            arrowMY.Point2    = new Point3D(0, -maxVal, 0);
            arrowMY.Diameter  = 0.1;
            arrowMY.Fill      = System.Windows.Media.Brushes.Black;
            HelixViewportLeft.Children.Add(arrowMY);

            arrowMY           = new ArrowVisual3D();
            arrowMY.Direction = new Vector3D(0, -1, 0);
            arrowMY.Point1    = new Point3D(0, 0, 0);
            arrowMY.Point2    = new Point3D(0, -maxVal, 0);
            arrowMY.Diameter  = 0.1;
            arrowMY.Fill      = System.Windows.Media.Brushes.Black;
            HelixViewportRight.Children.Add(arrowMY);

            var arrowZ = new ArrowVisual3D();

            arrowZ.Direction = new Vector3D(0, 0, 1);
            arrowZ.Point1    = new Point3D(0, 0, 0);
            arrowZ.Point2    = new Point3D(0, 0, maxVal);
            arrowZ.Diameter  = 0.1;
            arrowZ.Fill      = System.Windows.Media.Brushes.Black;
            HelixViewportLeft.Children.Add(arrowZ);

            arrowZ           = new ArrowVisual3D();
            arrowZ.Direction = new Vector3D(0, 0, 1);
            arrowZ.Point1    = new Point3D(0, 0, 0);
            arrowZ.Point2    = new Point3D(0, 0, maxVal);
            arrowZ.Diameter  = 0.1;
            arrowZ.Fill      = System.Windows.Media.Brushes.Black;
            HelixViewportRight.Children.Add(arrowZ);

            var arrowMZ = new ArrowVisual3D();

            arrowMZ.Direction = new Vector3D(0, 0, -1);
            arrowMZ.Point1    = new Point3D(0, 0, 0);
            arrowMZ.Point2    = new Point3D(0, 0, -maxVal);
            arrowMZ.Diameter  = 0.1;
            arrowMZ.Fill      = System.Windows.Media.Brushes.Black;
            HelixViewportLeft.Children.Add(arrowMZ);

            arrowMZ           = new ArrowVisual3D();
            arrowMZ.Direction = new Vector3D(0, 0, -1);
            arrowMZ.Point1    = new Point3D(0, 0, 0);
            arrowMZ.Point2    = new Point3D(0, 0, -maxVal);
            arrowMZ.Diameter  = 0.1;
            arrowMZ.Fill      = System.Windows.Media.Brushes.Black;
            HelixViewportRight.Children.Add(arrowMZ);

            var xArrowText = new TextVisual3D();

            xArrowText.Text       = "X";
            xArrowText.Position   = new Point3D(maxVal - 0.5, 0, 0.5);
            xArrowText.Height     = 0.5;
            xArrowText.FontWeight = System.Windows.FontWeights.Bold;
            HelixViewportLeft.Children.Add(xArrowText);

            xArrowText            = new TextVisual3D();
            xArrowText.Text       = "X";
            xArrowText.Position   = new Point3D(maxVal - 0.5, 0, 0.5);
            xArrowText.Height     = 0.5;
            xArrowText.FontWeight = System.Windows.FontWeights.Bold;
            HelixViewportRight.Children.Add(xArrowText);

            var yArrowText = new TextVisual3D();

            yArrowText.Text       = "Y";
            yArrowText.Position   = new Point3D(0, maxVal - 0.5, 0.5);
            yArrowText.Height     = 0.5;
            yArrowText.FontWeight = System.Windows.FontWeights.Bold;
            HelixViewportLeft.Children.Add(yArrowText);

            yArrowText            = new TextVisual3D();
            yArrowText.Text       = "Y";
            yArrowText.Position   = new Point3D(0, maxVal - 0.5, 0.5);
            yArrowText.Height     = 0.5;
            yArrowText.FontWeight = System.Windows.FontWeights.Bold;
            HelixViewportRight.Children.Add(yArrowText);

            var zArrowText = new TextVisual3D();

            zArrowText.Text       = "Z";
            zArrowText.Position   = new Point3D(0.5, 0, maxVal - 0.5);
            zArrowText.Height     = 0.5;
            zArrowText.FontWeight = System.Windows.FontWeights.Bold;
            HelixViewportLeft.Children.Add(zArrowText);

            zArrowText            = new TextVisual3D();
            zArrowText.Text       = "Z";
            zArrowText.Position   = new Point3D(0.5, 0, maxVal - 0.5);
            zArrowText.Height     = 0.5;
            zArrowText.FontWeight = System.Windows.FontWeights.Bold;
            HelixViewportRight.Children.Add(zArrowText);

            var leftText = new TextVisual3D();

            leftText.Text       = "Euler Angles Interpolation";
            leftText.Position   = new Point3D(0, 0, maxVal + 0.5);
            leftText.Height     = 1;
            leftText.FontWeight = System.Windows.FontWeights.Bold;
            HelixViewportLeft.Children.Add(leftText);

            var rightText = new TextVisual3D();

            rightText.Text       = "Quaternion Interpolation";
            rightText.Position   = new Point3D(0, 0, maxVal + 0.5);
            rightText.Height     = 1;
            rightText.FontWeight = System.Windows.FontWeights.Bold;
            HelixViewportRight.Children.Add(rightText);

            SetupStartConfiguration();
            SetupEndConfiguration();

            frameEuler = new CombinedManipulator()
            {
                CanRotateX = false,
                CanRotateY = false,
                CanRotateZ = false
            };

            frameQuaternion = new CombinedManipulator()
            {
                CanRotateX = false,
                CanRotateY = false,
                CanRotateZ = false
            };
        }
Пример #12
0
        private void OnAllFramesDisplayed(object sender, RoutedEventArgs e)
        {
            //HelixViewportLeft.Children.Remove(FrameStartEulerManipulator);
            //HelixViewportLeft.Children.Remove(FrameEndEulerManipulator);
            HelixViewportRight.Children.Remove(FrameStartQuaternionManipulator);
            HelixViewportRight.Children.Remove(FrameEndQuaternionManipulator);

            PlayButton.IsEnabled     = false;
            PauseButton.IsEnabled    = false;
            ResetButton.IsEnabled    = false;
            FramesCountBox.IsEnabled = false;

            linearInterpolator.SetupInterpolator(
                startAngleR,
                startAngleP,
                startAngleY,
                endAngleR,
                endAngleP,
                endAngleY,
                startPositionX,
                startPositionY,
                startPositionZ,
                endPositionX,
                endPositionY,
                endPositionZ,
                startQuaternion,
                endQuaternion);

            sphericalLinearInterpolator.SetupInterpolator(
                startQuaternion,
                endQuaternion
                );


            if (FramesCount < 2)
            {
                FramesCount = 2;
            }

            allFramesEuler      = new CombinedManipulator[FramesCount];
            allFramesQuaternion = new CombinedManipulator[FramesCount];

            for (int i = 0; i < FramesCount; i++)
            {
                var timeFactor = i / (FramesCount - 1.0);
                linearInterpolator.CalculateCurrentPosition(ref currentPosition, timeFactor);
                linearInterpolator.CalculateCurrentAngle(ref currentRotation, timeFactor);

                if (lerpActivated)
                {
                    linearInterpolator.CalculateCurrentQuaternion(ref currentQuaternion, timeFactor);
                }
                else
                {
                    sphericalLinearInterpolator.CalculateCurrentQuaternion(ref currentQuaternion, timeFactor);
                }
                SetupCurrentConfiguration();

                allFramesEuler[i] = new CombinedManipulator()
                {
                    Transform  = new MatrixTransform3D(frameEuler.Transform.Value),
                    CanRotateX = false,
                    CanRotateY = false,
                    CanRotateZ = false
                };
                allFramesQuaternion[i] = new CombinedManipulator()
                {
                    Transform  = new MatrixTransform3D(frameQuaternion.Transform.Value),
                    CanRotateX = false,
                    CanRotateY = false,
                    CanRotateZ = false
                };

                HelixViewportLeft.Children.Add(allFramesEuler[i]);
                HelixViewportRight.Children.Add(allFramesQuaternion[i]);
            }
        }
Пример #13
0
        private void InitializeScene()
        {
            linearInterpolator          = new LinearInterpolator();
            sphericalLinearInterpolator = new SphericalLinearInterpolator();
            realTimeInterpolator        = new RealTimeInterpolator();

            const double maxVal = 8;

            var arrowX = new ArrowVisual3D();

            arrowX.Direction = new Vector3D(1, 0, 0);
            arrowX.Point1    = new Point3D(0, 0, 0);
            arrowX.Point2    = new Point3D(maxVal, 0, 0);
            arrowX.Diameter  = 0.1;
            arrowX.Fill      = System.Windows.Media.Brushes.Black;
            HelixViewportLeft.Children.Add(arrowX);

            arrowX           = new ArrowVisual3D();
            arrowX.Direction = new Vector3D(1, 0, 0);
            arrowX.Point1    = new Point3D(0, 0, 0);
            arrowX.Point2    = new Point3D(maxVal, 0, 0);
            arrowX.Diameter  = 0.1;
            arrowX.Fill      = System.Windows.Media.Brushes.Black;
            HelixViewportRight.Children.Add(arrowX);

            var arrowMX = new ArrowVisual3D();

            arrowMX.Direction = new Vector3D(-1, 0, 0);
            arrowMX.Point1    = new Point3D(0, 0, 0);
            arrowMX.Point2    = new Point3D(-maxVal, 0, 0);
            arrowMX.Diameter  = 0.1;
            arrowMX.Fill      = System.Windows.Media.Brushes.Black;
            HelixViewportLeft.Children.Add(arrowMX);

            arrowMX           = new ArrowVisual3D();
            arrowMX.Direction = new Vector3D(-1, 0, 0);
            arrowMX.Point1    = new Point3D(0, 0, 0);
            arrowMX.Point2    = new Point3D(-maxVal, 0, 0);
            arrowMX.Diameter  = 0.1;
            arrowMX.Fill      = System.Windows.Media.Brushes.Black;
            HelixViewportRight.Children.Add(arrowMX);

            var arrowY = new ArrowVisual3D();

            arrowY.Direction = new Vector3D(0, 0, 1);
            arrowY.Point1    = new Point3D(0, 0, 0);
            arrowY.Point2    = new Point3D(0, 0, maxVal);
            arrowY.Diameter  = 0.1;
            arrowY.Fill      = System.Windows.Media.Brushes.Black;
            HelixViewportLeft.Children.Add(arrowY);

            arrowY           = new ArrowVisual3D();
            arrowY.Direction = new Vector3D(0, 0, 1);
            arrowY.Point1    = new Point3D(0, 0, 0);
            arrowY.Point2    = new Point3D(0, 0, maxVal);
            arrowY.Diameter  = 0.1;
            arrowY.Fill      = System.Windows.Media.Brushes.Black;
            HelixViewportRight.Children.Add(arrowY);

            var arrowMY = new ArrowVisual3D();

            arrowMY.Direction = new Vector3D(0, 0, -1);
            arrowMY.Point1    = new Point3D(0, 0, 0);
            arrowMY.Point2    = new Point3D(0, 0, -maxVal);
            arrowMY.Diameter  = 0.1;
            arrowMY.Fill      = System.Windows.Media.Brushes.Black;
            HelixViewportLeft.Children.Add(arrowMY);

            arrowMY           = new ArrowVisual3D();
            arrowMY.Direction = new Vector3D(0, 0, -1);
            arrowMY.Point1    = new Point3D(0, 0, 0);
            arrowMY.Point2    = new Point3D(0, 0, -maxVal);
            arrowMY.Diameter  = 0.1;
            arrowMY.Fill      = System.Windows.Media.Brushes.Black;
            HelixViewportRight.Children.Add(arrowMY);

            var arrowZ = new ArrowVisual3D();

            arrowZ.Direction = new Vector3D(0, 1, 0);
            arrowZ.Point1    = new Point3D(0, 0, 0);
            arrowZ.Point2    = new Point3D(0, maxVal, 0);
            arrowZ.Diameter  = 0.1;
            arrowZ.Fill      = System.Windows.Media.Brushes.Black;
            HelixViewportLeft.Children.Add(arrowZ);

            arrowZ           = new ArrowVisual3D();
            arrowZ.Direction = new Vector3D(0, 1, 0);
            arrowZ.Point1    = new Point3D(0, 0, 0);
            arrowZ.Point2    = new Point3D(0, maxVal, 0);
            arrowZ.Diameter  = 0.1;
            arrowZ.Fill      = System.Windows.Media.Brushes.Black;
            HelixViewportRight.Children.Add(arrowZ);

            var arrowMZ = new ArrowVisual3D();

            arrowMZ.Direction = new Vector3D(0, -1, 0);
            arrowMZ.Point1    = new Point3D(0, 0, 0);
            arrowMZ.Point2    = new Point3D(0, -maxVal, 0);
            arrowMZ.Diameter  = 0.1;
            arrowMZ.Fill      = System.Windows.Media.Brushes.Black;
            HelixViewportLeft.Children.Add(arrowMZ);

            arrowMZ           = new ArrowVisual3D();
            arrowMZ.Direction = new Vector3D(0, 0, -1);
            arrowMZ.Point1    = new Point3D(0, 0, 0);
            arrowMZ.Point2    = new Point3D(0, -maxVal, 0);
            arrowMZ.Diameter  = 0.1;
            arrowMZ.Fill      = System.Windows.Media.Brushes.Black;
            HelixViewportRight.Children.Add(arrowMZ);

            var xArrowText = new TextVisual3D();

            xArrowText.Text       = "X";
            xArrowText.Position   = new Point3D(maxVal - 0.5, 0, 0.5);
            xArrowText.Height     = 0.5;
            xArrowText.FontWeight = System.Windows.FontWeights.Bold;
            HelixViewportLeft.Children.Add(xArrowText);

            xArrowText            = new TextVisual3D();
            xArrowText.Text       = "X";
            xArrowText.Position   = new Point3D(maxVal - 0.5, 0, 0.5);
            xArrowText.Height     = 0.5;
            xArrowText.FontWeight = System.Windows.FontWeights.Bold;
            HelixViewportRight.Children.Add(xArrowText);

            var yArrowText = new TextVisual3D();

            yArrowText.Text       = "Z";
            yArrowText.Position   = new Point3D(0, 0.5, maxVal - 0.5);
            yArrowText.Height     = 0.5;
            yArrowText.FontWeight = System.Windows.FontWeights.Bold;
            HelixViewportLeft.Children.Add(yArrowText);

            yArrowText            = new TextVisual3D();
            yArrowText.Text       = "Z";
            yArrowText.Position   = new Point3D(0, 0.5, maxVal - 0.5);
            yArrowText.Height     = 0.5;
            yArrowText.FontWeight = System.Windows.FontWeights.Bold;
            HelixViewportRight.Children.Add(yArrowText);

            var zArrowText = new TextVisual3D();

            zArrowText.Text       = "Y";
            zArrowText.Position   = new Point3D(0.5, maxVal - 0.5, 0);
            zArrowText.Height     = 0.5;
            zArrowText.FontWeight = System.Windows.FontWeights.Bold;
            HelixViewportLeft.Children.Add(zArrowText);

            zArrowText            = new TextVisual3D();
            zArrowText.Text       = "Y";
            zArrowText.Position   = new Point3D(0.5, maxVal - 0.5, 0);
            zArrowText.Height     = 0.5;
            zArrowText.FontWeight = System.Windows.FontWeights.Bold;
            HelixViewportRight.Children.Add(zArrowText);

            var leftText = new TextVisual3D();

            leftText.Text       = "Internal angles interpolation";
            leftText.Position   = new Point3D(0, 0, maxVal + 0.5);
            leftText.Height     = 1;
            leftText.FontWeight = System.Windows.FontWeights.Bold;
            HelixViewportLeft.Children.Add(leftText);

            var rightText = new TextVisual3D();

            rightText.Text       = "Inverse chain";
            rightText.Position   = new Point3D(0, 0, maxVal + 0.5);
            rightText.Height     = 1;
            rightText.FontWeight = System.Windows.FontWeights.Bold;
            HelixViewportRight.Children.Add(rightText);


            var floor = new RectangleVisual3D
            {
                Fill   = new SolidColorBrush(Color.FromArgb(30, 0, 0, 0)),
                Normal = new Vector3D(0, 0, 1),
                Origin = new Point3D(0, 0, 0)
            };

            floor.Width           = floor.Length = 10;
            floor.LengthDirection = new Vector3D(1, 0, 0);

            HelixViewportLeft.Children.Add(floor);

            var wall = new RectangleVisual3D
            {
                Fill   = new SolidColorBrush(Color.FromArgb(30, 0, 0, 0)),
                Normal = new Vector3D(0, 0, 1),
                Origin = new Point3D(0, 0, 0)
            };

            wall.Width           = wall.Length = 10;
            wall.LengthDirection = new Vector3D(1, 0, 0);
            HelixViewportRight.Children.Add(wall);


            frameEuler = new CombinedManipulator()
            {
                CanRotateX = false,
                CanRotateY = false,
                CanRotateZ = false
            };

            frameQuaternion = new CombinedManipulator()
            {
                CanRotateX = false,
                CanRotateY = false,
                CanRotateZ = false
            };
        }