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};
4

1 回答 1

1

齐次变换矩阵。您提取比例的方式是可以的。那么标志呢?如果您的转换包含旋转,您当前的方法将不起作用......

另一个问题是您无法知道哪个比例被否定,哪个比例被否定,因为如果您否定单个轴,如果您否定任何其他轴并旋转以匹配位置,则可以获得相同的结果。如果否定 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 个符号比较应该有相同的结果。

[编辑1] 澄清

  • 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 个轴相乘而垂直,因此您将得到第三个。点积只是比较原始和计算的第三个轴是否在同一方向上......这种方式在旋转上是不变的

于 2015-11-05T08:22:05.433 回答