2015-11-05 199 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