m.m32 = offset.z;
s_calculatePointAtHelperOffset.setLocalTransformation( m );
actualTarget = s_calculatePointAtHelperOffset;
}
Matrix33 result;
if( onlyAffectYaw ) {
// setup "helperA" with the orientation of "asSeenBy" and the position of "this"
s_calculatePointAtHelperA.setParent( asSeenBy );
s_calculatePointAtHelperA.setLocalTransformation( new Matrix44() );
s_calculatePointAtHelperA.setPosition( Vector3.ZERO, this );
// calculate the angle of rotation around y of "actualTarget" as seen by "helperA"
Vector3 targetPosition = actualTarget.getPosition( s_calculatePointAtHelperA );
double targetTheta = Math.atan2( targetPosition.x, targetPosition.z );
// place "helperB" out in front of "this"
s_calculatePointAtHelperB.setParent( this );
s_calculatePointAtHelperB.setPosition( MathUtilities.getZAxis(), this );
// calculate the angle of rotation around Y of "helperB" as seen by "helperA"
Vector3 forwardPosition = s_calculatePointAtHelperB.getPosition( s_calculatePointAtHelperA );
double forwardTheta = Math.atan2( forwardPosition.x, forwardPosition.z );
// setup "helperB" to have position and orientation of "this"
s_calculatePointAtHelperB.setLocalTransformation( new Matrix44() );
// calculate how much to rotate
double deltaTheta = targetTheta - forwardTheta;
// rotate "helperB" around Y as seen by "helperA"
s_calculatePointAtHelperB.rotate( MathUtilities.getYAxis(), deltaTheta, s_calculatePointAtHelperA );
// extract result
result = s_calculatePointAtHelperB.getAxes( asSeenBy );
// clean up
s_calculatePointAtHelperA.setParent( null );
s_calculatePointAtHelperB.setParent( null );
} else {
javax.vecmath.Vector3d targetPosition = actualTarget.getPosition( asSeenBy );
javax.vecmath.Vector3d zAxis = MathUtilities.normalizeV( MathUtilities.subtract( targetPosition, position ) );
javax.vecmath.Vector3d xAxis = MathUtilities.normalizeV( MathUtilities.crossProduct( upGuide, zAxis ) );
if( Double.isNaN( xAxis.lengthSquared() ) ) {
throw new RuntimeException( "cannot calculate point at: zAxis=" + zAxis + " upGuide=" + upGuide );
}
javax.vecmath.Vector3d yAxis = MathUtilities.crossProduct( zAxis, xAxis );
result = new Matrix33( xAxis, yAxis, zAxis );
}
if( offset==null ) {
s_calculatePointAtHelperOffset.setParent( null );
}