}
if( asSeenBy==null ) {
asSeenBy = (ReferenceFrame)getParent();
}
Matrix44 transform = getTransformation( asSeenBy );
Vector3 position = transform.getPosition();
//Vector3 position = new Vector3( transform.m30, transform.m31, transform.m32 );
ReferenceFrame actualTarget;
if( offset==null ) {
actualTarget = target;
} else {
s_calculatePointAtHelperOffset.setParent( target );
Matrix44 m = new Matrix44();
m.m30 = offset.x;
m.m31 = offset.y;
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() );