2015-11-05 237 views
1

我們如何從模型視圖矩陣中提取比例矩陣?現在我正在考慮每個顏色的長度,但是當尺度是負值時它會失敗。 這裏是我的代碼:從模型視圖矩陣中提取比例矩陣

float xs = 
      matrix[0][0] * matrix[0][1] * matrix[0][2] * matrix[0][3] < 0 ? 
        -1 : 1; 
    float ys = 
      matrix[1][0] * matrix[1][1] * matrix[1][2] * matrix[1][3] < 0 ? 
        -1 : 1; 
    float zs = 
      matrix[2][0] * matrix[2][1] * matrix[2][2] * matrix[2][3] < 0 ? 
        -1 : 1; 


    glm::vec3 new_scale; 
    new_scale.x = xs* glm::sqrt(
        matrix[0][0] * matrix[0][0] + matrix[0][1] * matrix[0][1] 
          + matrix[0][2] * matrix[0][2]); 
    new_scale.y = ys* glm::sqrt(
        matrix[1][0] * matrix[1][0] + matrix[1][1] * matrix[1][1] 
          + matrix[1][2] * matrix[1][2]); 
    new_scale.z = zs* glm::sqrt(
        matrix[2][0] * matrix[2][0] + matrix[2][1] * matrix[2][1] 
          + matrix[2][2] * matrix[2][2]); 

例如:

float []mat={0.032254f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, -0.0052254f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.4332254f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f}; 

回答

0

看到homogenous transformation matrices。你提取的方式規模是好的。那麼標誌呢?如果您的轉換包含旋轉,您目前的方法將不起作用...

另一個問題是,您無法知道哪個比例被否定,哪個不是因爲如果您否定單個軸,您可以獲得相同的結果一個和旋轉以匹配位置。如果你否定2軸,你會得到不同旋轉的原始矩陣。

你能做的就是檢測是否您的矩陣已經倒最好的1或3軸:

  1. 創建符號表例如單位矩陣原始無失真矩陣

    ,但如果你有不同的起點使用

    sz0=dot(cross(X0,Y0),Z0); 
    sy0=dot(cross(Z0,X0),Y0); 
    sx0=dot(cross(Y0,Z0),X0); 
    

    其中X0,Y0,Z0是從您的提取軸向量起點矩陣

  2. 計算標誌爲當前的矩陣

    sz1=dot(cross(X1,Y1),Z1); 
    sy1=dot(cross(Z1,X1),Y1); 
    sx1=dot(cross(Y1,Z1),X1); 
    

    其中提取X1,Y1,Z1軸系載體從您的實際矩陣

  3. 比較跡象,推斷出軸系規模爲負如果(sx0*sx1<0)||(sy0*sy1<0)||(sz0*sz1<0)那麼一個或全部3個軸是否定的,但是你不知道哪個......所有3個符號比較都應該有相同的結果。

[EDIT1]澄清

  • X=(matrix[0][0],matrix[0][1],matrix[0][2])
  • dot(a,b)=a.x*b.x+a.y*b.y+a.z*b.z是矢量的標量乘法(點積)
  • c=cross(a,b) ... c.x=a.y*b.z+a.z*b.y c.y=a.z*b.x+a.x*b.z c.z=a.x*b.y+a.y*b.x是向量乘法(叉積)

所以當你計算兩個向量的交叉時,你得到的向量垂直於兩個操作數。由於矩陣軸向量應該通過多軸2軸來垂直,您將獲得第三個軸。點積只是比較原始的和計算的第三軸是否在同一個方向上......這種方式在旋轉時不變的。

+0

你能解釋一下第一點是什麼嗎?我只是模型視圖矩陣,沒有其他信息 – debonair

+0

@debonair添加[編輯] – Spektre

+0

如果其中一個軸是負數,其他2個是正數,反之亦然,它不起作用。 – debonair