How to resize MeshModel?
MeshModel scale (scaling factor) is controlled by Size property. For example,
float sizeFactor = 40f; // Model scaling
// Set Scaling factor
model.Size.SetValues(sizeFactor, sizeFactor, sizeFactor);
However, only central point of mesh model is position at [x,y,z] axes values (Position property). The size of MeshModel is not fixed to Axes or Dimensions or 3D world. Therefore, one would need to scale model for the first time it is put on the chart. If user will change Axes range or 3D world dimensions, it will distort relative size of MeshModel.
Zooming could be done with mouse wheel scrolling or changing Chart.View3D.Camera.ViewDistance property directly.
If user wants to change Axes range or dimensions after MeshModel is loaded, it is possible, but a bit more complicated. This article is about that.
MeshModel.Size needs recalculation to adjust to a new range or dimensions. The reference values ones needs at all times are: original-Size, original-Dimensions and original-AxisRange. Below is an example of implementation.
First user needs to save those references values once model is added to the chart and chart is initialized.
SizeDoubleXYZ _originalDimensions;
SizeDoubleXYZ _originalAxisRange;
List<SizeDoubleXYZ> _lOriginalSize = new List<SizeDoubleXYZ>();
// save initial values after chart is created and MeshModels are imported/created
_originalDimensions = new SizeDoubleXYZ(
_chart.View3D.Dimensions.Width,
_chart.View3D.Dimensions.Height,
_chart.View3D.Dimensions.Depth
);
_originalAxisRange = new SizeDoubleXYZ(
_chart.View3D.XAxisPrimary3D.Maximum - _chart.View3D.XAxisPrimary3D.Minimum,
_chart.View3D.YAxisPrimary3D.Maximum - _chart.View3D.YAxisPrimary3D.Minimum,
_chart.View3D.ZAxisPrimary3D.Maximum - _chart.View3D.ZAxisPrimary3D.Minimum
);
foreach (MeshModel model in _chart.View3D.MeshModels)
{
_lOriginalSize.Add( new SizeDoubleXYZ(model.Size.Width, model.Size.Height, model.Size.Height));
}
Next user needs to subscribe to corresponding events:
// subscribe to event to update chart of dimensions or axis range change
_chart.View3D.XAxisPrimary3D.RangeChanged += AxisPrimary3D_RangeChanged;
_chart.View3D.YAxisPrimary3D.RangeChanged += AxisPrimary3D_RangeChanged;
_chart.View3D.ZAxisPrimary3D.RangeChanged += AxisPrimary3D_RangeChanged;
_chart.View3D.DimensionsChanged += View3D_DimensionsChanged;
Finally here are the math for size update and implementation of event handlers:
private void MeshModelSizeUpdate()
{
_chart.BeginUpdate();
SizeDoubleXYZ newAxisRange = new SizeDoubleXYZ(
_chart.View3D.XAxisPrimary3D.Maximum - _chart.View3D.XAxisPrimary3D.Minimum,
_chart.View3D.YAxisPrimary3D.Maximum - _chart.View3D.YAxisPrimary3D.Minimum,
_chart.View3D.ZAxisPrimary3D.Maximum - _chart.View3D.ZAxisPrimary3D.Minimum
);
SizeDoubleXYZ newDimensions = new SizeDoubleXYZ(
_chart.View3D.Dimensions.Width,
_chart.View3D.Dimensions.Height,
_chart.View3D.Dimensions.Depth
);
foreach (MeshModel model in _chart.View3D.MeshModels)
{
SizeDoubleXYZ originalSize = _lOriginalSize[_chart.View3D.MeshModels.IndexOf(model)];
// update model Size if Dimensions or Axes range changes
model.Size.SetValues(
originalSize.Width * (_originalAxisRange.Width / newAxisRange.Width) * (newDimensions.Width / _originalDimensions.Width),
originalSize.Height * (_originalAxisRange.Height / newAxisRange.Height) * (newDimensions.Height / _originalDimensions.Height),
originalSize.Depth * (_originalAxisRange.Depth / newAxisRange.Depth) * (newDimensions.Depth / _originalDimensions.Depth)
);
}
_chart.EndUpdate();
}
private void View3D_DimensionsChanged(double newWidth, double newHeight, double newDepth, View3D view, LightningChart chart)
{
MeshModelSizeUpdate();
}
private void AxisPrimary3D_RangeChanged(object sender, Arction.Wpf.Charting.Axes.RangeChangedEventArgs e)
{
MeshModelSizeUpdate();
}
Happy coding!