Vector4D.qFromMatrix constructor
Vector4D.qFromMatrix(
- MatrixD mat
Implementation
factory Vector4D.qFromMatrix(MatrixD mat) {
final fourWSquaredMinus1 = mat.m0 + mat.m5 + mat.m10;
final fourXSquaredMinus1 = mat.m0 - mat.m5 - mat.m10;
final fourYSquaredMinus1 = mat.m5 - mat.m0 - mat.m10;
final fourZSquaredMinus1 = mat.m10 - mat.m0 - mat.m5;
int biggestIndex = 0;
double fourBiggestSquaredMinus1 = fourWSquaredMinus1;
if (fourXSquaredMinus1 > fourBiggestSquaredMinus1) {
fourBiggestSquaredMinus1 = fourXSquaredMinus1;
biggestIndex = 1;
}
if (fourYSquaredMinus1 > fourBiggestSquaredMinus1) {
fourBiggestSquaredMinus1 = fourYSquaredMinus1;
biggestIndex = 2;
}
if (fourZSquaredMinus1 > fourBiggestSquaredMinus1) {
fourBiggestSquaredMinus1 = fourZSquaredMinus1;
biggestIndex = 3;
}
final biggestVal = math.sqrt(fourBiggestSquaredMinus1 + 1.0)*0.5;
final mult = 0.25/biggestVal;
return switch (biggestIndex) {
0 => .vec4(
biggestVal,
(mat.m6 - mat.m9)*mult,
(mat.m8 - mat.m2)*mult,
(mat.m1 - mat.m4)*mult,
),
1 => .vec4(
biggestVal,
(mat.m6 - mat.m9)*mult,
(mat.m1 + mat.m4)*mult,
(mat.m8 + mat.m2)*mult,
),
2 => .vec4(
biggestVal,
(mat.m8 - mat.m2)*mult,
(mat.m1 + mat.m4)*mult,
(mat.m6 + mat.m9)*mult,
),
3 => .vec4(
biggestVal,
(mat.m1 - mat.m4)*mult,
(mat.m8 + mat.m2)*mult,
(mat.m6 + mat.m9)*mult,
),
_ => .zero(),
};
}