在HelixToolkit.SharpDX中导入对象文件和光标位置
本文关键字:文件 光标 位置 对象 导入 HelixToolkit SharpDX | 更新日期: 2023-09-27 18:04:32
我是HelixToolkit的新手。我和SharpDX有两个问题,也许有人可以帮助我:
第一:我想导入对象模型(带有纹理)并在Viewport3DX中显示它。如何正确地做呢?下面是:
ObjReader Reader = new HelixToolkit.Wpf.SharpDX.ObjReader();
List<Object3D> objs = Reader.Read(ModelPath);
读取objs变量后包含近1000个对象。在视口中显示模型的下一步是什么?
秒:还有一个问题:如何在Viewport3DX中接收光标位置。在HelixViewport3D中是否有像CursorPosition这样的属性?
提前感谢!
First
当你有你的List<Object3D> objs
,你可以创建一个Element3DCollection
,并绑定到你的xaml代码。
XAML Code(将此代码片段放入Viewport3DX)
创建GroupModel3D
并绑定其属性
<hx:GroupModel3D
x:Name="Viewport3D"
ItemsSource="{Binding YourElement3DCollection}"
Transform="{Binding YourTransformToMousePosition}"/>
在你的ViewModel
用Object3D
s填充你的Element3DCollection
ObjReader Reader = new HelixToolkit.Wpf.SharpDX.ObjReader();
List<Object3D> objs = Reader.Read(ModelPath);
var ele3DCollection = new Element3DCollection();
foreach (var ob in objs)
{
var meshGeometry = new MeshGeometryModel3D
{
Geometry = ob.Geometry,
Material = ob.Material,
};
ele3DCollection.Add(meshGeometry);
// Run this line if you are using a render host
meshGeometry.Attach(Viewport3D.RenderHost);
}
// Now assign the ele3DCollection to the property you bound to and raise property changed
YourElement3DCollection = ele3DCollection;
其中YourElement3DCollection
的类型为Element3DCollection
。别忘了提高INotifyPropertyChanged
。
或者您可以绑定到代码后面的DependencyProperty
。然后在赋值之后调用InvalidateProperty(YourElement3DCollectionProperty)
。
第二
你可以从你的鼠标位置执行光线投射到场景中的一个对象(可能是一个与原点相交的xy平面)。然后使用这个点的坐标创建Transform3D
对象。
未测试代码(代码后面):
var yourRay = Viewport3D.UnProjectToRay(Mouse.GetPosition(Viewport3D));
var yourTargetPoint = yourRay.PlaneIntersection(new Point3D(0, 0, 0), new Vector3D(0, 0, 1));
// todo: check for null
var yourTranslation = new TranslateTransform3D(
yourTargetPoint.Value.X, yourTargetPoint.Value.Y, yourTargetPoint.Value.Z);
// assign the relation to your viewModel somehow
((YourViewModelType)DataContext).YourTransformToMousePosition = yourTranslation;
其中YourTransformToMousePosition
为Transform3D
类型