Absolute File Name: | /home/qt/qt5_coco/qt5/qtbase/src/gui/math3d/qquaternion.cpp |
Switch to Source code | Preprocessed file |
Line | Source | Count | ||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | - | |||||||||||||||||||
2 | - | |||||||||||||||||||
3 | - | |||||||||||||||||||
4 | float QQuaternion::length() const | - | ||||||||||||||||||
5 | { | - | ||||||||||||||||||
6 | return never executed: std::sqrt(xp * xp + yp * yp + zp * zp + wp * wp);return std::sqrt(xp * xp + yp * yp + zp * zp + wp * wp); never executed: return std::sqrt(xp * xp + yp * yp + zp * zp + wp * wp); | 0 | ||||||||||||||||||
7 | } | - | ||||||||||||||||||
8 | - | |||||||||||||||||||
9 | - | |||||||||||||||||||
10 | - | |||||||||||||||||||
11 | - | |||||||||||||||||||
12 | - | |||||||||||||||||||
13 | - | |||||||||||||||||||
14 | float QQuaternion::lengthSquared() const | - | ||||||||||||||||||
15 | { | - | ||||||||||||||||||
16 | return never executed: xp * xp + yp * yp + zp * zp + wp * wp;return xp * xp + yp * yp + zp * zp + wp * wp; never executed: return xp * xp + yp * yp + zp * zp + wp * wp; | 0 | ||||||||||||||||||
17 | } | - | ||||||||||||||||||
18 | QQuaternion QQuaternion::normalized() const | - | ||||||||||||||||||
19 | { | - | ||||||||||||||||||
20 | - | |||||||||||||||||||
21 | double len = double(xp) * double(xp) + | - | ||||||||||||||||||
22 | double(yp) * double(yp) + | - | ||||||||||||||||||
23 | double(zp) * double(zp) + | - | ||||||||||||||||||
24 | double(wp) * double(wp); | - | ||||||||||||||||||
25 | if (qFuzzyIsNull(len - 1.0f)
| 0 | ||||||||||||||||||
26 | return never executed: *this;return *this; never executed: return *this; | 0 | ||||||||||||||||||
27 | else if (!qFuzzyIsNull(len)
| 0 | ||||||||||||||||||
28 | return never executed: *this / std::sqrt(len);return *this / std::sqrt(len); never executed: return *this / std::sqrt(len); | 0 | ||||||||||||||||||
29 | else | - | ||||||||||||||||||
30 | return never executed: QQuaternion(0.0f, 0.0f, 0.0f, 0.0f);return QQuaternion(0.0f, 0.0f, 0.0f, 0.0f); never executed: return QQuaternion(0.0f, 0.0f, 0.0f, 0.0f); | 0 | ||||||||||||||||||
31 | } | - | ||||||||||||||||||
32 | - | |||||||||||||||||||
33 | - | |||||||||||||||||||
34 | - | |||||||||||||||||||
35 | - | |||||||||||||||||||
36 | - | |||||||||||||||||||
37 | - | |||||||||||||||||||
38 | - | |||||||||||||||||||
39 | void QQuaternion::normalize() | - | ||||||||||||||||||
40 | { | - | ||||||||||||||||||
41 | - | |||||||||||||||||||
42 | double len = double(xp) * double(xp) + | - | ||||||||||||||||||
43 | double(yp) * double(yp) + | - | ||||||||||||||||||
44 | double(zp) * double(zp) + | - | ||||||||||||||||||
45 | double(wp) * double(wp); | - | ||||||||||||||||||
46 | if (qFuzzyIsNull(len - 1.0f)
| 0 | ||||||||||||||||||
47 | return; never executed: return; | 0 | ||||||||||||||||||
48 | - | |||||||||||||||||||
49 | len = std::sqrt(len); | - | ||||||||||||||||||
50 | - | |||||||||||||||||||
51 | xp /= len; | - | ||||||||||||||||||
52 | yp /= len; | - | ||||||||||||||||||
53 | zp /= len; | - | ||||||||||||||||||
54 | wp /= len; | - | ||||||||||||||||||
55 | } never executed: end of block | 0 | ||||||||||||||||||
56 | QVector3D QQuaternion::rotatedVector(const QVector3D& vector) const | - | ||||||||||||||||||
57 | { | - | ||||||||||||||||||
58 | return never executed: (*this * QQuaternion(0, vector) * conjugated()).vector();return (*this * QQuaternion(0, vector) * conjugated()).vector(); never executed: return (*this * QQuaternion(0, vector) * conjugated()).vector(); | 0 | ||||||||||||||||||
59 | } | - | ||||||||||||||||||
60 | QQuaternion QQuaternion::fromAxisAndAngle(const QVector3D& axis, float angle) | - | ||||||||||||||||||
61 | { | - | ||||||||||||||||||
62 | - | |||||||||||||||||||
63 | - | |||||||||||||||||||
64 | - | |||||||||||||||||||
65 | - | |||||||||||||||||||
66 | float a = (angle / 2.0f) * 3.14159265358979323846 / 180.0f; | - | ||||||||||||||||||
67 | float s = std::sin(a); | - | ||||||||||||||||||
68 | float c = std::cos(a); | - | ||||||||||||||||||
69 | QVector3D ax = axis.normalized(); | - | ||||||||||||||||||
70 | return never executed: QQuaternion(c, ax.x() * s, ax.y() * s, ax.z() * s).normalized();return QQuaternion(c, ax.x() * s, ax.y() * s, ax.z() * s).normalized(); never executed: return QQuaternion(c, ax.x() * s, ax.y() * s, ax.z() * s).normalized(); | 0 | ||||||||||||||||||
71 | } | - | ||||||||||||||||||
72 | void QQuaternion::getAxisAndAngle(float *x, float *y, float *z, float *angle) const | - | ||||||||||||||||||
73 | { | - | ||||||||||||||||||
74 | ((!(x && y && z && angle)) ? qt_assert("x && y && z && angle",__FILE__,430) : qt_noop()); | - | ||||||||||||||||||
75 | - | |||||||||||||||||||
76 | - | |||||||||||||||||||
77 | - | |||||||||||||||||||
78 | - | |||||||||||||||||||
79 | float length = xp * xp + yp * yp + zp * zp; | - | ||||||||||||||||||
80 | if (!qFuzzyIsNull(length)
| 0 | ||||||||||||||||||
81 | *x = xp; | - | ||||||||||||||||||
82 | *y = yp; | - | ||||||||||||||||||
83 | *z = zp; | - | ||||||||||||||||||
84 | if (!qFuzzyIsNull(length - 1.0f)
| 0 | ||||||||||||||||||
85 | length = std::sqrt(length); | - | ||||||||||||||||||
86 | *x /= length; | - | ||||||||||||||||||
87 | *y /= length; | - | ||||||||||||||||||
88 | *z /= length; | - | ||||||||||||||||||
89 | } never executed: end of block | 0 | ||||||||||||||||||
90 | *angle = 2.0f * std::acos(wp); | - | ||||||||||||||||||
91 | } never executed: else {end of block | 0 | ||||||||||||||||||
92 | - | |||||||||||||||||||
93 | *x = *y = *z = *angle = 0.0f; | - | ||||||||||||||||||
94 | } never executed: end of block | 0 | ||||||||||||||||||
95 | - | |||||||||||||||||||
96 | *angle = qRadiansToDegrees(*angle); | - | ||||||||||||||||||
97 | } never executed: end of block | 0 | ||||||||||||||||||
98 | - | |||||||||||||||||||
99 | - | |||||||||||||||||||
100 | - | |||||||||||||||||||
101 | - | |||||||||||||||||||
102 | - | |||||||||||||||||||
103 | - | |||||||||||||||||||
104 | - | |||||||||||||||||||
105 | QQuaternion QQuaternion::fromAxisAndAngle | - | ||||||||||||||||||
106 | (float x, float y, float z, float angle) | - | ||||||||||||||||||
107 | { | - | ||||||||||||||||||
108 | float length = std::sqrt(x * x + y * y + z * z); | - | ||||||||||||||||||
109 | if (!qFuzzyIsNull(length - 1.0f)
| 0 | ||||||||||||||||||
110 | x /= length; | - | ||||||||||||||||||
111 | y /= length; | - | ||||||||||||||||||
112 | z /= length; | - | ||||||||||||||||||
113 | } never executed: end of block | 0 | ||||||||||||||||||
114 | float a = (angle / 2.0f) * 3.14159265358979323846 / 180.0f; | - | ||||||||||||||||||
115 | float s = std::sin(a); | - | ||||||||||||||||||
116 | float c = std::cos(a); | - | ||||||||||||||||||
117 | return never executed: QQuaternion(c, x * s, y * s, z * s).normalized();return QQuaternion(c, x * s, y * s, z * s).normalized(); never executed: return QQuaternion(c, x * s, y * s, z * s).normalized(); | 0 | ||||||||||||||||||
118 | } | - | ||||||||||||||||||
119 | void QQuaternion::getEulerAngles(float *pitch, float *yaw, float *roll) const | - | ||||||||||||||||||
120 | { | - | ||||||||||||||||||
121 | ((!(pitch && yaw && roll)) ? qt_assert("pitch && yaw && roll",__FILE__,513) : qt_noop()); | - | ||||||||||||||||||
122 | - | |||||||||||||||||||
123 | - | |||||||||||||||||||
124 | - | |||||||||||||||||||
125 | - | |||||||||||||||||||
126 | float xx = xp * xp; | - | ||||||||||||||||||
127 | float xy = xp * yp; | - | ||||||||||||||||||
128 | float xz = xp * zp; | - | ||||||||||||||||||
129 | float xw = xp * wp; | - | ||||||||||||||||||
130 | float yy = yp * yp; | - | ||||||||||||||||||
131 | float yz = yp * zp; | - | ||||||||||||||||||
132 | float yw = yp * wp; | - | ||||||||||||||||||
133 | float zz = zp * zp; | - | ||||||||||||||||||
134 | float zw = zp * wp; | - | ||||||||||||||||||
135 | - | |||||||||||||||||||
136 | const float lengthSquared = xx + yy + zz + wp * wp; | - | ||||||||||||||||||
137 | if (!qFuzzyIsNull(lengthSquared - 1.0f)
| 0 | ||||||||||||||||||
138 | xx /= lengthSquared; | - | ||||||||||||||||||
139 | xy /= lengthSquared; | - | ||||||||||||||||||
140 | xz /= lengthSquared; | - | ||||||||||||||||||
141 | xw /= lengthSquared; | - | ||||||||||||||||||
142 | yy /= lengthSquared; | - | ||||||||||||||||||
143 | yz /= lengthSquared; | - | ||||||||||||||||||
144 | yw /= lengthSquared; | - | ||||||||||||||||||
145 | zz /= lengthSquared; | - | ||||||||||||||||||
146 | zw /= lengthSquared; | - | ||||||||||||||||||
147 | } never executed: end of block | 0 | ||||||||||||||||||
148 | - | |||||||||||||||||||
149 | *pitch = std::asin(-2.0f * (yz - xw)); | - | ||||||||||||||||||
150 | if (*
| 0 | ||||||||||||||||||
151 | if (*
| 0 | ||||||||||||||||||
152 | *yaw = std::atan2(2.0f * (xz + yw), 1.0f - 2.0f * (xx + yy)); | - | ||||||||||||||||||
153 | *roll = std::atan2(2.0f * (xy + zw), 1.0f - 2.0f * (xx + zz)); | - | ||||||||||||||||||
154 | } never executed: else {end of block | 0 | ||||||||||||||||||
155 | - | |||||||||||||||||||
156 | *roll = 0.0f; | - | ||||||||||||||||||
157 | *yaw = -std::atan2(-2.0f * (xy - zw), 1.0f - 2.0f * (yy + zz)); | - | ||||||||||||||||||
158 | } never executed: end of block | 0 | ||||||||||||||||||
159 | } else { | - | ||||||||||||||||||
160 | - | |||||||||||||||||||
161 | *roll = 0.0f; | - | ||||||||||||||||||
162 | *yaw = std::atan2(-2.0f * (xy - zw), 1.0f - 2.0f * (yy + zz)); | - | ||||||||||||||||||
163 | } never executed: end of block | 0 | ||||||||||||||||||
164 | - | |||||||||||||||||||
165 | *pitch = qRadiansToDegrees(*pitch); | - | ||||||||||||||||||
166 | *yaw = qRadiansToDegrees(*yaw); | - | ||||||||||||||||||
167 | *roll = qRadiansToDegrees(*roll); | - | ||||||||||||||||||
168 | } never executed: end of block | 0 | ||||||||||||||||||
169 | QQuaternion QQuaternion::fromEulerAngles(float pitch, float yaw, float roll) | - | ||||||||||||||||||
170 | { | - | ||||||||||||||||||
171 | - | |||||||||||||||||||
172 | - | |||||||||||||||||||
173 | - | |||||||||||||||||||
174 | pitch = qDegreesToRadians(pitch); | - | ||||||||||||||||||
175 | yaw = qDegreesToRadians(yaw); | - | ||||||||||||||||||
176 | roll = qDegreesToRadians(roll); | - | ||||||||||||||||||
177 | - | |||||||||||||||||||
178 | pitch *= 0.5f; | - | ||||||||||||||||||
179 | yaw *= 0.5f; | - | ||||||||||||||||||
180 | roll *= 0.5f; | - | ||||||||||||||||||
181 | - | |||||||||||||||||||
182 | const float c1 = std::cos(yaw); | - | ||||||||||||||||||
183 | const float s1 = std::sin(yaw); | - | ||||||||||||||||||
184 | const float c2 = std::cos(roll); | - | ||||||||||||||||||
185 | const float s2 = std::sin(roll); | - | ||||||||||||||||||
186 | const float c3 = std::cos(pitch); | - | ||||||||||||||||||
187 | const float s3 = std::sin(pitch); | - | ||||||||||||||||||
188 | const float c1c2 = c1 * c2; | - | ||||||||||||||||||
189 | const float s1s2 = s1 * s2; | - | ||||||||||||||||||
190 | - | |||||||||||||||||||
191 | const float w = c1c2 * c3 + s1s2 * s3; | - | ||||||||||||||||||
192 | const float x = c1c2 * s3 + s1s2 * c3; | - | ||||||||||||||||||
193 | const float y = s1 * c2 * c3 - c1 * s2 * s3; | - | ||||||||||||||||||
194 | const float z = c1 * s2 * c3 - s1 * c2 * s3; | - | ||||||||||||||||||
195 | - | |||||||||||||||||||
196 | return never executed: QQuaternion(w, x, y, z);return QQuaternion(w, x, y, z); never executed: return QQuaternion(w, x, y, z); | 0 | ||||||||||||||||||
197 | } | - | ||||||||||||||||||
198 | QMatrix3x3 QQuaternion::toRotationMatrix() const | - | ||||||||||||||||||
199 | { | - | ||||||||||||||||||
200 | - | |||||||||||||||||||
201 | - | |||||||||||||||||||
202 | - | |||||||||||||||||||
203 | QMatrix3x3 rot3x3(Qt::Uninitialized); | - | ||||||||||||||||||
204 | - | |||||||||||||||||||
205 | const float f2x = xp + xp; | - | ||||||||||||||||||
206 | const float f2y = yp + yp; | - | ||||||||||||||||||
207 | const float f2z = zp + zp; | - | ||||||||||||||||||
208 | const float f2xw = f2x * wp; | - | ||||||||||||||||||
209 | const float f2yw = f2y * wp; | - | ||||||||||||||||||
210 | const float f2zw = f2z * wp; | - | ||||||||||||||||||
211 | const float f2xx = f2x * xp; | - | ||||||||||||||||||
212 | const float f2xy = f2x * yp; | - | ||||||||||||||||||
213 | const float f2xz = f2x * zp; | - | ||||||||||||||||||
214 | const float f2yy = f2y * yp; | - | ||||||||||||||||||
215 | const float f2yz = f2y * zp; | - | ||||||||||||||||||
216 | const float f2zz = f2z * zp; | - | ||||||||||||||||||
217 | - | |||||||||||||||||||
218 | rot3x3(0, 0) = 1.0f - (f2yy + f2zz); | - | ||||||||||||||||||
219 | rot3x3(0, 1) = f2xy - f2zw; | - | ||||||||||||||||||
220 | rot3x3(0, 2) = f2xz + f2yw; | - | ||||||||||||||||||
221 | rot3x3(1, 0) = f2xy + f2zw; | - | ||||||||||||||||||
222 | rot3x3(1, 1) = 1.0f - (f2xx + f2zz); | - | ||||||||||||||||||
223 | rot3x3(1, 2) = f2yz - f2xw; | - | ||||||||||||||||||
224 | rot3x3(2, 0) = f2xz - f2yw; | - | ||||||||||||||||||
225 | rot3x3(2, 1) = f2yz + f2xw; | - | ||||||||||||||||||
226 | rot3x3(2, 2) = 1.0f - (f2xx + f2yy); | - | ||||||||||||||||||
227 | - | |||||||||||||||||||
228 | return never executed: rot3x3;return rot3x3; never executed: return rot3x3; | 0 | ||||||||||||||||||
229 | } | - | ||||||||||||||||||
230 | QQuaternion QQuaternion::fromRotationMatrix(const QMatrix3x3 &rot3x3) | - | ||||||||||||||||||
231 | { | - | ||||||||||||||||||
232 | - | |||||||||||||||||||
233 | - | |||||||||||||||||||
234 | - | |||||||||||||||||||
235 | float scalar; | - | ||||||||||||||||||
236 | float axis[3]; | - | ||||||||||||||||||
237 | - | |||||||||||||||||||
238 | const float trace = rot3x3(0, 0) + rot3x3(1, 1) + rot3x3(2, 2); | - | ||||||||||||||||||
239 | if (trace > 0.00000001f
| 0 | ||||||||||||||||||
240 | const float s = 2.0f * std::sqrt(trace + 1.0f); | - | ||||||||||||||||||
241 | scalar = 0.25f * s; | - | ||||||||||||||||||
242 | axis[0] = (rot3x3(2, 1) - rot3x3(1, 2)) / s; | - | ||||||||||||||||||
243 | axis[1] = (rot3x3(0, 2) - rot3x3(2, 0)) / s; | - | ||||||||||||||||||
244 | axis[2] = (rot3x3(1, 0) - rot3x3(0, 1)) / s; | - | ||||||||||||||||||
245 | } never executed: else {end of block | 0 | ||||||||||||||||||
246 | static int s_next[3] = { 1, 2, 0 }; | - | ||||||||||||||||||
247 | int i = 0; | - | ||||||||||||||||||
248 | if (rot3x3(1, 1) > rot3x3(0, 0)
| 0 | ||||||||||||||||||
249 | i = 1; never executed: i = 1; | 0 | ||||||||||||||||||
250 | if (rot3x3(2, 2) > rot3x3(i, i)
| 0 | ||||||||||||||||||
251 | i = 2; never executed: i = 2; | 0 | ||||||||||||||||||
252 | int j = s_next[i]; | - | ||||||||||||||||||
253 | int k = s_next[j]; | - | ||||||||||||||||||
254 | - | |||||||||||||||||||
255 | const float s = 2.0f * std::sqrt(rot3x3(i, i) - rot3x3(j, j) - rot3x3(k, k) + 1.0f); | - | ||||||||||||||||||
256 | axis[i] = 0.25f * s; | - | ||||||||||||||||||
257 | scalar = (rot3x3(k, j) - rot3x3(j, k)) / s; | - | ||||||||||||||||||
258 | axis[j] = (rot3x3(j, i) + rot3x3(i, j)) / s; | - | ||||||||||||||||||
259 | axis[k] = (rot3x3(k, i) + rot3x3(i, k)) / s; | - | ||||||||||||||||||
260 | } never executed: end of block | 0 | ||||||||||||||||||
261 | - | |||||||||||||||||||
262 | return never executed: QQuaternion(scalar, axis[0], axis[1], axis[2]);return QQuaternion(scalar, axis[0], axis[1], axis[2]); never executed: return QQuaternion(scalar, axis[0], axis[1], axis[2]); | 0 | ||||||||||||||||||
263 | } | - | ||||||||||||||||||
264 | void QQuaternion::getAxes(QVector3D *xAxis, QVector3D *yAxis, QVector3D *zAxis) const | - | ||||||||||||||||||
265 | { | - | ||||||||||||||||||
266 | ((!(xAxis && yAxis && zAxis)) ? qt_assert("xAxis && yAxis && zAxis",__FILE__,700) : qt_noop()); | - | ||||||||||||||||||
267 | - | |||||||||||||||||||
268 | const QMatrix3x3 rot3x3(toRotationMatrix()); | - | ||||||||||||||||||
269 | - | |||||||||||||||||||
270 | *xAxis = QVector3D(rot3x3(0, 0), rot3x3(1, 0), rot3x3(2, 0)); | - | ||||||||||||||||||
271 | *yAxis = QVector3D(rot3x3(0, 1), rot3x3(1, 1), rot3x3(2, 1)); | - | ||||||||||||||||||
272 | *zAxis = QVector3D(rot3x3(0, 2), rot3x3(1, 2), rot3x3(2, 2)); | - | ||||||||||||||||||
273 | } never executed: end of block | 0 | ||||||||||||||||||
274 | QQuaternion QQuaternion::fromAxes(const QVector3D &xAxis, const QVector3D &yAxis, const QVector3D &zAxis) | - | ||||||||||||||||||
275 | { | - | ||||||||||||||||||
276 | QMatrix3x3 rot3x3(Qt::Uninitialized); | - | ||||||||||||||||||
277 | rot3x3(0, 0) = xAxis.x(); | - | ||||||||||||||||||
278 | rot3x3(1, 0) = xAxis.y(); | - | ||||||||||||||||||
279 | rot3x3(2, 0) = xAxis.z(); | - | ||||||||||||||||||
280 | rot3x3(0, 1) = yAxis.x(); | - | ||||||||||||||||||
281 | rot3x3(1, 1) = yAxis.y(); | - | ||||||||||||||||||
282 | rot3x3(2, 1) = yAxis.z(); | - | ||||||||||||||||||
283 | rot3x3(0, 2) = zAxis.x(); | - | ||||||||||||||||||
284 | rot3x3(1, 2) = zAxis.y(); | - | ||||||||||||||||||
285 | rot3x3(2, 2) = zAxis.z(); | - | ||||||||||||||||||
286 | - | |||||||||||||||||||
287 | return never executed: QQuaternion::fromRotationMatrix(rot3x3);return QQuaternion::fromRotationMatrix(rot3x3); never executed: return QQuaternion::fromRotationMatrix(rot3x3); | 0 | ||||||||||||||||||
288 | } | - | ||||||||||||||||||
289 | QQuaternion QQuaternion::fromDirection(const QVector3D &direction, const QVector3D &up) | - | ||||||||||||||||||
290 | { | - | ||||||||||||||||||
291 | if (qFuzzyIsNull(direction.x())
| 0 | ||||||||||||||||||
292 | return never executed: QQuaternion();return QQuaternion(); never executed: return QQuaternion(); | 0 | ||||||||||||||||||
293 | - | |||||||||||||||||||
294 | const QVector3D zAxis(direction.normalized()); | - | ||||||||||||||||||
295 | QVector3D xAxis(QVector3D::crossProduct(up, zAxis)); | - | ||||||||||||||||||
296 | if (qFuzzyIsNull(xAxis.lengthSquared())
| 0 | ||||||||||||||||||
297 | - | |||||||||||||||||||
298 | return never executed: QQuaternion::rotationTo(QVector3D(0.0f, 0.0f, 1.0f), zAxis);return QQuaternion::rotationTo(QVector3D(0.0f, 0.0f, 1.0f), zAxis); never executed: return QQuaternion::rotationTo(QVector3D(0.0f, 0.0f, 1.0f), zAxis); | 0 | ||||||||||||||||||
299 | } | - | ||||||||||||||||||
300 | - | |||||||||||||||||||
301 | xAxis.normalize(); | - | ||||||||||||||||||
302 | const QVector3D yAxis(QVector3D::crossProduct(zAxis, xAxis)); | - | ||||||||||||||||||
303 | - | |||||||||||||||||||
304 | return never executed: QQuaternion::fromAxes(xAxis, yAxis, zAxis);return QQuaternion::fromAxes(xAxis, yAxis, zAxis); never executed: return QQuaternion::fromAxes(xAxis, yAxis, zAxis); | 0 | ||||||||||||||||||
305 | } | - | ||||||||||||||||||
306 | QQuaternion QQuaternion::rotationTo(const QVector3D &from, const QVector3D &to) | - | ||||||||||||||||||
307 | { | - | ||||||||||||||||||
308 | - | |||||||||||||||||||
309 | - | |||||||||||||||||||
310 | const QVector3D v0(from.normalized()); | - | ||||||||||||||||||
311 | const QVector3D v1(to.normalized()); | - | ||||||||||||||||||
312 | - | |||||||||||||||||||
313 | float d = QVector3D::dotProduct(v0, v1) + 1.0f; | - | ||||||||||||||||||
314 | - | |||||||||||||||||||
315 | - | |||||||||||||||||||
316 | if (qFuzzyIsNull(d)
| 0 | ||||||||||||||||||
317 | QVector3D axis = QVector3D::crossProduct(QVector3D(1.0f, 0.0f, 0.0f), v0); | - | ||||||||||||||||||
318 | if (qFuzzyIsNull(axis.lengthSquared())
| 0 | ||||||||||||||||||
319 | axis = QVector3D::crossProduct(QVector3D(0.0f, 1.0f, 0.0f), v0); never executed: axis = QVector3D::crossProduct(QVector3D(0.0f, 1.0f, 0.0f), v0); | 0 | ||||||||||||||||||
320 | axis.normalize(); | - | ||||||||||||||||||
321 | - | |||||||||||||||||||
322 | - | |||||||||||||||||||
323 | return never executed: QQuaternion(0.0f, axis.x(), axis.y(), axis.z());return QQuaternion(0.0f, axis.x(), axis.y(), axis.z()); never executed: return QQuaternion(0.0f, axis.x(), axis.y(), axis.z()); | 0 | ||||||||||||||||||
324 | } | - | ||||||||||||||||||
325 | - | |||||||||||||||||||
326 | d = std::sqrt(2.0f * d); | - | ||||||||||||||||||
327 | const QVector3D axis(QVector3D::crossProduct(v0, v1) / d); | - | ||||||||||||||||||
328 | - | |||||||||||||||||||
329 | return never executed: QQuaternion(d * 0.5f, axis).normalized();return QQuaternion(d * 0.5f, axis).normalized(); never executed: return QQuaternion(d * 0.5f, axis).normalized(); | 0 | ||||||||||||||||||
330 | } | - | ||||||||||||||||||
331 | QQuaternion QQuaternion::slerp | - | ||||||||||||||||||
332 | (const QQuaternion& q1, const QQuaternion& q2, float t) | - | ||||||||||||||||||
333 | { | - | ||||||||||||||||||
334 | - | |||||||||||||||||||
335 | if (t <= 0.0f
| 0 | ||||||||||||||||||
336 | return never executed: q1;return q1; never executed: return q1; | 0 | ||||||||||||||||||
337 | else if (t >= 1.0f
| 0 | ||||||||||||||||||
338 | return never executed: q2;return q2; never executed: return q2; | 0 | ||||||||||||||||||
339 | - | |||||||||||||||||||
340 | - | |||||||||||||||||||
341 | QQuaternion q2b(q2); | - | ||||||||||||||||||
342 | float dot = QQuaternion::dotProduct(q1, q2); | - | ||||||||||||||||||
343 | if (dot < 0.0f
| 0 | ||||||||||||||||||
344 | q2b = -q2b; | - | ||||||||||||||||||
345 | dot = -dot; | - | ||||||||||||||||||
346 | } never executed: end of block | 0 | ||||||||||||||||||
347 | - | |||||||||||||||||||
348 | - | |||||||||||||||||||
349 | - | |||||||||||||||||||
350 | float factor1 = 1.0f - t; | - | ||||||||||||||||||
351 | float factor2 = t; | - | ||||||||||||||||||
352 | if ((
| 0 | ||||||||||||||||||
353 | float angle = std::acos(dot); | - | ||||||||||||||||||
354 | float sinOfAngle = std::sin(angle); | - | ||||||||||||||||||
355 | if (sinOfAngle > 0.0000001
| 0 | ||||||||||||||||||
356 | factor1 = std::sin((1.0f - t) * angle) / sinOfAngle; | - | ||||||||||||||||||
357 | factor2 = std::sin(t * angle) / sinOfAngle; | - | ||||||||||||||||||
358 | } never executed: end of block | 0 | ||||||||||||||||||
359 | } never executed: end of block | 0 | ||||||||||||||||||
360 | - | |||||||||||||||||||
361 | - | |||||||||||||||||||
362 | return never executed: q1 * factor1 + q2b * factor2;return q1 * factor1 + q2b * factor2; never executed: return q1 * factor1 + q2b * factor2; | 0 | ||||||||||||||||||
363 | } | - | ||||||||||||||||||
364 | QQuaternion QQuaternion::nlerp | - | ||||||||||||||||||
365 | (const QQuaternion& q1, const QQuaternion& q2, float t) | - | ||||||||||||||||||
366 | { | - | ||||||||||||||||||
367 | - | |||||||||||||||||||
368 | if (t <= 0.0f
| 0 | ||||||||||||||||||
369 | return never executed: q1;return q1; never executed: return q1; | 0 | ||||||||||||||||||
370 | else if (t >= 1.0f
| 0 | ||||||||||||||||||
371 | return never executed: q2;return q2; never executed: return q2; | 0 | ||||||||||||||||||
372 | - | |||||||||||||||||||
373 | - | |||||||||||||||||||
374 | QQuaternion q2b(q2); | - | ||||||||||||||||||
375 | float dot = QQuaternion::dotProduct(q1, q2); | - | ||||||||||||||||||
376 | if (dot < 0.0f
| 0 | ||||||||||||||||||
377 | q2b = -q2b; never executed: q2b = -q2b; | 0 | ||||||||||||||||||
378 | - | |||||||||||||||||||
379 | - | |||||||||||||||||||
380 | return never executed: (q1 * (1.0f - t) + q2b * t).normalized();return (q1 * (1.0f - t) + q2b * t).normalized(); never executed: return (q1 * (1.0f - t) + q2b * t).normalized(); | 0 | ||||||||||||||||||
381 | } | - | ||||||||||||||||||
382 | - | |||||||||||||||||||
383 | - | |||||||||||||||||||
384 | - | |||||||||||||||||||
385 | - | |||||||||||||||||||
386 | QQuaternion::operator QVariant() const | - | ||||||||||||||||||
387 | { | - | ||||||||||||||||||
388 | return never executed: QVariant(QVariant::Quaternion, this);return QVariant(QVariant::Quaternion, this); never executed: return QVariant(QVariant::Quaternion, this); | 0 | ||||||||||||||||||
389 | } | - | ||||||||||||||||||
390 | - | |||||||||||||||||||
391 | - | |||||||||||||||||||
392 | - | |||||||||||||||||||
393 | QDebug operator<<(QDebug dbg, const QQuaternion &q) | - | ||||||||||||||||||
394 | { | - | ||||||||||||||||||
395 | QDebugStateSaver saver(dbg); | - | ||||||||||||||||||
396 | dbg.nospace() << "QQuaternion(scalar:" << q.scalar() | - | ||||||||||||||||||
397 | << ", vector:(" << q.x() << ", " | - | ||||||||||||||||||
398 | << q.y() << ", " << q.z() << "))"; | - | ||||||||||||||||||
399 | return never executed: dbg;return dbg; never executed: return dbg; | 0 | ||||||||||||||||||
400 | } | - | ||||||||||||||||||
401 | QDataStream &operator<<(QDataStream &stream, const QQuaternion &quaternion) | - | ||||||||||||||||||
402 | { | - | ||||||||||||||||||
403 | stream << quaternion.scalar() << quaternion.x() | - | ||||||||||||||||||
404 | << quaternion.y() << quaternion.z(); | - | ||||||||||||||||||
405 | return never executed: stream;return stream; never executed: return stream; | 0 | ||||||||||||||||||
406 | } | - | ||||||||||||||||||
407 | QDataStream &operator>>(QDataStream &stream, QQuaternion &quaternion) | - | ||||||||||||||||||
408 | { | - | ||||||||||||||||||
409 | float scalar, x, y, z; | - | ||||||||||||||||||
410 | stream >> scalar; | - | ||||||||||||||||||
411 | stream >> x; | - | ||||||||||||||||||
412 | stream >> y; | - | ||||||||||||||||||
413 | stream >> z; | - | ||||||||||||||||||
414 | quaternion.setScalar(scalar); | - | ||||||||||||||||||
415 | quaternion.setX(x); | - | ||||||||||||||||||
416 | quaternion.setY(y); | - | ||||||||||||||||||
417 | quaternion.setZ(z); | - | ||||||||||||||||||
418 | return never executed: stream;return stream; never executed: return stream; | 0 | ||||||||||||||||||
419 | } | - | ||||||||||||||||||
420 | - | |||||||||||||||||||
421 | - | |||||||||||||||||||
422 | - | |||||||||||||||||||
423 | - | |||||||||||||||||||
424 | - | |||||||||||||||||||
425 | - | |||||||||||||||||||
Switch to Source code | Preprocessed file |