Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- function eulerToAxis(%euler)
- {
- %euler = VectorScale(%euler,$pi / 180);
- %matrix = MatrixCreateFromEuler(%euler);
- return getWords(%matrix,3,6);
- }
- function axisToEuler(%axis)
- {
- %angleOver2 = getWord(%axis,3) * 0.5;
- %angleOver2 = -%angleOver2;
- %sinThetaOver2 = mSin(%angleOver2);
- %cosThetaOver2 = mCos(%angleOver2);
- %q0 = %cosThetaOver2;
- %q1 = getWord(%axis,0) * %sinThetaOver2;
- %q2 = getWord(%axis,1) * %sinThetaOver2;
- %q3 = getWord(%axis,2) * %sinThetaOver2;
- %q0q0 = %q0 * %q0;
- %q1q2 = %q1 * %q2;
- %q0q3 = %q0 * %q3;
- %q1q3 = %q1 * %q3;
- %q0q2 = %q0 * %q2;
- %q2q2 = %q2 * %q2;
- %q2q3 = %q2 * %q3;
- %q0q1 = %q0 * %q1;
- %q3q3 = %q3 * %q3;
- %m13 = 2.0 * (%q1q3 - %q0q2);
- %m21 = 2.0 * (%q1q2 - %q0q3);
- %m22 = 2.0 * %q0q0 - 1.0 + 2.0 * %q2q2;
- %m23 = 2.0 * (%q2q3 + %q0q1);
- %m33 = 2.0 * %q0q0 - 1.0 + 2.0 * %q3q3;
- return mRadToDeg(mAsin(%m23)) SPC mRadToDeg(mAtan(-%m13, %m33)) SPC mRadToDeg(mAtan(-%m21, %m22));
- }
- function relativeRotate(%player, %obj, %angle)
- {
- if(!isObject(%player) || !isObject(%obj))
- return;
- %playerX = getWord(%player.position, 0);
- %playerY = getWord(%player.position, 1);
- %objX = getWord(%obj.position, 0);
- %objY = getWord(%obj.position, 1);
- %rads = mDegToRad(%angle);
- %dX = %playerX - %objX;
- %dY = %playerY - %objY;
- %rX = mCos(%rads) * %dX - mSin(%rads) * %dY + %objX;
- %rY = mSin(%rads) * %dX + mCos(%rads) * %dY + %objY;
- %pos = %rX SPC %rY SPC getWord(%player.position, 2);
- %rot = getWords(%player.getTransform(), 3, 6);
- %erot = axisToEuler(%rot);
- %erot = getWords(%erot, 0, 1) SPC (getWord(%erot, 2) + %angle);
- if(getWord(%erot, 2) > 360)
- %erot = vectorSub(%erot, "0 0 360");
- %rot = eulerToAxis(%erot);
- %player.setTransform(%pos SPC %rot);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement