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); }