2
\$\begingroup\$

I am making a simple 3D game with plane in space. With c++ (win32). But the plane rotation is not realistic. The code I am using for the rotation is the following:

point3D AxisRotation(point3D point,point3D Rotation){
float sx = Sin(Rotation.x*PI/180);
float cx = Cos(Rotation.x*PI/180);
float sy = Sin(Rotation.y*PI/180);
float cy = Cos(Rotation.y*PI/180);
float sz = Sin(Rotation.z*PI/180);
float cz = Cos(Rotation.z*PI/180);
float xy,xz, yx,yz, zx,zy;
xy = cx*point.y - sx*point.z;
xz = sx*point.y + cx*point.z;
yz = cy*xz - sy*point.x;
yx = sy*xz + cy*point.x;
zx = cz*yx - sz*xy;
zy = sz*yx + cz*xy;
point.x = zx;
point.y = zy;
point.z = yz;
return point;}

The axis of the rotation needs to be (Roll,Yaw,Pitch). Does anyone know the code or the math for it ? Thank you. Dave

\$\endgroup\$
9
  • 3
    \$\begingroup\$ For your convenience you might want to look into using matrices for your transformations. It will allow you to simplify your code. With respect to your question, have a look at this resource \$\endgroup\$
    – Bart
    Commented Jul 9, 2011 at 11:35
  • \$\begingroup\$ Your question is unclear. Are you trying to determine the axis of rotation generated by this code? Or are you trying to write code which will rotate a point by a given angle around a given axis? \$\endgroup\$
    – Beta
    Commented Jul 9, 2011 at 13:23
  • \$\begingroup\$ im trying to write code which will rotate a point by a given angle. but the rotation needs to be an airplane rotation .. there is a differents rotation codes who made for different things.. im trying to do a rotation that will be similar to Fighter like this-> youtube.com/watch?v=GMsVBTHMK-M with giving the point position in - X Y Z ... and the angles by Roll Yaw Pitch and will return the new X Y Z position also thanks for caring :P \$\endgroup\$
    – Dave
    Commented Jul 9, 2011 at 14:06
  • \$\begingroup\$ @Dave Then look at the resource I provided. \$\endgroup\$
    – Bart
    Commented Jul 9, 2011 at 15:20
  • \$\begingroup\$ yes.. i was taking a look at the resource.. and i coded it.. but still there is a problem with the 3D rotation moving .. you can take a look at the game -> rghost.net/14012601 when your pressing UP ARROW key also the name of this rotation is Euler angles and people using it for camera rotation \$\endgroup\$
    – Dave
    Commented Jul 9, 2011 at 15:47

1 Answer 1

1
\$\begingroup\$

Try this: (You'll need to call this three times, once for Roll, Yaw, and Pitch). This should work, I've used it in my own game, and it has been unit-tested. Of course, if your vector/point class has its overloaded operators defined differently then it may not give similar results. Here is my vector implementation (as of a few months ago).

point3D RotatePointAroundAxis( const point3D& axis, const float
                               radians, const point3D& point )
{
    float matrix[3][3];

    float sn = sinf(radians);
    float cs = cosf(radians);

    float xSin = axis.x * sn;
    float ySin = axis.y * sn;
    float zSin = axis.z * sn;  
    float oneMinusCS = 1.0f - cs;
    float xym = axis.x * axis.y * oneMinusCS;
    float xzm = axis.x * axis.z * oneMinusCS;
    float yzm = axis.y * axis.z * oneMinusCS;

    matrix[0][0] = (axis.x * axis.x) * oneMinusCS + cs;
    matrix[0][1] = xym + zSin;
    matrix[0][2] = xzm - ySin;
    matrix[1][0] = xym - zSin;
    matrix[1][1] = (axis.y * axis.y) * oneMinusCS + cs;
    matrix[1][2] = yzm + xSin;
    matrix[2][0] = xzm + ySin;
    matrix[2][1] = yzm - xSin;
    matrix[2][2] = (axis.z * axis.z) * oneMinusCS + cs;

    return point3D
    (
        matrix[0][0] * point.x + matrix[0][1] * point.y + matrix[0][2] * point.z,

        matrix[1][0] * point.x + matrix[1][1] * point.y + matrix[1][2] * point.z,

        matrix[2][0] * point.x + matrix[2][1] * point.y + matrix[2][2] * point.z
    );   
}

If you're trying to rotate an entire plane then I suspect you have a rotation matrix, if you're using DirectX you could use something like D3DXMatrixRotationRollYawPitch(&mRotation, rotation.y, rotation.x, rotation.z); I'm not sure if that's the exact function name.

\$\endgroup\$

You must log in to answer this question.