2009-10-20 43 views
3

我在WPF中定義了一個非常簡單的3D空間,它定義了一個3D矩形,我希望能夠操作MeshGeometry3D中的每個Point3D對象(在「位置」)屬性,但是Im遇到了麻煩它...WPF和3D如何在3D空間中更改單個位置點?

這是我的XAML:

<Grid> 
    <Viewport3D Name="ViewPort" 
       Focusable="true" 
       ClipToBounds="true" 
       Width="{Binding Width, ElementName=canvas, Mode=Default}" 
       Height="{Binding Height, ElementName=canvas, Mode=Default}"> 
     <Viewport3D.Camera> 
     <PerspectiveCamera Position="0,0,5"/> 
    </Viewport3D.Camera> 
     <ModelVisual3D> 
      <ModelVisual3D.Content> 
       <Model3DGroup> 
        <PointLight Color="White" Position="0,0,0"> 
         <PointLight.Transform> 
          <Transform3DGroup> 
           <TranslateTransform3D OffsetX="0" OffsetY="0" OffsetZ="0"/> 
           <ScaleTransform3D ScaleX="1" ScaleY="1" ScaleZ="1"/> 
           <RotateTransform3D d:EulerAngles="0,0,0"> 
            <RotateTransform3D.Rotation> 
             <AxisAngleRotation3D Angle="0" Axis="0,1,0"/> 
            </RotateTransform3D.Rotation> 
           </RotateTransform3D> 
           <TranslateTransform3D OffsetX="0" OffsetY="0" OffsetZ="2"/> 
          </Transform3DGroup> 
         </PointLight.Transform> 
        </PointLight> 

        <GeometryModel3D x:Name="model1" Material="{DynamicResource test1}"> 
         <GeometryModel3D.Transform> 
          <Transform3DGroup> 
           <RotateTransform3D> 
            <RotateTransform3D.Rotation> 
             <AxisAngleRotation3D Axis="1,0,0" Angle="5" /> 
            </RotateTransform3D.Rotation> 
           </RotateTransform3D> 
           <RotateTransform3D> 
            <RotateTransform3D.Rotation> 
             <AxisAngleRotation3D Axis="0,1,0" Angle="-5" /> 
            </RotateTransform3D.Rotation> 
           </RotateTransform3D> 
          </Transform3DGroup> 
         </GeometryModel3D.Transform> 
         <GeometryModel3D.Geometry> 
          <MeshGeometry3D 
      Positions=" -0.5, 0.5, 0.0 
              -0.5, -0.5, 0.0 
              1.5, -0.5, 0.0 
              1.5, 0.5, 0.0" 
      TextureCoordinates="0,0 0,1 1,1 1,0" 
      TriangleIndices="0 1 2 2 3 0" /> 
         </GeometryModel3D.Geometry> 
        </GeometryModel3D> 
       </Model3DGroup> 
      </ModelVisual3D.Content> 
     </ModelVisual3D> 
    </Viewport3D> 
    <Canvas Background="Transparent" Grid.Column="0" Grid.Row="0" x:Name="canvas" s:Contacts.ContactDown="canvas_ContactDown" Width="{Binding Width, ElementName=window, Mode=Default}" Height="{Binding Height, ElementName=window, Mode=Default}"> 
    </Canvas> 
</Grid> 

其中test1的只是包裹在一個可視化筆刷的圖像。

這裏是我的C#:

private void canvas_ContactDown(object sender, ContactEventArgs e) 
    { 
     //Point contactPosition = e.GetPosition(this); 
     //var rayMeshResult = (RayMeshGeometry3DHitTestResult)VisualTreeHelper.HitTest(ViewPort, e.GetPosition(ViewPort)); 
     translatedX -= 0.25; 
     translatedY -= 0.25; 
     model1.Transform = new TranslateTransform3D(translatedX, translatedY, 0.0); 
     //model1.Transform.Transform(new Point3D(translatedX, translatedY, 0.0)); 

     Console.WriteLine("Changed"); 
     //Apply Z index changes here... 
     var geometry3D = model1.Geometry as MeshGeometry3D; 
     Point3DCollection positions = geometry3D.Positions; 

     foreach (var position in positions) 
     { 
      position.Offset(0,0,-15); 
     } 
    } 

但什麼也沒有發生,在視覺畫面...

有一件事我要特別提到的是,我不想轉換應用到整個對象,一次只有一個點。

但是如果那是唯一的出路,然後我想生病不得不考慮它的任何幫助,您可以給

感謝。

馬克

+0

你發佈一個更完整的樣本?我想知道你的XAML是否「model1」沒有被凍結,但如果是這種情況,我希望拋出一個異常,而不是什麼都沒有發生。 – 2009-10-20 02:53:36

+0

現在肯定生病了...... – Mark 2009-10-20 03:02:01

+0

我現在已經得到了完整的代碼:) – Mark 2009-10-20 03:06:24

回答

2

好吧我知道了,那是因爲geometry3D.Positions返回三維點對象,這是結構的集合,所以當你引用它們,你不改變,你認爲你正在改變之一。 ..

所以循環更喜歡這樣做的伎倆:

 for (var i = 0; i < positions.Count; i++) 
     { 
      Point3D position = positions[i]; 
      position.Z += 5; 
      positions[i] = position; 
     }