Hi<br>concerning alignToNormal(vect), I&#39;m not in the developper team but am Game Engine user and this is cool for me to have this patch integrated ! Now I&#39;d propose something a bit further for this very function.<br>
the behaviour for the current implementation is to align axis Z with a given vector. Now what if we would like to have some other axis than the Z one aligned with a vector ?<br><br>I&#39;d propose to have the given function signature instead: noReturn alignAxisToVector(str objectAxisName, bool localOrGlobal, vector vectorToAlignGivenObjectAxisTo)<br>
where objectAxisName is &quot;+/-X/Y/Z&quot; and the rest I&#39;ll let you guess.<br><br>What do you think ?<br><br>Jonathan<br><br><div class="gmail_quote">On Tue, May 6, 2008 at 2:47 AM, José Ignacio Romero &lt;<a href="mailto:jose.cyborg@gmail.com">jose.cyborg@gmail.com</a>&gt; wrote:<br>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">Here is a patch for Ketsji that improves getLinearVelocity, adding the posibility of getting the local velocity and adds one new function for aligning the object to a given normal vector: allignToNormal(vect) (really useful for f-zero style racing games and others that need realtime slopes) i couldn&#39;t separate the functions in two patches, so i send the big patch here. (the getLinearVelocity improvement alone can be found here too: <a href="https://projects.blender.org/tracker/index.php?func=detail&amp;aid=10492&amp;group_id=9&amp;atid=127" target="_blank">https://projects.blender.org/tracker/index.php?func=detail&amp;aid=10492&amp;group_id=9&amp;atid=127</a>)<br>
<font color="#888888">
<br>
-- <br>
Q: &nbsp; &nbsp; &nbsp;What is purple and concord the world?<br>
A: &nbsp; &nbsp; &nbsp;Alexander the Grape.<br>
<br>
</font><br>Index: source/gameengine/Ketsji/KX_GameObject.cpp<br>
===================================================================<br>
--- source/gameengine/Ketsji/KX_GameObject.cpp &nbsp;(revisión: 14651)<br>
+++ source/gameengine/Ketsji/KX_GameObject.cpp &nbsp;(copia de trabajo)<br>
@@ -579,18 +579,42 @@<br>
 &nbsp; &nbsp; &nbsp; &nbsp;m_objectColor = rgbavec;<br>
&nbsp;}<br>
<br>
+void KX_GameObject::AlignToNormal(const MT_Vector3&amp; normal)<br>
+{<br>
+ &nbsp; &nbsp; &nbsp; MT_Matrix3x3 orimat;<br>
+ &nbsp; &nbsp; &nbsp; MT_Vector3 ori,z,x,y;<br>
+ &nbsp; &nbsp; &nbsp; orimat = GetSGNode()-&gt;GetWorldOrientation();<br>
+ &nbsp; &nbsp; &nbsp; ori = MT_Vector3(orimat[0][1], orimat[1][1], orimat[2][1]);<br>
+ &nbsp; &nbsp; &nbsp; z = normal;<br>
+ &nbsp; &nbsp; &nbsp; x = ori.cross(z);<br>
+ &nbsp; &nbsp; &nbsp; y = z.cross(x);<br>
+ &nbsp; &nbsp; &nbsp; orimat = MT_Matrix3x3( &nbsp;x[0],y[0],z[0],<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; x[1],y[1],z[1],<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; x[2],y[2],z[2]);<br>
+ &nbsp; &nbsp; &nbsp; NodeSetLocalOrientation(orimat);<br>
+}<br>
<br>
-<br>
-MT_Vector3 KX_GameObject::GetLinearVelocity()<br>
+MT_Vector3 KX_GameObject::GetLinearVelocity(bool local)<br>
&nbsp;{<br>
 &nbsp; &nbsp; &nbsp; &nbsp;MT_Vector3 velocity(0.0,0.0,0.0);<br>
-<br>
+ &nbsp; &nbsp; &nbsp; MT_Matrix3x3 ori, locvel;<br>
+ &nbsp; &nbsp; &nbsp; int i, j;<br>
 &nbsp; &nbsp; &nbsp; &nbsp;if (m_pPhysicsController1)<br>
 &nbsp; &nbsp; &nbsp; &nbsp;{<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;velocity = m_pPhysicsController1-&gt;GetLinearVelocity();<br>
+<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (local)<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ori = GetSGNode()-&gt;GetWorldOrientation();<br>
+<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; for(i=0; i &lt; 3; i++)<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; for(j=0; j &lt; 3; j++)<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; locvel[i][j]= velocity[i]*ori[i][j];<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; for(i=0; i &lt; 3; i++)<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; velocity[i] = locvel[0][i] + locvel[1][i] + locvel[2][i];<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<br>
 &nbsp; &nbsp; &nbsp; &nbsp;}<br>
- &nbsp; &nbsp; &nbsp; return velocity;<br>
-<br>
+ &nbsp; &nbsp; &nbsp; return velocity;<br>
&nbsp;}<br>
<br>
<br>
@@ -711,6 +735,7 @@<br>
<br>
&nbsp;PyMethodDef KX_GameObject::Methods[] = {<br>
 &nbsp; &nbsp; &nbsp; &nbsp;{&quot;setVisible&quot;,(PyCFunction) KX_GameObject::sPySetVisible, METH_VARARGS},<br>
+ &nbsp; &nbsp; &nbsp; {&quot;alignToNormal&quot;,(PyCFunction) KX_GameObject::sPyAlignToNormal, METH_VARARGS},<br>
 &nbsp; &nbsp; &nbsp; &nbsp;{&quot;setPosition&quot;, (PyCFunction) KX_GameObject::sPySetPosition, METH_VARARGS},<br>
 &nbsp; &nbsp; &nbsp; &nbsp;{&quot;getPosition&quot;, (PyCFunction) KX_GameObject::sPyGetPosition, METH_VARARGS},<br>
 &nbsp; &nbsp; &nbsp; &nbsp;{&quot;getOrientation&quot;, (PyCFunction) KX_GameObject::sPyGetOrientation, METH_VARARGS},<br>
@@ -948,7 +973,15 @@<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; PyObject* kwds)<br>
&nbsp;{<br>
 &nbsp; &nbsp; &nbsp; &nbsp;// only can get the velocity if we have a physics object connected to us...<br>
- &nbsp; &nbsp; &nbsp; return PyObjectFrom(GetLinearVelocity());<br>
+ &nbsp; &nbsp; &nbsp; int local = 0;<br>
+ &nbsp; &nbsp; &nbsp; if (PyArg_ParseTuple(args,&quot;|i&quot;,&amp;local))<br>
+ &nbsp; &nbsp; &nbsp; {<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return PyObjectFrom(GetLinearVelocity((local!=0)));<br>
+ &nbsp; &nbsp; &nbsp; }<br>
+ &nbsp; &nbsp; &nbsp; else<br>
+ &nbsp; &nbsp; &nbsp; {<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return NULL;<br>
+ &nbsp; &nbsp; &nbsp; }<br>
&nbsp;}<br>
<br>
<br>
@@ -1234,8 +1267,24 @@<br>
 &nbsp; &nbsp; &nbsp; &nbsp;return NULL;<br>
&nbsp;}<br>
<br>
+PyObject* KX_GameObject::PyAlignToNormal(PyObject* self,<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; PyObject* args,<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; PyObject* kwds)<br>
+{<br>
+ &nbsp; &nbsp; &nbsp; PyObject* pynormal;<br>
+<br>
+ &nbsp; &nbsp; &nbsp; if (PyArg_ParseTuple(args,&quot;O&quot;,&amp;pynormal))<br>
+ &nbsp; &nbsp; &nbsp; {<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; MT_Vector3 normal;<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (PyVecTo(pynormal, normal))<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; AlignToNormal(normal);<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Py_Return;<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<br>
+ &nbsp; &nbsp; &nbsp; }<br>
+ &nbsp; &nbsp; &nbsp; return NULL;<br>
+}<br>
<br>
-<br>
&nbsp;PyObject* KX_GameObject::PySetPosition(PyObject* self,<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; PyObject* args,<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; PyObject* kwds)<br>
Index: source/gameengine/Ketsji/KX_GameObject.h<br>
===================================================================<br>
--- source/gameengine/Ketsji/KX_GameObject.h &nbsp; &nbsp;(revisión: 14651)<br>
+++ source/gameengine/Ketsji/KX_GameObject.h &nbsp; &nbsp;(copia de trabajo)<br>
@@ -252,11 +252,20 @@<br>
 &nbsp; &nbsp; &nbsp; &nbsp;/**<br>
 &nbsp; &nbsp; &nbsp; &nbsp; * Return the linear velocity of the game object.<br>
 &nbsp; &nbsp; &nbsp; &nbsp; */<br>
- &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; MT_Vector3<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; MT_Vector3<br>
 &nbsp; &nbsp; &nbsp; &nbsp;GetLinearVelocity(<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; bool local=false<br>
 &nbsp; &nbsp; &nbsp; &nbsp;);<br>
<br>
 &nbsp; &nbsp; &nbsp; &nbsp;/**<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;* Align the object to a given normal.<br>
+ &nbsp; &nbsp; &nbsp; &nbsp;*/<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; void<br>
+ &nbsp; &nbsp; &nbsp; AlignToNormal(<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; const MT_Vector3&amp; normal<br>
+ &nbsp; &nbsp; &nbsp; );<br>
+<br>
+ &nbsp; &nbsp; &nbsp; /**<br>
 &nbsp; &nbsp; &nbsp; &nbsp; * Quick&#39;n&#39;dirty obcolor ipo stuff<br>
 &nbsp; &nbsp; &nbsp; &nbsp; */<br>
<br>
@@ -644,6 +653,7 @@<br>
 &nbsp; &nbsp; &nbsp; &nbsp;KX_PYMETHOD(KX_GameObject,GetOrientation);<br>
 &nbsp; &nbsp; &nbsp; &nbsp;KX_PYMETHOD(KX_GameObject,SetOrientation);<br>
 &nbsp; &nbsp; &nbsp; &nbsp;KX_PYMETHOD(KX_GameObject,SetVisible);<br>
+ &nbsp; &nbsp; &nbsp; KX_PYMETHOD(KX_GameObject,AlignToNormal);<br>
 &nbsp; &nbsp; &nbsp; &nbsp;KX_PYMETHOD(KX_GameObject,SuspendDynamics);<br>
 &nbsp; &nbsp; &nbsp; &nbsp;KX_PYMETHOD(KX_GameObject,RestoreDynamics);<br>
 &nbsp; &nbsp; &nbsp; &nbsp;KX_PYMETHOD(KX_GameObject,EnableRigidBody);<br>
Index: source/gameengine/PyDoc/KX_GameObject.py<br>
===================================================================<br>
--- source/gameengine/PyDoc/KX_GameObject.py &nbsp; &nbsp;(revisión: 14651)<br>
+++ source/gameengine/PyDoc/KX_GameObject.py &nbsp; &nbsp;(copia de trabajo)<br>
@@ -51,6 +51,13 @@<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;@type orn: 3x3 rotation matrix, or Quaternion.<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;@param orn: a rotation matrix specifying the new rotation.<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&quot;&quot;&quot;<br>
+ &nbsp; &nbsp; &nbsp; def alignToNormal(normal):<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &quot;&quot;&quot;<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Aligns the game object&#39;s Z axis along the given normal.<br>
+<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; @type normal: 3d vector.<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; @param normal: a normal vector to align the object.<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &quot;&quot;&quot;<br>
 &nbsp; &nbsp; &nbsp; &nbsp;def getOrientation():<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&quot;&quot;&quot;<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Gets the game object&#39;s orientation.<br>
@@ -58,15 +65,16 @@<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;@rtype: 3x3 rotation matrix<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;@return: The game object&#39;s rotation matrix<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&quot;&quot;&quot;<br>
- &nbsp; &nbsp; &nbsp; def getLinearVelocity():<br>
+ &nbsp; &nbsp; &nbsp; def getLinearVelocity(local):<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&quot;&quot;&quot;<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Gets the game object&#39;s linear velocity.<br>
<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;This method returns the game object&#39;s velocity through it&#39;s centre of mass,<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ie no angular velocity component.<br>
<br>
- &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; cf getVelocity()<br>
-<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; @type local: boolean<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; @param local: - False: you get the &quot;global&quot; velocity ie: relative to world orientation.<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; - True: you get the &quot;local&quot; velocity ie: relative to object orientation.<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;@rtype: list [vx, vy, vz]<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;@return: the object&#39;s linear velocity.<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&quot;&quot;&quot;<br>
@@ -138,6 +146,9 @@<br>
 &nbsp; &nbsp; &nbsp; &nbsp;def setParent(parent):<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&quot;&quot;&quot;<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Sets this object&#39;s parent.<br>
+<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; @type parent: L{KX_GameObject}<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; @param parent: new parent object.<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&quot;&quot;&quot;<br>
 &nbsp; &nbsp; &nbsp; &nbsp;def removeParent():<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&quot;&quot;&quot;<br>
<br>
<br>_______________________________________________<br>
Bf-committers mailing list<br>
<a href="mailto:Bf-committers@blender.org">Bf-committers@blender.org</a><br>
<a href="http://lists.blender.org/mailman/listinfo/bf-committers" target="_blank">http://lists.blender.org/mailman/listinfo/bf-committers</a><br>
<br></blockquote></div><br><br clear="all"><br>-- <br><a href="http://www.jaxtr.com/myselfhimself">http://www.jaxtr.com/myselfhimself</a>