我在VB中使用WPF制作3D游戏,我使用的是ScrennSpaceLines3D对象 http://3dtools.codeplex.com/releases/view/2058 但是当我尝试删除一行时,我使用
添加到视口中 mainViewport.Children.RemoveAt(i)
它给出了NullExceptionError。我已经读过这是因为它并没有完全脱离渲染队列。有一些针对c#的修复,但我还没有找到一个适用于VB的方法。有没有办法让这项工作或可能以其他方式在3D空间中画一条线?我发现VB甚至没有办法轻松绘制3D线条是非常荒谬的......
答案 0 :(得分:0)
删除ScreenSpaceLines3D:
foreach (ScreenSpaceLines3D line3D in lines3DList)
{
lines3D.Points.Clear(); // Very importante
_viewport3D.Children.Remove(lines3D);
}
答案 1 :(得分:0)
我有点迟到了,但我遇到了同样的问题。
发生访问冲突是因为每个实例都将事件处理程序注册到合成目标
的Rendering事件public ScreenSpaceLines3D()
{
...
CompositionTarget.Rendering += OnRender; // <-- this line
}
但是当从场景中删除实例时忘记删除它。
所以要解决这个问题,你需要触摸源代码:
public ScreenSpaceLines3D()
{
...
// event registration removed
}
private bool AttachedToCompositionTargetRendering { get; set; }
protected override void OnVisualParentChanged(DependencyObject oldParent)
{
base.OnVisualParentChanged(oldParent);
var parent = VisualTreeHelper.GetParent(this);
if (parent == null)
{
if (AttachedToCompositionTargetRendering)
{
CompositionTarget.Rendering -= OnRender;
AttachedToCompositionTargetRendering = false;
}
}
else
{
if (!AttachedToCompositionTargetRendering)
{
CompositionTarget.Rendering += OnRender;
AttachedToCompositionTargetRendering = true;
}
}
}