34 VuoTransformTypeEuler,
35 VuoTransformTypeQuaternion,
36 VuoTransformTypeTargeted
47 VuoPoint3d translation;
56 VuoPoint4d quaternion;
60 VuoPoint3d upDirection;
66 void VuoTransform_getBillboardMatrix(
VuoInteger imageWidth,
VuoInteger imageHeight,
VuoReal imageScaleFactor,
VuoBoolean preservePhysicalSize,
VuoReal translationX,
VuoReal translationY,
VuoInteger viewportWidth,
VuoInteger viewportHeight,
VuoReal backingScaleFactor, VuoPoint2d mesh0,
float *billboardMatrix)
__attribute__((nonnull));
91 q.x = a.w*b.x + a.x*b.w + a.y*b.z - a.z*b.y;
92 q.y = a.w*b.y + a.y*b.w + a.z*b.x - a.x*b.z;
93 q.z = a.w*b.z + a.z*b.w + a.x*b.y - a.y*b.x;
94 q.w = a.w*b.w - a.x*b.x - a.y*b.y - a.z*b.z;
106 q.x = axisNormalized.x * sinf(angle/2.f);
107 q.y = axisNormalized.y * sinf(angle/2.f);
108 q.z = axisNormalized.z * sinf(angle/2.f);
109 q.w = cosf(angle/2.f);
124 VuoPoint4d q = { 0, 0, 0, 1 };
134 float s = sqrtf( (1+d)*2 );
154 float m00 = rotation[0],
168 t = 1 + m00 - m11 - m22;
173 t = 1 - m00 + m11 - m22;
181 t = 1 - m00 - m11 + m22;
186 t = 1 + m00 + m11 + m22;
203 double t0 = cos(euler.z * 0.5);
204 double t1 = sin(euler.z * 0.5);
205 double t2 = cos(euler.x * 0.5);
206 double t3 = sin(euler.x * 0.5);
207 double t4 = cos(euler.y * 0.5);
208 double t5 = sin(euler.y * 0.5);
210 q.w = t0 * t2 * t4 + t1 * t3 * t5;
211 q.x = t0 * t3 * t4 - t1 * t2 * t5;
212 q.y = t0 * t2 * t5 + t1 * t3 * t4;
213 q.z = t1 * t2 * t4 - t0 * t3 * t5;
227 double ysqr = quaternion.y * quaternion.y;
230 double t0 = + 2.0 * (quaternion.w * quaternion.x + quaternion.y * quaternion.z);
231 double t1 = + 1.0 - 2.0 * (quaternion.x * quaternion.x + ysqr);
232 ea.x = atan2(t0, t1);
235 double t2 = +2.0 * (quaternion.w * quaternion.y - quaternion.z * quaternion.x);
236 t2 = t2 > 1.0 ? 1.0 : t2;
237 t2 = t2 < -1.0 ? -1.0 : t2;
241 double t3 = +2.0 * (quaternion.w * quaternion.z + quaternion.x * quaternion.y);
242 double t4 = +1.0 - 2.0 * (ysqr + quaternion.z * quaternion.z);
243 ea.z = atan2(t3, t4);
257 double cy = sqrt(matrix[0] * matrix[0] + matrix[1] * matrix[1]);
259 if (cy > 16 * FLT_EPSILON)
261 ea.x = atan2f( matrix[5], matrix[8]);
262 ea.y = atan2f(-matrix[2], cy);
263 ea.z = atan2f( matrix[1], matrix[0]);
267 ea.x = atan2f(-matrix[7], matrix[4]);
268 ea.y = atan2f(-matrix[2], cy);
282 VuoPoint4d vQuaternion = (VuoPoint4d){v.x, v.y, v.z, 0};
283 VuoPoint4d qConjugate = (VuoPoint4d){-q.x, -q.y, -q.z, q.w};
285 return (VuoPoint3d){result.x, result.y, result.z};
293 const float tolerance = 0.00001f;
294 return fabs(transform.translation.x) < tolerance
295 && fabs(transform.translation.y) < tolerance
296 && fabs(transform.translation.z) < tolerance
297 && fabs(transform.scale.x - 1.) < tolerance
298 && fabs(transform.scale.y - 1.) < tolerance
299 && fabs(transform.scale.z - 1.) < tolerance
301 (transform.type == VuoTransformTypeEuler
302 && fabs(transform.rotationSource.euler.x) < tolerance
303 && fabs(transform.rotationSource.euler.y) < tolerance
304 && fabs(transform.rotationSource.euler.z) < tolerance
307 (transform.type == VuoTransformTypeQuaternion
308 && fabs(transform.rotationSource.quaternion.x) < tolerance
309 && fabs(transform.rotationSource.quaternion.y) < tolerance
310 && fabs(transform.rotationSource.quaternion.z) < tolerance
311 && (fabs(transform.rotationSource.quaternion.w - 1.) < tolerance || fabs(transform.rotationSource.quaternion.w + 1.) < tolerance)
314 (transform.type == VuoTransformTypeTargeted
315 && fabs(transform.rotationSource.target.x - 1.) < tolerance
316 && fabs(transform.rotationSource.target.y) < tolerance
317 && fabs(transform.rotationSource.target.z) < tolerance
328 outputMatrix[0*4+0] = a[0*4+0] * b[0*4+0] + a[0*4+1] * b[1*4+0] + a[0*4+2] * b[2*4+0] + a[0*4+3] * b[3*4+0];
329 outputMatrix[0*4+1] = a[0*4+0] * b[0*4+1] + a[0*4+1] * b[1*4+1] + a[0*4+2] * b[2*4+1] + a[0*4+3] * b[3*4+1];
330 outputMatrix[0*4+2] = a[0*4+0] * b[0*4+2] + a[0*4+1] * b[1*4+2] + a[0*4+2] * b[2*4+2] + a[0*4+3] * b[3*4+2];
331 outputMatrix[0*4+3] = a[0*4+0] * b[0*4+3] + a[0*4+1] * b[1*4+3] + a[0*4+2] * b[2*4+3] + a[0*4+3] * b[3*4+3];
332 outputMatrix[1*4+0] = a[1*4+0] * b[0*4+0] + a[1*4+1] * b[1*4+0] + a[1*4+2] * b[2*4+0] + a[1*4+3] * b[3*4+0];
333 outputMatrix[1*4+1] = a[1*4+0] * b[0*4+1] + a[1*4+1] * b[1*4+1] + a[1*4+2] * b[2*4+1] + a[1*4+3] * b[3*4+1];
334 outputMatrix[1*4+2] = a[1*4+0] * b[0*4+2] + a[1*4+1] * b[1*4+2] + a[1*4+2] * b[2*4+2] + a[1*4+3] * b[3*4+2];
335 outputMatrix[1*4+3] = a[1*4+0] * b[0*4+3] + a[1*4+1] * b[1*4+3] + a[1*4+2] * b[2*4+3] + a[1*4+3] * b[3*4+3];
336 outputMatrix[2*4+0] = a[2*4+0] * b[0*4+0] + a[2*4+1] * b[1*4+0] + a[2*4+2] * b[2*4+0] + a[2*4+3] * b[3*4+0];
337 outputMatrix[2*4+1] = a[2*4+0] * b[0*4+1] + a[2*4+1] * b[1*4+1] + a[2*4+2] * b[2*4+1] + a[2*4+3] * b[3*4+1];
338 outputMatrix[2*4+2] = a[2*4+0] * b[0*4+2] + a[2*4+1] * b[1*4+2] + a[2*4+2] * b[2*4+2] + a[2*4+3] * b[3*4+2];
339 outputMatrix[2*4+3] = a[2*4+0] * b[0*4+3] + a[2*4+1] * b[1*4+3] + a[2*4+2] * b[2*4+3] + a[2*4+3] * b[3*4+3];
340 outputMatrix[3*4+0] = a[3*4+0] * b[0*4+0] + a[3*4+1] * b[1*4+0] + a[3*4+2] * b[2*4+0] + a[3*4+3] * b[3*4+0];
341 outputMatrix[3*4+1] = a[3*4+0] * b[0*4+1] + a[3*4+1] * b[1*4+1] + a[3*4+2] * b[2*4+1] + a[3*4+3] * b[3*4+1];
342 outputMatrix[3*4+2] = a[3*4+0] * b[0*4+2] + a[3*4+1] * b[1*4+2] + a[3*4+2] * b[2*4+2] + a[3*4+3] * b[3*4+2];
343 outputMatrix[3*4+3] = a[3*4+0] * b[0*4+3] + a[3*4+1] * b[1*4+3] + a[3*4+2] * b[2*4+3] + a[3*4+3] * b[3*4+3];
352 for (
int i=0; i<16; ++i)
353 destMatrix[i] = sourceMatrix[i];
363 return (VuoPoint3d){matrix[12], matrix[13], matrix[14]};
386 for (
int i=0; i<4; ++i)
387 fprintf(stderr,
"[ %11.6f %11.6f %11.6f %11.6f ]\n",matrix[i+0*4],matrix[i+1*4],matrix[i+2*4],matrix[i+3*4]);
402 point.x * matrix[0] + point.y * matrix[4] + point.z * matrix[ 8] + matrix[12],
403 point.x * matrix[1] + point.y * matrix[5] + point.z * matrix[ 9] + matrix[13],
404 point.x * matrix[2] + point.y * matrix[6] + point.z * matrix[10] + matrix[14]
420 point.x * matrix[0] + point.y * matrix[4] + point.z * matrix[ 8],
421 point.x * matrix[1] + point.y * matrix[5] + point.z * matrix[ 9],
422 point.x * matrix[2] + point.y * matrix[6] + point.z * matrix[10]