2011-11-10 6 views
0

キューブをクリックして移動し、マウスを追跡しようとしています。ModelVisual3Dオブジェクトを移動しようとするとnullに変換されます

<custom:TrackballDecorator x:Name="trackballDecorator"   Grid.Column="1"MouseLeftButtonDown="OnMouseLeftButtonDown" 
MouseMove="OnMouseMove" 
MouseWheel="OnMouseWheel" 
MouseLeftButtonUp="OnMouseLeftButtonUp" 
PreviewTextInput="OnPreviewTextInput" 
LostMouseCapture="OnLostMouseCapture" 
Width="600" Height="600"> 

<custom:Interactive3DDecorator Grid.Column="1"> 

/// viewport etc... 
:私はイベントを保持している私のビューポートの周りTrackballDecoratorを、持っている

App.xaml

<MeshGeometry3D x:Key="solidCube" 
Positions="2, 2, 2 -2, 2, 2 -2, -2, 2 2, -2, 2 2, 2, -2 -2, 2, -2 -2, -2, -2 2, -2, -2" 
TriangleIndices="0,1,2 2,3,0 3,4,0 7,4,3 5,4,7 7,6,5 1,5,6 6,2,1 2,6,7 7,3,2 1,0,4 4,5,1"/> 

MainWindow.xaml

<ModelVisual3D.Content> 
    <GeometryModel3D x:Name="solidCubeGeometryModel3D" Geometry="{StaticResource solidCube}"> 
      <GeometryModel3D.Material> 
        <DiffuseMaterial> 
          <DiffuseMaterial.Brush> 
            <SolidColorBrush Color="Red" Opacity="1.0"/> 
          </DiffuseMaterial.Brush> 
        </DiffuseMaterial> 
      </GeometryModel3D.Material> 
      <GeometryModel3D.Transform> 
       <TranslateTransform3D x:Name="myTranslateTransform3D" OffsetX="0" OffsetY="0" OffsetZ="0" /> 
      </GeometryModel3D.Transform> 
    </GeometryModel3D> 
</ModelVisual3D.Content> 

:私のキューブは、このように実装されています

そして私の最初のイベント、OnMouseLeftButtonDownは、私がhttp://www.charlespetzold.com/3D/から取ったものです。マウスT

protected void OnMouseLeftButtonDown(object sender, MouseButtonEventArgs args) 
     { 
     base.OnMouseLeftButtonDown(args); 

     Point ptMouse = args.GetPosition(myViewport); 
     HitTestResult result = VisualTreeHelper.HitTest(myViewport, ptMouse); 

     // We're only interested in 3D hits. 
     RayMeshGeometry3DHitTestResult result3d = 
          result as RayMeshGeometry3DHitTestResult; 
     if (result3d == null) 
      return; 

     // We're only interested in ModelVisual3D hits. 
     ModelVisual3D vis3d = result3d.VisualHit as ModelVisual3D; 
     if (vis3d == null) 
      return; 

     // We're only interested in visuals with translate transforms. 
     transTracking = vis3d.Transform as TranslateTransform3D; //NULL !!!!!!!!!!! 
     if (transTracking == null) 
      return; 

     LineRange range; 
     ViewportInfo.Point2DtoPoint3D(myViewport, ptMouse, out range); 
     pointOriginal = range.PointFromZ(transTracking.OffsetZ); 
     transOriginal = transTracking.Clone(); 
     isTracking = true; 
     CaptureMouse(); 
     Focus(); 

     args.Handled = true; 
    } 

私はそれを更新し、上書きを取り除き、オブジェクト送信者をパラメータに入れました。 ModelVisual3D Transformがnullになっていて、何が欠けているのかはっきりしていますか?

+0

'vis3d.Transform'は何に設定されていますか?それが問題ではない場合、それがチェックされていれば、実際には 'TranslateTransform3D'です。それが他のものなら、 'as'変換は有効でなく、' null'を返します。 – ChrisF

+0

Humm ...はい、それは '{System.Windows.Media.Media3D.MatrixTransform3D}'に設定されています。別の方法でキャストする必要がありますか? –

答えて

0

が何かにvis3d.TransformセットですD:あなたは私を助けるために任意のより多くの情報が必要な場合

事前のおかげで、ちょうど頼みますか?

これは問題ではないが、それが実際にはTranslateTransform3Dであることが確認されている場合は問題です。それ以外の場合は、as変換は有効ではなく、nullを返します。

実際にはMatrixTransform3Dで、これは一般的なマトリックス変換です。行を次のように変更してください。

transTracking = vis3d.Transform as MatrixTransform3D; 

これはうまくいくはずです。

+0

MatrixTransformで変換変換を行うことはできますか?私は自分のオブジェクトのサイズを変更できると思った。しかし私は試してみる。 –

+0

@PedroDusso - MatrixTransformには、一般的な変換行列が格納されています。これは、スケール、回転、平行移動、または3つの任意の組み合わせです。 – ChrisF

+0

助けてくれてありがとう。私のアプローチは、ModelVisual3D.TransformのTransformを変更することでした。しかし、それは動作し続けない。私は私のコードをサンプルごとに追加し始め、TrackballDecoratorとInteractive3DDecoratorが動きを動作させないことを発見します。彼らは以前にイベントを開催しているかどうかを調べるつもりです。 –

関連する問題