第一的
正如你所拥有的,你可以在你的 xaml 代码中List<Object3D> objs
创建一个并绑定到它。Element3DCollection
XAML 代码(将此代码段放入您的 Viewport3DX)
创建一个GroupModel3D
并添加绑定它的属性
<hx:GroupModel3D
x:Name="Viewport3D"
ItemsSource="{Binding YourElement3DCollection}"
Transform="{Binding YourTransformToMousePosition}"/>
在您的 ViewModel 中的某处
Element3DCollection
用Object3D
s填充你的
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