2009-10-20 7 views
3

J'ai un espace 3D TRES simple défini dans WPF, qui définit un rectangle 3D, j'espérais pouvoir manipuler chacun des objets Point3D (dans la "Positions") sur le MeshGeometry3D, mais j'ai des problèmes avec il ...WPF et 3D comment changer un point de position unique dans l'espace 3D?

Voici mon 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> 

où test1 est juste une image enveloppée dans une brosse visuelle.

Et voici mon 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); 
     } 
    } 

Mais rien ne se passe dans l'écran visuel ...

Une chose que je veux mentionner spécifiquement est que je ne veux pas appliquer une transformation à la objet entier, juste un point à la fois.

Mais si c'est la seule façon alors je suppose que Ill faut regarder dans ce

Merci pour toute aide que vous pouvez donner.

Mark

+0

Est-ce que vous envoyer un échantillon plus complet? Je me demande en fonction de votre XAML si "model1" n'est pas gelé, mais si c'était le cas je m'attendrais à ce qu'une exception soit levée, plutôt que rien ne se passe. –

+0

Bien sûr que je vais le faire maintenant ... – Mark

+0

J'ai le code complet maintenant :) – Mark

Répondre

2

Ok je l'ai eu, c'était parce que geometry3D.Positions retourne une collection d'objets Point3D, qui sont struct, donc quand vous les faites référence, vous ne changez pas celui que vous pensez que vous changez. ..

donc une boucle plus comme ça fait l'affaire:

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