patch from Dan Eicher with some edirts.

vec.rotate(axis, angle)
equivalent to...
  vec[:] = vec * mathutils.Quaternion(axis, angle)
This commit is contained in:
2010-09-29 05:15:55 +00:00
parent 2b59013490
commit 7a950c2876
3 changed files with 72 additions and 0 deletions

View File

@@ -686,6 +686,45 @@ static PyObject *Vector_Lerp(VectorObject *self, PyObject *args)
return newVectorObject(vec, self->size, Py_NEW, NULL);
}
/*---------------------------- Vector.rotate(angle, axis) ----------------------*/
static char Vector_Rotate_doc[] =
".. function:: rotate(axis, angle)\n"
"\n"
" Return vector rotated around axis by angle.\n"
"\n"
" :arg axis: rotation axis.\n"
" :type axis: :class:`Vector`\n"
" :arg angle: angle in radians.\n"
" :type angle: float\n"
" :return: an instance of itself\n"
" :rtype: :class:`Vector`\n";
static PyObject *Vector_Rotate(VectorObject *self, PyObject *args)
{
VectorObject *axis_vec = NULL;
float angle, vec[3];
if(!PyArg_ParseTuple(args, "O!f", &vector_Type, &axis_vec, &angle)){
PyErr_SetString(PyExc_TypeError, "vec.rotate(angle, axis): expected angle (float) and 3D axis");
return NULL;
}
if(self->size != 3 || axis_vec->size != 3) {
PyErr_SetString(PyExc_AttributeError, "vec.rotate(angle, axis): expects both vectors to be 3D\n");
return NULL;
}
if(!BaseMath_ReadCallback(self) || !BaseMath_ReadCallback(axis_vec))
return NULL;
rotate_v3_v3v3fl(vec, self->vec, axis_vec->vec, angle);
copy_v3_v3(self->vec, vec);
Py_INCREF(self);
return (PyObject *)self;
}
/*----------------------------Vector.copy() -------------------------------------- */
static char Vector_copy_doc[] =
".. function:: copy()\n"
@@ -2050,6 +2089,7 @@ static struct PyMethodDef Vector_methods[] = {
{"difference", ( PyCFunction ) Vector_Difference, METH_O, Vector_Difference_doc},
{"project", ( PyCFunction ) Vector_Project, METH_O, Vector_Project_doc},
{"lerp", ( PyCFunction ) Vector_Lerp, METH_VARARGS, Vector_Lerp_doc},
{"rotate", ( PyCFunction ) Vector_Rotate, METH_VARARGS, Vector_Rotate_doc},
{"copy", (PyCFunction) Vector_copy, METH_NOARGS, Vector_copy_doc},
{"__copy__", (PyCFunction) Vector_copy, METH_NOARGS, NULL},
{NULL, NULL, 0, NULL}