Как прикрутить MouseDown к ModelVisual3D?

245
05 сентября 2017, 08:07

Как прикрутить MouseDown к ModelVisual3D? Возможно ли это, не трогая ModelUIElement3D?

Answer 1

По идее, несложно.

Во-первых, в 2D-контейнер положите Background="Transparent" и подпишитесь на сообщения от мыши. В MouseDown вы получите двухмерные координаты точки, в которой у вас произошло событие. Вам нужно найти, какому трёхмерному объекту это соответствует, вы должны запустить hittest-процедуру (то есть, выяснить, в какой точке луч, направленный из этой точки, пересечёт ваши фигуры).

Для этого воспользуйтесь процедурой VisualTreeHelper.HitTest, которая «приведёт» вас к нужному трёхмерному элементу:

void OnMouseDown(object sender, MouseButtonEventArgs args)
{
    Point pos = args.GetPosition(Viewport);
    PointHitTestParameters pp = new PointHitTestParameters(mouseposition);
    VisualTreeHelper.HitTest(Viewport, null, OnHit, pointparams);
}

(имя Viewport соответствует, понятно, вашему Viewport3D). Если ваш начальный элемент лежит не в 2D-области (например, это Viewport3D), а в 3D-области, то вам понадобится использовать трёхмерные параметры, в которых задаётся не только начальная точка, но и направление:

RayHitTestParameters pp = new RayHitTestParameters(
        new Point3D(mousePoint.X, mousePoint.Y, 0), new Vector3D(0, 0, 1));

Процедура OnHit выглядит как-то так:

public HitTestResultBehavior OnHit(HitTestResult rawresult)
{
    if (rawresult is RayHitTestResult rayresult) // если это 3D-результат
    {
        // то мы попали в какой-то 3D-объект, и можем с ним работать
        var modelHit = rayresult.ModelHit;
        // обрабатываем
        return HitTestResultBehavior.Stop; // остановить поиск
    }
    return HitTestResultBehavior.Continue; // продолжить поиск
}

Литература:

  • Microsoft Docs, How to: Hit Test in a Viewport3D
  • WPF3D Team Blog, 3D Hit Testing
  • WPFSamples/HitTest3D/cs/ (тут пример приложения)
READ ALSO
Виджет на C#, или Windows Forms Always On Bottom

Виджет на C#, или Windows Forms Always On Bottom

Сделал приложение Windows Forms, хочу использовать его как виджет на рабочем столе, но не могу закрепить его так, чтобы оно находилось всегда сзади...

265
DllImport в зависимости от условия

DllImport в зависимости от условия

Нужно подгружать разные нативные либы в зависимости от значения некоторой функцииНо название dll, которое указывается в DllImport, const, т

298
visual studio не видит классы?

visual studio не видит классы?

Скачал с сайта код проекта и подключил как на картинке, но visual studio не хочет видеть классыЧто и как поправить?

270