You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Helix Toolkit WPF DX:如何加载OBJ数组并动态修改变换?

替换点云为OBJ模型数组并动态修改变换的实现

1. 定义OBJ模型项的ViewModel

先创建一个ViewModel类,封装每个OBJ子模型的几何数据和变换,方便绑定与动态更新:

public class ObjItemViewModel : INotifyPropertyChanged
{
    private MeshGeometry3D _geometry;
    private Transform3D _transform;

    public MeshGeometry3D Geometry
    {
        get => _geometry;
        set
        {
            _geometry = value;
            OnPropertyChanged(nameof(Geometry));
        }
    }

    public Transform3D Transform
    {
        get => _transform;
        set
        {
            _transform = value;
            OnPropertyChanged(nameof(Transform));
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
    protected void OnPropertyChanged(string propertyName)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

2. 加载OBJ文件生成模型数组

在主ViewModel中添加ObservableCollection存储所有OBJ模型项,用Helix的ObjReader加载并拆分网格:

// 主ViewModel中的属性
public ObservableCollection<ObjItemViewModel> ObjModels { get; } = new ObservableCollection<ObjItemViewModel>();

// 加载OBJ的方法
private void LoadObjFile(string filePath)
{
    var reader = new ObjReader();
    var modelGroup = reader.Read(filePath) as Model3DGroup;

    if (modelGroup == null) return;

    ObjModels.Clear();
    foreach (var child in modelGroup.Children)
    {
        if (child is GeometryModel3D geoModel && geoModel.Geometry is MeshGeometry3D mesh)
        {
            // 为每个子网格创建模型项,初始变换设为单位变换
            ObjModels.Add(new ObjItemViewModel
            {
                Geometry = mesh,
                Transform = new TranslateTransform3D(0, 0, 0)
            });
        }
    }
}

3. 动态修改模型变换

在定时器更新事件中,遍历ObjModels集合,逐个修改模型的Transform属性(示例对应原有点云的位置映射):

public void ProcessingEventHandlerMap(object sender, DllFunctions.DenseTrackingFunctions.ProcessingEventArgsMap args)
{
    try
    {
        if (_Data.GotData == true && ObjModels.Count == _Dense._processingArgsMap.pointData.Count())
        {
            for (int j = 0; j < _Dense._processingArgsMap.pointData.Count(); j++)
            {
                var point = _Dense._processingArgsMap.pointData[j];
                // 更新对应模型的平移变换
                var translateTransform = new TranslateTransform3D(
                    (float)point.position[0] * 10,
                    (float)point.position[1] * 10,
                    (float)point.position[2] * 10);
                ObjModels[j].Transform = translateTransform;
            }
        }
    }
    catch (Exception e)
    {
        // 异常处理逻辑
    }
}

注意:若OBJ模型数量与点云数量不匹配,需根据业务逻辑调整(如重复复用模型、动态增删项)

4. 调整XAML代码

替换原PointGeometryModel3D为支持批量渲染的结构,用Helix的ModelVisual3D结合ItemsSource:

<hx:ModelVisual3D ItemsSource="{Binding ObjModels}">
    <hx:ModelVisual3D.ItemTemplate>
        <DataTemplate>
            <hx:MeshGeometryModel3D 
                Geometry="{Binding Geometry}"
                Transform="{Binding Transform}"
                Material="{hx:PhongMaterial DiffuseColor=#00FF1B}" />
        </DataTemplate>
    </hx:ModelVisual3D.ItemTemplate>
</hx:ModelVisual3D>

5. 初始化调用

在主ViewModel初始化时加载目标OBJ文件:

// 替换为你的OBJ文件路径
LoadObjFile(@"C:\YourModelPath\TargetModel.obj");

内容的提问来源于stack exchange,提问作者anti

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 15:12:41