2009-10-20 122 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; 
     }