62 #define TRACKBALLSIZE (0.8) 79 vset(
float *v,
float x,
float y,
float z)
87 vsub(
const float *src1,
const float *src2,
float *dst)
89 dst[0] = src1[0] - src2[0];
90 dst[1] = src1[1] - src2[1];
91 dst[2] = src1[2] - src2[2];
95 vcopy(
const float *v1,
float *v2)
98 for (i = 0 ; i < 3 ; i++)
107 temp[0] = (v1[1] * v2[2]) - (v1[2] * v2[1]);
108 temp[1] = (v1[2] * v2[0]) - (v1[0] * v2[2]);
109 temp[2] = (v1[0] * v2[1]) - (v1[1] * v2[0]);
116 return sqrt(v[0] * v[0] + v[1] * v[1] + v[2] * v[2]);
134 vdot(
const float *v1,
const float *v2)
136 return v1[0]*v2[0] + v1[1]*v2[1] + v1[2]*v2[2];
140 vadd(
const float *src1,
const float *src2,
float *dst)
142 dst[0] = src1[0] + src2[0];
143 dst[1] = src1[1] + src2[1];
144 dst[2] = src1[2] + src2[2];
160 trackball(
float q[4],
float p1x,
float p1y,
float p2x,
float p2y)
164 float p1[3], p2[3], d[3];
167 if (p1x == p2x && p1y == p2y) {
195 if (t > 1.0) t = 1.0;
196 if (t < -1.0) t = -1.0;
224 if (d < r * 0.70710678118654752440) {
227 t = r / 1.41421356237309504880;
244 #define RENORMCOUNT 97 250 float t1[4], t2[4], t3[4];
262 tf[3] = q1[3] * q2[3] -
vdot(q1,q2);
293 mag = (q[0]*q[0] + q[1]*q[1] + q[2]*q[2] + q[3]*q[3]);
294 for (i = 0; i < 4; i++) q[i] /= mag;
304 m[0][0] = 1.0 - 2.0 * (q[1] * q[1] + q[2] * q[2]);
305 m[0][1] = 2.0 * (q[0] * q[1] - q[2] * q[3]);
306 m[0][2] = 2.0 * (q[2] * q[0] + q[1] * q[3]);
309 m[1][0] = 2.0 * (q[0] * q[1] + q[2] * q[3]);
310 m[1][1]= 1.0 - 2.0 * (q[2] * q[2] + q[0] * q[0]);
311 m[1][2] = 2.0 * (q[1] * q[2] - q[0] * q[3]);
314 m[2][0] = 2.0 * (q[2] * q[0] - q[1] * q[3]);
315 m[2][1] = 2.0 * (q[1] * q[2] + q[0] * q[3]);
316 m[2][2] = 1.0 - 2.0 * (q[1] * q[1] + q[0] * q[0]);
void vset(float *v, float x, float y, float z)
void vadd(const float *src1, const float *src2, float *dst)
static void normalize_quat(float [4])
void vscale(float *v, float div)
void axis_to_quat(float a[3], float phi, float q[4])
float vlength(const float *v)
void vcopy(const float *v1, float *v2)
static float tb_project_to_sphere(float, float, float)
void trackball(float q[4], float p1x, float p1y, float p2x, float p2y)
void add_quats(float q1[4], float q2[4], float dest[4])
__host__ __device__ float3 cross(const float3 &a, const float3 &b)
calculate the cross product between vectors a and b.
float vdot(const float *v1, const float *v2)
void build_rotmatrix(float m[4][4], float q[4])
void vcross(const float *v1, const float *v2, float *cross)
void vsub(const float *src1, const float *src2, float *dst)