2011-11-10 23 views
0

我正試圖移動一個立方體,並單擊它並跟蹤鼠標。我的立方體實現這樣的:ModelVisual3D嘗試移動對象時轉換爲空

的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> 

我有一個TrackballDecorator在我的視區,其持有的事件:

<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... 

而我的第一個活動,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變換爲空是否有一些非常明顯的缺失?提前

謝謝,如果您需要任何更多的信息,幫助我,就問:d

+0

'vis3d.Transform'設置爲任何內容?如果不是這個問題,但是如果它是檢查它實際上是'TranslateTransform3D'。如果是別的東西,那麼'as'轉換將無效,並返回'null'。 – ChrisF

+0

Humm ...是的,它設置爲「{System.Windows.Media.Media3D.MatrixTransform3D}」,也許我應該以其他方式投射? –

回答

0

vis3d.Transform設置什麼嗎?

如果不是這樣的問題,但是如果它是檢查它實際上是TranslateTransform3D。如果是其他內容,那麼as轉換將無效並將返回null

你說過它實際上是一個MatrixTransform3D這是一個普通的矩陣變換。更改您的線路:

transTracking = vis3d.Transform as MatrixTransform3D; 

它應該工作。

+0

我可以使用MatrixTransform進行平移轉換嗎?我以爲我可以調整我的目標;但是我會努力的。 –

+0

@PedroDusso - MatrixTransform包含一個通用轉換矩陣 - 這可以是任何東西 - 縮放,旋轉,平移或三者的任意組合。 – ChrisF

+0

感謝您的幫助。我的方法是改變ModelVisual3D.Transform的Transform。但它不工作。我開始將我的代碼逐一添加到我的示例中,並發現TrackballDecorator和Interactive3DDecorator使該運動失效。我要檢查他們是否在舉辦活動。 –