| Blockland Forums > Modification Help |
| Vector Rotation |
| (1/1) |
| Port:
How would I go about rotating for example the vector 1 0 -1 95 by 0 0 1 45? I tried making my own function, but that doesn't work properly at all: --- Code: ---function rotateVector( %a, %b ) { %alh = getWords( %a, 0, 2 ); %bet = getWords( %b, 0, 2 ); %gam = vectorAdd( %alh, %bet ); %ga = getWord( %gam, 0 ); %gb = getWord( %gam, 1 ); %gc = getWord( %gam, 2 ); if ( %ga > 1 ) %ga -= 2; if ( %gb > 1 ) %gb -= 2; if ( %gc > 1 ) %gc -= 2; if ( %ga < 1 ) %ga += 2; if ( %gb < 1 ) %gb += 2; if ( %gc < 1 ) %gc += 2; return %ga SPC %gb SPC %gc SPC getWord( %a, 0, 3 ); } --- End code --- |
| Destiny/Zack0Wack0:
Do you need it in axis form? You can do it with euler angles like so: --- Code: ---function rotateVector(%a,%b) { %pi = 3.141592653589793; %x = getWord(%a,0); %y = getWord(%a,1); %z = getWord(%a,2); %rotX = getWord(%b,0) * %pi / 180; %rotY = getWord(%b,1) * %pi / 180; %rotZ = getWord(%b,2) * %pi / 180; %x = %x * mCos(%rotZ) - %y * mSin(%rotZ); %y = %x * mSin(%rotZ) + %y * mCos(%rotZ); %y = %y * mCos(%rotX) - %z * mSin(%rotX); %z = %y * mSin(%rotX) + %z * mCos(%rotX); %z = %z * mCos(%rotY) - %x * mSin(%rotY); %x = %z * mSin(%rotY) + %x * mCos(%rotY); return %x SPC %y SPC %z; } --- End code --- If you need the output in axis form, you can convert it between euler and axis angles. |
| Port:
--- Quote from: Destiny/Zack0Wack0 on December 11, 2011, 12:16:41 AM ---Do you need it in axis form? You can do it with euler angles like so: --- Code: --- --- End code --- If you need the output in axis form, you can convert it between euler and axis angles. --- End quote --- --- Code: ---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 rotateEulerVector(%a,%b) { %pi = 3.141592653589793; %x = getWord(%a,0); %y = getWord(%a,1); %z = getWord(%a,2); %rotX = getWord(%b,0) * %pi / 180; %rotY = getWord(%b,1) * %pi / 180; %rotZ = getWord(%b,2) * %pi / 180; %x = %x * mCos(%rotZ) - %y * mSin(%rotZ); %y = %x * mSin(%rotZ) + %y * mCos(%rotZ); %y = %y * mCos(%rotX) - %z * mSin(%rotX); %z = %y * mSin(%rotX) + %z * mCos(%rotX); %z = %z * mCos(%rotY) - %x * mSin(%rotY); %x = %z * mSin(%rotY) + %x * mCos(%rotY); return %x SPC %y SPC %z; } function rotateAxisVector(%a,%b) { return eulerToAxis(rotateEulerVector(axisToEuler(%a), axisToEuler(%b))); } --- End code --- Okay, thanks. I'll try that shortly. |
| Navigation |
| Message Index |