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

在C# Helix Toolkit中实现鼠标移动时无重绘高亮指定网格线段

在Helix Toolkit中无重绘高亮指定网格线段的实现方案

核心方案:直接修改线段顶点的颜色属性

Helix Toolkit基于WPF 3D体系,只要网格处于非冻结状态,就能直接修改目标线段对应顶点的颜色,这种操作仅更新局部顶点的渲染状态,不会触发整个网格的重绘,完美解决卡顿问题。

具体实现步骤

  1. 预处理网格,确保可修改
    加载模型后,先检查网格是否处于冻结状态(默认加载的模型往往是冻结的,无法修改),克隆出可修改的副本并替换原模型的几何数据:

    var mesh = yourModel.Geometry as MeshGeometry3D;
    if (mesh.IsFrozen)
    {
        mesh = mesh.Clone();
        yourModel.Geometry = mesh;
    }
    // 初始化顶点颜色集合(若原网格无顶点颜色)
    if (mesh.Colors == null || mesh.Colors.Count != mesh.Positions.Count)
    {
        mesh.Colors = new ColorCollection();
        var originalColor = Colors.Gray; // 替换为模型原始颜色
        for (int i = 0; i < mesh.Positions.Count; i++)
        {
            mesh.Colors.Add(originalColor);
        }
    }
    // 提前整理所有线段的顶点索引对(去重,避免重复计算)
    var lineVertexPairs = new HashSet<Tuple<int, int>>();
    for (int i = 0; i < mesh.TriangleIndices.Count; i += 3)
    {
        int v1 = mesh.TriangleIndices[i];
        int v2 = mesh.TriangleIndices[i+1];
        int v3 = mesh.TriangleIndices[i+2];
        // 添加线段并确保顺序一致,避免重复
        lineVertexPairs.Add(Tuple.Create(Math.Min(v1, v2), Math.Max(v1, v2)));
        lineVertexPairs.Add(Tuple.Create(Math.Min(v2, v3), Math.Max(v2, v3)));
        lineVertexPairs.Add(Tuple.Create(Math.Min(v1, v3), Math.Max(v1, v3)));
    }
    

    同时提前保存所有顶点的初始颜色到originalColors数组,用于后续重置。

  2. 鼠标交互时更新高亮
    当定位到目标线段后,直接修改对应两个顶点的颜色,同时重置上一次高亮的顶点颜色:

    // lastHighlightedPair存储上一次高亮的线段顶点对
    // targetPair是当前定位到的目标线段顶点对
    if (lastHighlightedPair != null)
    {
        // 重置为原始颜色
        mesh.Colors[lastHighlightedPair.Item1] = originalColors[lastHighlightedPair.Item1];
        mesh.Colors[lastHighlightedPair.Item2] = originalColors[lastHighlightedPair.Item2];
    }
    // 设置当前线段顶点为高亮色
    mesh.Colors[targetPair.Item1] = Colors.Yellow;
    mesh.Colors[targetPair.Item2] = Colors.Yellow;
    // 更新记录
    lastHighlightedPair = targetPair;
    
  3. 配置材质支持顶点颜色
    确保模型使用支持顶点颜色渲染的材质,可直接使用Helix内置的顶点颜色材质:

    yourModel.Material = MaterialHelper.CreateVertexColorMaterial();
    

替代方案:屏幕空间Adorner高亮

如果修改顶点颜色不符合需求,可在WPF的Adorner层绘制屏幕空间的高亮线,完全独立于3D模型渲染,不会触发网格重绘:

  1. 将3D线段的两个顶点转换为屏幕坐标:
    var screenPoint1 = viewport3D.Point3DToScreen(mesh.Positions[targetPair.Item1]);
    var screenPoint2 = viewport3D.Point3DToScreen(mesh.Positions[targetPair.Item2]);
    
  2. 自定义Adorner,在对应屏幕位置绘制半透明高亮线,这种方式无需修改3D模型,仅在UI层叠加渲染。

关键注意事项

  • 绝对避免调用viewport3D.InvalidateVisual()或强制刷新视图,这会触发全量重绘导致卡顿。
  • 预处理线段顶点对时务必去重,否则同一条线段会被多次记录,增加不必要的计算。
  • 若模型网格较大,建议只在鼠标移动时更新高亮,避免频繁操作顶点数组。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 08:43:41