0

我是 HelixToolkit.SharpDX 的新手,我有 2 个问题,也许有人可以帮助我:

首先:我想导入 obj 模型(带有纹理)并在 Viewport3DX 中显示它。如何正确执行?现在我有下一个:

ObjReader Reader = new HelixToolkit.Wpf.SharpDX.ObjReader();
List<Object3D> objs = Reader.Read(ModelPath);

读取 objs 变量后包含近 1000 个对象。在视口中显示模型的下一步是什么?

第二:还有一个问题:如何在 Viewport3DX 中接收光标位置。HelixViewport3D 中是否有像 CursorPosition 这样的属性?

先感谢您!

4

1 回答 1

2

第一的

正如你所拥有的,你可以在你的 xaml 代码中List<Object3D> objs创建一个并绑定到它。Element3DCollection

XAML 代码(将此代码段放入您的 Viewport3DX)

创建一个GroupModel3D并添加绑定它的属性

<hx:GroupModel3D 
    x:Name="Viewport3D"
    ItemsSource="{Binding YourElement3DCollection}"   
    Transform="{Binding YourTransformToMousePosition}"/>

在您的 ViewModel 中的某处

Element3DCollectionObject3Ds填充你的

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

于 2017-07-13T20:55:10.737 回答