Тест попадания прямоугольника wpf3d - PullRequest
5 голосов
/ 13 декабря 2010

У меня есть приложение с трехмерными объектами, которые находятся во Viewport3D, и я хочу, чтобы пользователь мог выбирать их, перетаскивая прямоугольник на экране.

Я попытался применить GeometryHitTestParameters (с геометрией прямоугольника) к Viewport3D, чтобы получить результаты, но я получил исключение, сообщающее, что он не поддерживается с Viewport3D. Поддерживаются только PointHitTestParameters.

Кто-нибудь знает какой-нибудь элегантный способ сделать это, кроме как рассчитать его самостоятельно (например, проецировать все трехмерные объекты в 2D и выполнять пересечения геометрии вручную с прямоугольником)?

1 Ответ

0 голосов
/ 19 декабря 2010

Я сомневаюсь, что есть лучший способ, чем перебирать выбранные точки прямоугольника:

    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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...