69 double a11,
double a12,
double a13,
double a14
70,
double a21,
double a22,
double a23,
double a24
71,
double a31,
double a32,
double a33,
double a34
72,
double a41,
double a42,
double a43,
double a44
75 double m[4][4] = { { a11, a12, a13, a14 },
76 { a21, a22, a23, a24 },
77 { a31, a32, a33, a34 },
78 { a41, a42, a43, a44 } };
80 double scalerow = m[0][0] + m[1][1] + m[2][2];
83 double s = ::sqrt(scalerow + m[3][3]);
87 m_quat[0] = (m[1][2] - m[2][1]) * s;
88 m_quat[1] = (m[2][0] - m[0][2]) * s;
89 m_quat[2] = (m[0][1] - m[1][0]) * s;
93 if (m[1][1] > m[0][0]) i = 1;
94 if (m[2][2] > m[i][i]) i = 2;
99 double s = ::sqrt((m[i][i] - (m[j][j] + m[k][k])) + m[3][3]);
104 m_quat[3] = (m[j][k] - m[k][j]) * s;
105 m_quat[j] = (m[i][j] + m[j][i]) * s;
106 m_quat[k] = (m[i][k] + m[k][i]) * s;
109 if (m[3][3] != 1.0) {
110 m_quat *= (1.0/::sqrt(m[3][3]));
129 matrix[0][0] = w*w +
x*
x -
y*
y -
z*
z;
130 matrix[0][1] = 2*
x*
y + 2*w*
z;
131 matrix[0][2] = 2*
x*
z - 2*w*
y;
134 matrix[1][0] = 2*
x*
y-2*w*
z;
135 matrix[1][1] = w*w -
x*
x +
y*
y -
z*
z;
136 matrix[1][2] = 2*
y*
z + 2*w*
x;
139 matrix[2][0] = 2*
x*
z + 2*w*
y;
140 matrix[2][1] = 2*
y*
z - 2*w*
x;
141 matrix[2][2] = w*w -
x*
x -
y*
y +
z*
z;
147 matrix[3][3] = w*w +
x*
x +
y*
y +
z*
z;
152 double*
t0 = matrix[0];
153 double* t1 = matrix[1];
154 double* t2 = matrix[2];
155 double* t3 = matrix[3];
159 double W = s[0]*
t0[3] + s[1]*t1[3] + s[2]*t2[3] + t3[3];
161 dst[0] = (s[0]*
t0[0] + s[1]*t1[0] + s[2]*t2[0] + t3[0])/W;
162 dst[1] = (s[0]*
t0[1] + s[1]*t1[1] + s[2]*t2[1] + t3[1])/W;
163 dst[2] = (s[0]*
t0[2] + s[1]*t1[2] + s[2]*t2[2] + t3[2])/W;