Beispiel #1
0
        private void AddPositionKeyLines(Position3DTrack positionTrack, Color majorLineColor, Color minorLineColor, Point3D startPosition, int segmentsCount)
        {
            // First create WireCrossVisual3D and PolyLineVisual3D at the key frame positions
            var point3DCollection = new Point3DCollection(positionTrack.KeysCount);

            foreach (var positionKeyFrame in positionTrack.Keys)
            {
                point3DCollection.Add(positionKeyFrame.Position);

                var wireCrossVisual3D = new Ab3d.Visuals.WireCrossVisual3D()
                {
                    Position      = new Point3D(positionKeyFrame.Position.X + startPosition.X, positionKeyFrame.Position.Y + 1, positionKeyFrame.Position.Z + startPosition.Z),
                    LinesLength   = 8,
                    LineThickness = 2,
                    LineColor     = majorLineColor
                };

                MainViewport.Children.Add(wireCrossVisual3D);
            }

            var polyLineVisual3D = new Ab3d.Visuals.PolyLineVisual3D()
            {
                LineColor     = majorLineColor,
                LineThickness = 2,
                Transform     = new TranslateTransform3D(startPosition.X, 1, startPosition.Z),
                Positions     = point3DCollection
            };

            MainViewport.Children.Add(polyLineVisual3D);


            // Now add minor WireCrossVisual3D that will show how animation progresses through time
            double framesPerSegment = (double)positionTrack.LastFrame / (double)segmentsCount;

            Vector3D startPositionOffset = new Vector3D(startPosition.X, 0.8, startPosition.Z);

            for (int i = 0; i <= segmentsCount; i++)
            {
                double frameNumber = i * framesPerSegment;

                Point3D positionForFrame = positionTrack.GetPositionForFrame(frameNumber) + startPositionOffset;

                var wireCrossVisual3D = new Ab3d.Visuals.WireCrossVisual3D()
                {
                    Position      = positionForFrame,
                    LineColor     = minorLineColor,
                    LineThickness = 1,
                    LinesLength   = 6
                };

                MainViewport.Children.Add(wireCrossVisual3D);
            }
        }
        private void UpdatePositionCross()
        {
            double  t = PositionSlider.Value / 100.0;
            Point3D position;

            // Get position on the curve defined by _controlPoints and _weights
            // t is on interval from 0 to 1 - 0 meaning the first control point and 1 the last control point

            if (_selectedCurveType == CurveType.BezierCurve || _selectedCurveType == CurveType.CurveThroughPoints)
            {
                position = _bezierCurve.GetPositionOnCurve(t);
            }
            else if (_selectedCurveType == CurveType.BSpline)
            {
                position = _bspline.GetPositionOnBSpline(t);
            }
            else
            {
                position = _bspline.GetPositionOnNURBSCurve(t);
            }


            if (_positionCross == null || !PositionsVisual.Children.Contains(_positionCross))
            {
                _positionCross               = new Visuals.WireCrossVisual3D();
                _positionCross.LineColor     = Colors.Yellow;
                _positionCross.LineThickness = 2;
                _positionCross.LinesLength   = 15;

                _positionCross.Position = position;

                PositionsVisual.Children.Add(_positionCross);
            }
            else
            {
                // Just update the position
                _positionCross.Position = position;
            }

            PositionTextBlock.Text = string.Format(System.Globalization.CultureInfo.InvariantCulture, "Position on curve (t = {0:0.00})", t);
        }