C# 如何解决helix3d模型中的缩放/定位问题?
问题: 我正在尝试使用helixtoolkit.wpf.sharpdx创建和渲染详细的建筑模型。模型的某些部分(主要是房屋内部的详细家具和管道结构)在第一眼看到时就被错误地缩放和定位。C# 如何解决helix3d模型中的缩放/定位问题?,c#,sharpdx,helix-3d-toolkit,C#,Sharpdx,Helix 3d Toolkit,问题: 我正在尝试使用helixtoolkit.wpf.sharpdx创建和渲染详细的建筑模型。模型的某些部分(主要是房屋内部的详细家具和管道结构)在第一眼看到时就被错误地缩放和定位。 我是新来的,没有足够的声誉发布图片 然而,如果我小心地将我的视点(相机?)移入房子,一些内部结构就会开始显示出来。在对房子的整个内部空间进行了漫游,并将我的视角拉回到外部世界后,渲染的场景看起来非常完美。 (三维模型的计算和装配过程应正确。) 问题: 我有没有错过什么重要的一步 是否有可能的变通方法来确保场景
我是新来的,没有足够的声誉发布图片
然而,如果我小心地将我的视点(相机?)移入房子,一些内部结构就会开始显示出来。在对房子的整个内部空间进行了漫游,并将我的视角拉回到外部世界后,渲染的场景看起来非常完美。
(三维模型的计算和装配过程应正确。)
问题:
Model3DCollection collection; //pre-assembled data
ObservableElement3DCollection obCollection = new ObservableElement3DCollection();
foreach (var m3d in collection)
{
if (m3d is GeometryModel3D gm3D)
{
MeshGeometry3D meshGeometry3D = gm3D.Geometry as MeshGeometry3D;
HelixToolkit.Wpf.SharpDX.MeshGeometry3D meshGeometry = CastGeometry(meshGeometry3D);
var model = new MeshGeometryModel3D()
{
Material = CastMaterial(gm3D.Material),
Transform = m3d.Transform,
Geometry = meshGeometry,
CullMode = CullMode.Front
};
meshGeometry.UpdateOctree();
obCollection.Add(model);
}
}
OnPropertyChanged(nameof(obCollection));
//...
您是否使用单独的线程而不是UI线程来加载模型 似乎转换没有得到更新 确保以下内容正在UI线程中运行:
var model = new MeshGeometryModel3D()
{
Material = CastMaterial(gm3D.Material),
Transform = m3d.Transform,
Geometry = meshGeometry,
CullMode = CullMode.Front
};
obCollection.Add(model);
谢谢你的建议。我检查了我的代码。我确实使用了
SynchronizationContext.Post
而不是Send
,这可能有点异步。然而,在使用Send
进行测试后,结果并没有得到任何改善。目前,我正在尝试使用HelixToolkit的WPF版本,而不是WPF.SharpDX版本。到目前为止,只出现了几处人脸正常误计算错误,整个场景看起来不错。但当模型变得更大时,我担心性能问题。我被告知SharpDX版本提供更好的性能,因此如果问题能够得到解决,这将是最好的。如果您可以创建一个示例项目来显示此问题,这将非常有用。您还可以尝试在helixtoolkit Sharpdx示例中运行文件加载演示,看看您的模型是否可以正确加载。在检查了大多数Viewport3DX
渲染开关后,我发现了一个名为EnableDeferredRendering
的开关,用于启用多线程渲染。但是,此函数会导致延迟(延迟?)渲染效果,不幸的是,这可能会创建场景中漂浮的所有“待渲染”巨大黑色对象。所以你可能对一些没有更新的东西是正确的。通过将其设置为False
,现在一切正常。但是,我相信我的程序将需要enabledferredrendering
函数提供的性能提升,因此我提出以下问题:如何确定场景是否已完成渲染?是否有我可以监控的相关状态?谢谢需要渲染多少个模型?通常,仅当场景有数千个绘制调用时,延迟渲染才有好处。