WPF 3D矩形命中测试

5
我有一个应用程序,其中包含在Viewport3D中的3D对象,我希望用户能够通过在屏幕上拖动矩形来选择它们。
我尝试在Viewport3D上应用GeometryHitTestParameters(使用矩形几何图形),以便获得结果,但是我收到一个异常,告诉我它不支持Viewport3D。只支持PointHitTestParameters。
除了自己计算(例如-将所有3D对象投影到2D并手动几何相交与矩形),是否有任何优雅的方法来实现它?

你尝试过这个链接中的方法吗?http://blogs.msdn.com/b/wpf3d/archive/2009/05/18/3d-hit-testing.aspx - Fredrik Hedblad
当然。这是点/射线命中测试的已知方法。我正在寻找矩形命中测试。它不是框架的集成部分,但也许有人知道我如何使用框架来优雅地完成我的任务。无论如何,GeometryHitTestParameters在Viewport3D上不起作用。因此,我不能将其用于我的矩形命中测试。 - Alex Shtof
1个回答

0

我怀疑没有比遍历所选矩形点更好的方法:

    private void view_PreviewMouseDown(object sender, MouseButtonEventArgs e) {
        const double offset = 3.0; // I will test in a square 7x7
        var mouse = e.GetPosition(this);
        var items = new HashSet<Model3D>();
        for (double x = mouse.X - offset; x <= mouse.X + offset; x++)
            for (double y = mouse.Y - offset; y <= mouse.Y + offset; y++) {
                PointHitTestParameters pointparams = new PointHitTestParameters(new Point(x, y));
                Model3D result = null;
                VisualTreeHelper.HitTest(view, null, rawresult => {
                    var rayResult = rawresult as RayMeshGeometry3DHitTestResult;
                    if (rayResult != null)
                        items.Add(rayResult.ModelHit);
                    return HitTestResultBehavior.Continue;
                }, pointparams);
            }
        // temporary ListBox to show items
        list.ItemsSource = items.Select(item => item as GeometryModel3D == null ? null : (item as GeometryModel3D).Material as object);
    }

请参阅MSDN 如何:在 Viewport3D 中进行命中测试


1
当然有。例如,使用相机参数手动计算视锥体,然后手动遍历可视树并执行模型对视锥体包含测试。可以使用边界框实现高速。但这是重复造轮子。他们已经在WPF中使用基于射线的命中测试来完成此操作。唯一的区别是交点测试是射线模型而不是视锥体模型。我无法在网络上找到适用于此场景的工作代码,我想这里有人知道我可以找到有效的代码。 - Alex Shtof

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接