我的应用程序包含驻留在Viewport3D中的3D对象,我希望用户能够通过在屏幕上拖动矩形来选择它们。
我尝试在Viewport3D上应用GeometryHitTestParameters(带有矩形几何体)以获得结果,但是我得到一个异常,告诉我它没有用于Viewport3D。只支持PointHitTestParameters。
有没有人知道任何优雅的方法,除了自己计算(例如 - 将所有3D对象投影到2D并用矩形做手动几何交叉)?
答案 0 :(得分: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);
}