Как прикрутить MouseDown к ModelVisual3D? Возможно ли это, не трогая ModelUIElement3D?
По идее, несложно.
Во-первых, в 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; // продолжить поиск
}
Литература:
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Виртуальный выделенный сервер (VDS) становится отличным выбором
Сделал приложение Windows Forms, хочу использовать его как виджет на рабочем столе, но не могу закрепить его так, чтобы оно находилось всегда сзади...
На данный вопрос уже ответили:
Нужно подгружать разные нативные либы в зависимости от значения некоторой функцииНо название dll, которое указывается в DllImport, const, т
Скачал с сайта код проекта и подключил как на картинке, но visual studio не хочет видеть классыЧто и как поправить?