2012-09-29 158 views
2

我做WPF中3D立方體與XAML代碼:旋轉3D立方體在WPF

<Viewport3D Name="viewport3D1"> 
      <Viewport3D.Camera> 
       <PerspectiveCamera x:Name="camMain" Position="6 5 4" LookDirection="-6 -5 -4"> 
       </PerspectiveCamera> 
      </Viewport3D.Camera> 
      <ModelVisual3D> 
       <ModelVisual3D.Content> 
        <DirectionalLight x:Name="dirLightMain" Direction="-1,-1,-1"> 
        </DirectionalLight> 
       </ModelVisual3D.Content> 
      </ModelVisual3D> 
      <ModelVisual3D> 
       <ModelVisual3D.Content> 
        <GeometryModel3D> 
         <GeometryModel3D.Geometry> 
          <MeshGeometry3D x:Name="meshMain" 
           Positions="0 0 0 1 0 0 0 1 0 1 1 0 0 0 1 1 0 1 0 1 1 1 1 1" 
           TriangleIndices="2 3 1 2 1 0 7 1 3 7 5 1 6 5 7 6 4 5 6 2 0 2 0 4 2 7 3 2 6 7 0 1 5 0 5 4"> 
          </MeshGeometry3D> 
         </GeometryModel3D.Geometry> 
         <GeometryModel3D.Material> 
          <DiffuseMaterial x:Name="matDiffuseMain"> 
           <DiffuseMaterial.Brush> 
            <SolidColorBrush Color="Red"/> 
           </DiffuseMaterial.Brush> 
          </DiffuseMaterial> 
         </GeometryModel3D.Material> 
        </GeometryModel3D> 
       </ModelVisual3D.Content> 
      </ModelVisual3D> 
     </Viewport3D> 

然後就是我的窗口的構造,我想申請圍繞軸OX,OY,OZ旋轉我認爲是應該這樣做:

RotateTransform3D myRotateTransform = new RotateTransform3D(new AxisAngleRotation3D(new Vector3D(0, 2, 0), 1)); 
     meshMain.Transform=myRotateTransform; 
     // etc... 

我似乎不適用轉換爲XAML的適當節點,它以正確的方式來影響我的情況下變換?

回答

7

您需要爲您的ModelVisual3D命名,MeshGeometry3D沒有Transform屬性,如模型所示。您還需要訪問您的AxisAngleRotation3D對象以設置Angle屬性。

<ModelVisual3D x:Name="MyModel"> 
.... 

編輯增加了更多的代碼,代碼隱藏方法

public partial class MainWindow : Window 
{ 
    AxisAngleRotation3D ax3d; 
    public MainWindow() 
    { 
     InitializeComponent(); 

     ax3d = new AxisAngleRotation3D(new Vector3D(0, 2, 0), 1); 
     RotateTransform3D myRotateTransform = new RotateTransform3D(ax3d); 
     MyModel.Transform = myRotateTransform; 
    } 

    private void button1_Click(object sender, RoutedEventArgs e) 
    { 
     ax3d.Angle += 1 ; 
    } 
} 

雖然在這種情況下,我想你會過得更好實現你變換在XAML。

<Window x:Class="WpfApplication1.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="MainWindow" Height="350" Width="525"> 
    <Grid> 
     <Viewport3D Name="viewport3D1"> 
      <Viewport3D.Camera> 
       <PerspectiveCamera x:Name="camMain" Position="6 5 4" LookDirection="-6 -5 -4"> 
       </PerspectiveCamera> 
      </Viewport3D.Camera> 
      <ModelVisual3D> 
       <ModelVisual3D.Content> 
        <DirectionalLight x:Name="dirLightMain" Direction="-1,-1,-1"> 
        </DirectionalLight> 
       </ModelVisual3D.Content> 
      </ModelVisual3D> 
      <ModelVisual3D x:Name="MyModel"> 
       <ModelVisual3D.Content> 
        <GeometryModel3D> 
         <GeometryModel3D.Geometry> 
          <MeshGeometry3D x:Name="meshMain" 
           Positions="0 0 0 1 0 0 0 1 0 1 1 0 0 0 1 1 0 1 0 1 1 1 1 1" 
           TriangleIndices="2 3 1 2 1 0 7 1 3 7 5 1 6 5 7 6 4 5 6 2 0 2 0 4 2 7 3 2 6 7 0 1 5 0 5 4"> 
          </MeshGeometry3D> 
         </GeometryModel3D.Geometry> 
         <GeometryModel3D.Material> 
          <DiffuseMaterial x:Name="matDiffuseMain"> 
           <DiffuseMaterial.Brush> 
            <SolidColorBrush Color="Red"/> 
           </DiffuseMaterial.Brush> 
          </DiffuseMaterial> 
         </GeometryModel3D.Material> 
        </GeometryModel3D> 
       </ModelVisual3D.Content> 
       <ModelVisual3D.Transform> 
        <RotateTransform3D> 
         <RotateTransform3D.Rotation> 
          <AxisAngleRotation3D x:Name="rotate" Axis="0 2 0"/> 
         </RotateTransform3D.Rotation> 
        </RotateTransform3D> 
       </ModelVisual3D.Transform> 
      </ModelVisual3D> 
     </Viewport3D> 
     <Slider Height="23" HorizontalAlignment="Left" 
       Margin="12,12,0,0" Name="slider1" 
       VerticalAlignment="Top" Width="187" 
       Maximum="360" 
       Value="{Binding ElementName=rotate, Path=Angle}" /> 

    </Grid> 
</Window> 

而且這個例子中,你可以通過設置其角度屬性更改代碼隱藏你的AxisAngleRotation3D:

rotate.Angle +=1; 
+0

你知道我們如何可以旋轉與定位在該中心的中心點立方體立方體?即使該立方體之前被旋轉並轉換了數次。 –