2009-10-20 4 views
3

У меня есть ОЧЕНЬ простое трехмерное пространство, определенное в WPF, которое определяет 3D-прямоугольник, я надеялся, что смогу манипулировать каждым из объектов Point3D (в свойстве «Позиции») на MeshGeometry3D, но 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» не замораживается, но если бы это было так, я бы ожидал, что исключение будет выброшено, а не ничего. –

+0

Несомненно, не понимаю, что сейчас ... – Mark

+0

Ive получил полный код сейчас :) – Mark

ответ

2

Ok я получил, это было потому, что geometry3D.Positions возвращает коллекцию объектов Point3d, которые являются структурами, поэтому, когда вы ссылаться на них, вы не изменяете тот, который вы думаете, что меняется. ..

Так петля больше, как это делает трюк:

 for (var i = 0; i < positions.Count; i++) 
     { 
      Point3D position = positions[i]; 
      position.Z += 5; 
      positions[i] = position; 
     } 
Смежные вопросы