[Bf-committers] Cool BGE patches
José Ignacio Romero
jose.cyborg at gmail.com
Wed May 7 21:21:53 CEST 2008
> On Tue, May 6, 2008 at 2:47 AM, José Ignacio Romero <jose.cyborg at gmail.com>
> wrote:
>> 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't separate the functions in two patches, so i send the big patch
>> here. (the getLinearVelocity improvement alone can be found here too:
>> https://projects.blender.org/tracker/index.php?func=detail&aid=10492&group_id=9&atid=127
>> )
> concerning alignToNormal(vect), I'm not in the developper team but am Game
> Engine user and this is cool for me to have this patch integrated ! Now I'd
> propose something a bit further for this very function.
> 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 ?
>
> I'd propose to have the given function signature instead: noReturn
> alignAxisToVector(str objectAxisName, bool localOrGlobal, vector
> vectorToAlignGivenObjectAxisTo)
> where objectAxisName is "+/-X/Y/Z" and the rest I'll let you guess.
>
> What do you think ?
>
> Jonathan
>
Good idea, i expanded the function this way:
void KX_GameObject::AlignAxisToVect(const MT_Vector3& vect, int axis)
{
MT_Matrix3x3 orimat;
MT_Vector3 ori,z,x,y;
orimat = GetSGNode()->GetWorldOrientation();
switch (axis)
{
case 0: //x axis
ori = MT_Vector3(orimat[0][2], orimat[1][2], orimat[2][2]);
x = vect;
y = ori.cross(z);
z = x.cross(y);
break;
case 1: //y axis
ori = MT_Vector3(orimat[0][0], orimat[1][0], orimat[2][0]);
y = vect;
z = ori.cross(y);
x = y.cross(z);
break;
case 2: //z axis
ori = MT_Vector3(orimat[0][1], orimat[1][1], orimat[2][1]);
z = vect;
x = ori.cross(z);
y = z.cross(x);
break;
default:
return;
}
orimat = MT_Matrix3x3( x[0],y[0],z[0],
x[1],y[1],z[1],
x[2],y[2],z[2]);
NodeSetLocalOrientation(orimat);
}
to get the negative axes, just invert the input vector, (this can be
done in the "python integration" function ie: PyAlignAxisToVect())
More information about the Bf-committers
mailing list