2013-01-21 222 views
2

我需要旋轉在WPF單個座標 - C#。旋轉3D座標

x, y,z存儲在GeometryModel3D[]點。

例如,座標(x,y,z)在spefic-axis處旋轉。

[UPDATE]使用旋轉變換的四元數。問題是我沒有得到新的矢量值,當我查看點雲時,它似乎在Meshlab中被拖走。

Matrix3D m = Matrix3D.Identity; 
Quaternion q = new Quaternion(new Vector3D(320/2, y, maxDepth - minDepth), 90); 
m.Rotate(q); 
Vector3D myVectorToRotate = new Vector3D(((TranslateTransform3D)points[i].Transform).OffsetX,      ((TranslateTransform3D)points[i].Transform).OffsetY,  ((TranslateTransform3D)points[i].Transform).OffsetZ); 

m.Transform(myVectorToRotate); 
pointcloud.Add(new Point3D(myVectorToRotate.X,myVectorToRotate.Y,myVectorToRotate.Z)); 

我仍然無法獲得正確的價值轉換。

我想對從kinect掃描的第二個點雲應用旋轉變換。由於第一次掃描數據不涉及旋轉,捕獲數據和用法的代碼如下所示:

for (int y = 0; y < 240; y += resolution) 
{ 
    for (int x = 0; x < 320; x += resolution) 
    { 
     if (((TranslateTransform3D)points[i].Transform).OffsetZ >= minDepth 
       && ((TranslateTransform3D)points[i].Transform).OffsetZ <= maxDepth) 
     { 
      pointcloud.Add(new Point3D(((TranslateTransform3D)points[i].Transform).OffsetX,              ((TranslateTransform3D)points[i].Transform).OffsetY,            ((TranslateTransform3D)points[i].Transform).OffsetZ)); 
     } 
     i++; 
    } 
} 
+0

的例子是由繞y軸旋轉90度的一個點? – sinelaw

+0

是的,但我的代碼顯示似乎錯了,因爲我不知道如何設置的矩陣.. – akuhero

+0

[鏈接]的Matrix3D結構(http://msdn.microsoft.com/en-us/library/system.windows.media .media3d.matrix3d(v = vs.90).aspx) – akuhero

回答

2

創建任何類型的矩陣。例如一個rotation matrix,然後使用靜態方法Vector.Multiply(...) 另請參閱this postMSDN general transformation概述。爲的Vector3D

實例:

  1. 3D transformation WPF
  2. Rotate a vector by quaternion

    Vector3D v = new Vector3D(1.0, -1.0, 2.0); 
    ... 
    AxisAngleRotation3D axisAngle = new AxisAngleRotation3D(axis, angle); 
    RotateTransform3D myRotateTransform = new RotateTransform3D(axisAngle, centerVector); 
    v.Multiply(myRotateTransform); 
    
+0

對不起,我還是不明白如何使用旋轉矩陣來實現旋轉。希望你可以通過簡單的代碼:)。 – akuhero

+0

@akuhero,你看由馬蒂亞斯給出的計算器鏈接?有一個簡單的代碼示例那邊 – sinelaw

+0

@sinelaw,我沒看,但如何應用到3D矢量? – akuhero