4

I work on a small project, where I use helix-3DToolkit. There I want to add some 3D objects on runtime.

When I add a element and try to add the MeshGeometry3D from the MeshBuilder I get everytime the same nullreference exception with the following stacktrace:

bei HelixToolkit.Wpf.SharpDX.MeshGeometryModel3D.Attach(IRenderHost host) in c:\TeamCity\buildAgent\work\4ff441572eb3435d\Source\HelixToolkit.Wpf.SharpDX\Model\Elements3D\MeshGeometryModel3D.cs:Zeile 57.
bei HelixToolkit.Wpf.SharpDX.GeometryModel3D.OnGeometryChanged(DependencyPropertyChangedEventArgs e) in c:\TeamCity\buildAgent\work\4ff441572eb3435d\Source\HelixToolkit.Wpf.SharpDX\Model\Elements3D\AbstractElements3D\GeometryModel3D.cs:Zeile 59.
bei HelixToolkit.Wpf.SharpDX.MaterialGeometryModel3D.OnGeometryChanged(DependencyPropertyChangedEventArgs e) in c:\TeamCity\buildAgent\work\4ff441572eb3435d\Source\HelixToolkit.Wpf.SharpDX\Model\Elements3D\AbstractElements3D\MaterialGeometryModel3D.cs:Zeile 167.
bei HelixToolkit.Wpf.SharpDX.GeometryModel3D.GeometryChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) in c:\TeamCity\buildAgent\work\4ff441572eb3435d\Source\HelixToolkit.Wpf.SharpDX\Model\Elements3D\AbstractElements3D\GeometryModel3D.cs:Zeile 35.
bei System.Windows.DependencyObject.OnPropertyChanged(DependencyPropertyChangedEventArgs e)
bei System.Windows.FrameworkElement.OnPropertyChanged(DependencyPropertyChangedEventArgs e)
bei System.Windows.DependencyObject.NotifyPropertyChange(DependencyPropertyChangedEventArgs args)
bei System.Windows.DependencyObject.UpdateEffectiveValue(EntryIndex entryIndex, DependencyProperty dp, PropertyMetadata metadata, EffectiveValueEntry oldEntry, EffectiveValueEntry& newEntry, Boolean coerceWithDeferredReference, Boolean coerceWithCurrentValue, OperationType operationType)
bei System.Windows.DependencyObject.SetValueCommon(DependencyProperty dp, Object value, PropertyMetadata metadata, Boolean coerceWithDeferredReference, Boolean coerceWithCurrentValue, OperationType operationType, Boolean isInternal)
bei System.Windows.DependencyObject.SetValue(DependencyProperty dp, Object value)
bei HelixToolkit.Wpf.SharpDX.GeometryModel3D.set_Geometry(Geometry3D value) in c:\TeamCity\buildAgent\work\4ff441572eb3435d\Source\HelixToolkit.Wpf.SharpDX\Model\Elements3D\AbstractElements3D\GeometryModel3D.cs:Zeile 26.
bei Metromec.Qrt.CollisionDetection.Domain.Bullet.ViewControl.BulletControl.UpdateView(MeshBuilder meshBuilder) in j:\quartis\_dev\src\CarriageComposite\Source\Services\CollisionDetection\Domain\Bullet\Control\BulletControl.xaml.cs:Zeile 137.

the xaml looks like this:

<htx:Viewport3DX             
        x:Name="viewPort" 
        Title="Test"
        SubTitle="subtest"
        TextBrush="Black"            
        ShowCoordinateSystem="True"
        CoordinateSystemLabelForeground="Red"
        UseDefaultGestures="True">
        <htx:AmbientLight3D Color="{Binding AmbientLightColor}"/>
        <htx:DirectionalLight3D Color="{Binding DirectionalLightColor}" Direction = "{Binding DirectionalLightDirection}"/>
        <htx:MeshGeometryModel3D x:Name="test" Geometry="{Binding Model}" Transform = "{Binding Model1Transform}" Material="{Binding RedMaterial}"   />

    </htx:Viewport3DX>

the viewmodel:

public class BulletViewModel 
{
  //...

  public MeshGeometry3D Model
  {
    get { return _model; }
    set 
    { 
      //SetValue(ref _model, value, "Model"); 
      _model = value;
    }
}

and in my form I have this:

public void Initialize()
{
  //..
  _timer.Interval = 500;
  _timer.Tick += _timer_Elapsed;
  _timer.Start();

}

private void _timer_Elapsed(object sender, EventArgs eventArgs)
{
    _timer.Stop(); //not needed, should work without
    var meshBuilder = GetMeshBuilder();
    AddBox(meshBuilder, new Vector3(1,1,1), new Vector3(1,1,1) );
    UpdateView(meshBuilder);
    _timer.Start();
}

private void AddBox(MeshBuilder meshBuilder, Vector3 centre, Vector3 size)
{
  meshBuilder.AddBox(centre,size.X, size.Y, size.Z, BoxFaces.All);
}

private MeshBuilder GetMeshBuilder()
{
  return new MeshBuilder();
}

private void UpdateView(MeshBuilder meshBuilder)
{

  try
  {
    viewPort.RenderTechnique = Techniques.RenderBlinn;
    var geom = meshBuilder.ToMeshGeometry3D();
    if (geom != null)
    {
      geom.Colors = new Color4Collection(geom.TextureCoordinates.Select(x => x.ToColor4()));
      _viewModel.RedMaterial = PhongMaterials.Red;
      _viewModel.Model1Transform = new TranslateTransform3D(0, 0, 0);
      _viewModel.Model = geom;
      viewPort.DataContext = null;
      viewPort.DataContext = _viewModel;
      test.Geometry = geom; //--> this doesn't work and gives a exception
    }
  }
  catch (Exception e)
  {
    Console.WriteLine(e);
  }
}

What is wrong with this code? How can I add some elements on runtime to my viewport? Is it correct to use the MeshGeometryModel3D for this? I tried to add a new MeshGeometryModel3D Geometry, I changed the existing but nothing works.

user3840692
  • 273
  • 2
  • 13

0 Answers0