Amy Mercury
( or Amy Iodyne )
well yesterday i didnt finish the mcjAimAnim
but i found out information which will help me in the future
notably: the getXAxis() function in DS4 ( maybe DS3 too ) returns non-normalized vectors
the getAngleTo() function returns absolute value of the rotation angle
this function here seems to work
let vn = Q.getXAxis()
v1 and v2 have been projected on the XAxis (normal) plane
we want to rotate v1 around the X axis until it's oriented like v2
this seems to work
function getAngleTo( v1, v2, vn )
{
v1.normalize();
v2.normalize();
var ca = v1.dot( v2 );
var angle = Math.acos( ca );
cp = v1.cross( v2 );
cp.normalize();
if( vn.dot( cp ) < 0 )
{
angle = -angle;
}
return( angle );
}
then we add this angle to the joint's XRotation ( Euler ) angle
function rotateX( t, limbRoot, currnt, wanted )
{
var axis = limbRoot.getWSRot( t ).getXAxis();
var a = degrees * rotate( axis, t, limbRoot, currnt, wanted );
var ctl = limbRoot.getXRotControl();
ctl.setValue( t, ctl.getValue( t ) + a );
}
function rotate( axis, t, limbRoot, currnt, wanted )
{
//todo it's a vector we project on the plane,
//make sure we do this properly
currnt = projectPointOnPlane( currnt, axis );
wanted = projectPointOnPlane( wanted, axis );
var a = getAngleTo( currnt, wanted, axis );
return( a );
}
function projectPointOnPlane( p, n )
{
n = n.normalized();
var t = p.dot( n );
var v = new DzVec3( p.x - t * n.x, p.y - t * n.y, p.z - t * n.z );
return( v );
}

No comments:
Post a Comment