mathutils: added exponential map to Quaternion
Added conversion to and from exponential map representation. This representation is useful for interpolation of > 2 quaternions, or in PD controllers. Implementation in C functions quat_to_expmap, quat_normalized_to_expmap, and expmap_to_quat with Python API, unit tests and documentation. Added Quaternion.to_exponential_map() and Quaternion(3-vector) to Python API. Reviewers: campbellbarton Projects: #bf_blender Differential Revision: https://developer.blender.org/D1049
This commit is contained in:
@@ -177,6 +177,28 @@ static PyObject *Quaternion_to_axis_angle(QuaternionObject *self)
|
||||
return ret;
|
||||
}
|
||||
|
||||
PyDoc_STRVAR(Quaternion_to_exponential_map_doc,
|
||||
".. method:: to_exponential_map()\n"
|
||||
"\n"
|
||||
" Return the exponential map representation of the quaternion.\n"
|
||||
"\n"
|
||||
" This representation consist of the rotation axis multiplied by the rotation angle."
|
||||
" Such a representation is useful for interpolation between multiple orientations.\n"
|
||||
"\n"
|
||||
" :return: exponential map.\n"
|
||||
" :rtype: :class:`Vector` of size 3\n"
|
||||
);
|
||||
static PyObject *Quaternion_to_exponential_map(QuaternionObject *self)
|
||||
{
|
||||
float expmap[3];
|
||||
|
||||
if (BaseMath_ReadCallback(self) == -1)
|
||||
return NULL;
|
||||
|
||||
quat_to_expmap(expmap, self->quat);
|
||||
return Vector_CreatePyObject(expmap, 3, NULL);
|
||||
}
|
||||
|
||||
PyDoc_STRVAR(Quaternion_cross_doc,
|
||||
".. method:: cross(other)\n"
|
||||
"\n"
|
||||
@@ -1077,9 +1099,24 @@ static PyObject *Quaternion_new(PyTypeObject *type, PyObject *args, PyObject *kw
|
||||
case 0:
|
||||
break;
|
||||
case 1:
|
||||
if (mathutils_array_parse(quat, QUAT_SIZE, QUAT_SIZE, seq, "mathutils.Quaternion()") == -1)
|
||||
{
|
||||
int size;
|
||||
|
||||
if ((size = mathutils_array_parse(quat, 3, QUAT_SIZE, seq, "mathutils.Quaternion()")) == -1) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (size == 4) {
|
||||
/* 4d: Quaternion (common case) */
|
||||
}
|
||||
else {
|
||||
/* 3d: Interpret as exponential map */
|
||||
BLI_assert(size == 3);
|
||||
expmap_to_quat(quat, quat);
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
case 2:
|
||||
{
|
||||
float axis[3];
|
||||
@@ -1156,6 +1193,7 @@ static struct PyMethodDef Quaternion_methods[] = {
|
||||
{"to_euler", (PyCFunction) Quaternion_to_euler, METH_VARARGS, Quaternion_to_euler_doc},
|
||||
{"to_matrix", (PyCFunction) Quaternion_to_matrix, METH_NOARGS, Quaternion_to_matrix_doc},
|
||||
{"to_axis_angle", (PyCFunction) Quaternion_to_axis_angle, METH_NOARGS, Quaternion_to_axis_angle_doc},
|
||||
{"to_exponential_map", (PyCFunction) Quaternion_to_exponential_map, METH_NOARGS, Quaternion_to_exponential_map_doc},
|
||||
|
||||
/* operation between 2 or more types */
|
||||
{"cross", (PyCFunction) Quaternion_cross, METH_O, Quaternion_cross_doc},
|
||||
|
||||
Reference in New Issue
Block a user