이 예제에서는 Viewport3D에서 3차원 시각적 표시를 적중 테스트하는 방법을 보여 줍니다.
HitTest에서 2차원 및 3차원 정보를 반환하기 때문에 3차원 결과만 읽는 테스트 결과를 반복할 수 있습니다.
Public Sub HitTest(ByVal sender As Object, ByVal args As MouseButtonEventArgs)
Dim mouseposition As Point = args.GetPosition(myViewport)
Dim testpoint3D As New Point3D(mouseposition.X, mouseposition.Y, 0)
Dim testdirection As New Vector3D(mouseposition.X, mouseposition.Y, 10)
Dim pointparams As New PointHitTestParameters(mouseposition)
Dim rayparams As New RayHitTestParameters(testpoint3D, testdirection)
'test for a result in the Viewport3D
VisualTreeHelper.HitTest(myViewport, Nothing, AddressOf HTResult, pointparams)
public void HitTest(object sender, System.Windows.Input.MouseButtonEventArgs args)
{
Point mouseposition = args.GetPosition(myViewport);
Point3D testpoint3D = new Point3D(mouseposition.X, mouseposition.Y, 0);
Vector3D testdirection = new Vector3D(mouseposition.X, mouseposition.Y, 10);
PointHitTestParameters pointparams = new PointHitTestParameters(mouseposition);
RayHitTestParameters rayparams = new RayHitTestParameters(testpoint3D, testdirection);
//test for a result in the Viewport3D
VisualTreeHelper.HitTest(myViewport, null, HTResult, pointparams);
다음 코드에서 HitTestResultBehavior는 적중 테스트 결과를 처리하는 방식을 결정합니다. UpdateResultInfo 및 UpdateMaterial은 로컬로 정의된 메서드입니다.
Public Function HTResult(ByVal rawresult As HitTestResult) As HitTestResultBehavior
Dim rayResult As RayHitTestResult = TryCast(rawresult, RayHitTestResult)
If rayResult IsNot Nothing Then
Dim rayMeshResult As RayMeshGeometry3DHitTestResult = TryCast(rayResult, RayMeshGeometry3DHitTestResult)
If rayMeshResult IsNot Nothing Then
Dim hitgeo As GeometryModel3D = TryCast(rayMeshResult.ModelHit, GeometryModel3D)
UpdateResultInfo(rayMeshResult)
UpdateMaterial(hitgeo, (TryCast(side1GeometryModel3D.Material, MaterialGroup)))
End If
End If
Return HitTestResultBehavior.Continue
End Function
public HitTestResultBehavior HTResult(System.Windows.Media.HitTestResult rawresult)
{
//MessageBox.Show(rawresult.ToString());
RayHitTestResult rayResult = rawresult as RayHitTestResult;
if (rayResult != null)
{
RayMeshGeometry3DHitTestResult rayMeshResult = rayResult as RayMeshGeometry3DHitTestResult;
if (rayMeshResult != null)
{
GeometryModel3D hitgeo = rayMeshResult.ModelHit as GeometryModel3D;
UpdateResultInfo(rayMeshResult);
UpdateMaterial(hitgeo, (side1GeometryModel3D.Material as MaterialGroup));
}
}
return HitTestResultBehavior.Continue;
}