2010-01-11 50 views
4

假設我有一個簡單的WPF 3D場景設置了一個矩形旋轉繞X軸,像這樣-45度:WPF 3D - 繞其自身的軸線模型

<Viewport3D> 
    <Viewport3D.Camera> 
     <PerspectiveCamera Position="0,0,4"/> 
    </Viewport3D.Camera> 
    <ModelVisual3D> 
     <ModelVisual3D.Content> 
      <DirectionalLight Color="White" Direction="-1,-1,-3" /> 
     </ModelVisual3D.Content> 
    </ModelVisual3D> 
    <ModelVisual3D> 
     <ModelVisual3D.Content> 
      <GeometryModel3D> 
       <GeometryModel3D.Geometry> 
        <MeshGeometry3D Positions="-1,-1,0 1,-1,0 -1,1,0 1,1,0" 
            TriangleIndices="0,1,2 1,3,2"/> 
       </GeometryModel3D.Geometry> 
       <GeometryModel3D.Material> 
        <DiffuseMaterial Brush="Red"/> 
       </GeometryModel3D.Material> 
      </GeometryModel3D> 
     </ModelVisual3D.Content> 
     <ModelVisual3D.Transform> 
      <Transform3DGroup> 
       <RotateTransform3D> 
        <RotateTransform3D.Rotation> 
         <AxisAngleRotation3D Axis="1,0,0" Angle="-45"/> 
        </RotateTransform3D.Rotation> 
       </RotateTransform3D> 
      </Transform3DGroup> 
     </ModelVisual3D.Transform> 
    </ModelVisual3D> 
</Viewport3D> 

這給了我以下:

alt text http://www.freeimagehosting.net/uploads/4aa48434a9.png

現在我想軸繞模型Z的圖像45度。如果我只是把第二RotateTransform3D在像這樣:

   <RotateTransform3D> 
        <RotateTransform3D.Rotation> 
         <AxisAngleRotation3D Axis="0,0,1" Angle="45"/> 
        </RotateTransform3D.Rotation> 
       </RotateTransform3D> 

它周圍的場景的 Z軸旋轉。對於這個特殊的X旋轉我已經制定出我需要的是:

   <RotateTransform3D> 
        <RotateTransform3D.Rotation> 
         <AxisAngleRotation3D Axis="0,1,1" Angle="45"/> 
        </RotateTransform3D.Rotation> 
       </RotateTransform3D> 

但是在這裏我的數學失敗了。任何人都可以告訴我如何解決任意X(和Y如果你想)旋轉?

+0

什麼任意X和Y?這些角度,點,其他? – 2010-01-11 22:00:22

+0

對不起,X和Y旋轉的任意角度。 – Grokys 2010-01-12 08:07:31

回答

10

好,說話的數學家朋友,他給我的回答:

,所以我認爲你需要,如果 你周圍由矢量 (1,0,0)旋轉做什麼角度爲'a'(即圍繞x軸旋轉 ,以便在yz平面中轉換對象)。

進一步旋轉大約在

x' - (1,0,0)保持不變!

Y ' - (0,COSA,新浪)

Z' - (0,-sina,COSA)

類似的原理將保持在xz平面 旋轉(0,1, 0)

X ' - (-sina,0,COSA)

Y' - (0,1,0) - 相同的

Z」 - (新浪,鄰,COSA)

和在xy平面中圍繞(0,0,1)

X ' - (-sina,COSA,0)

Y' - (COSA,新浪,0)

Z」 - (0,0,1)保持不變

TADA!

更新:我創建了一個函數來計算一個矩陣,它將旋轉所有3個軸上的對象。這可以與MatrixTransform3D一起使用。

Matrix3D CalculateRotationMatrix(double x, double y, double z) 
    { 
     Matrix3D matrix = new Matrix3D(); 

     matrix.Rotate(new Quaternion(new Vector3D(1, 0, 0), x)); 
     matrix.Rotate(new Quaternion(new Vector3D(0, 1, 0) * matrix, y)); 
     matrix.Rotate(new Quaternion(new Vector3D(0, 0, 1) * matrix, z)); 

     return matrix; 
    } 
+0

+1功能幫助我無止境。 – Sidebp 2011-06-08 18:27:38