在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这样的属性?

提前感谢!

在HelixToolkit.SharpDX中导入对象文件和光标位置

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;

其中YourTransformToMousePositionTransform3D类型