3D Hittesting/Trackball
THIS IS NOT THE ENTIRE SOURCE, ONLY KEY SNIPPETS.
<Window MouseRightButtonDown="OnMouseRightButtonDown" …>
public void OnMouseRightButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs args)
{
Point mouseposition = args.GetPosition(vp);
PointHitTestParameters pointparams = new
PointHitTestParameters(mouseposition);
//test for a result in the Viewport3D
VisualTreeHelper.HitTest(vp, null, HTResult, pointparams);
}
public HitTestResultBehavior HTResult(System.Windows.Media.HitTestResult rawresult)
{
RayHitTestResult rayResult = rawresult as RayHitTestResult;
if (rayResult != null)
{
RayMeshGeometry3DHitTestResult rayMeshResult = rayResult as RayMeshGeometry3DHitTestResult;
if (rayMeshResult != null)
{
GeometryModel3D hitgeo = rayMeshResult.ModelHit as
GeometryModel3D;
UpdateMaterial(hitgeo);
}
}
return HitTestResultBehavior.Continue;
}
public void UpdateMaterial(GeometryModel3D gm3d)
{
VisualBrush VB = new VisualBrush();
if (material1)
{
material1 = false;
VB.Visual = UI2Contents;
}
else
{
material1 = true;
VB.Visual = UI1Contents;
}
DiffuseMaterial myDiffuseMaterial = new DiffuseMaterial(VB);
MaterialGroup mg = new MaterialGroup();
mg.Children.Add(myDiffuseMaterial);
gm3d.Material = mg;
}