dogdemir
02-23-2009, 12:53 PM
Hi all,
I'm using Euler's rotation matrix for rotation about an arbitrary 3D axis. The problem is that if I rotate for a long time or in great angles, it seems like the precision is lost (at least that's what I think the problem is) and the model starts scaling up quickly. What do you guys think about a way of fixing this?
Thanks,
md2model1_->rotate( dt * 10, Vec3D( 1, 1, 0 ) );
void
Entity::rotate( float angle, Vec3D axis )
{
Mat44 tMat;
float c = cos(angle);
float s = sin(angle);
float mc = 1 - c;
float axy = axis.y * axis.x;
float axz = axis.z * axis.x;
float azy = axis.z * axis.y;
float saxx = s * axis.x;
float saxy = s * axis.y;
float saxz = s * axis.z;
float mxaxysqr = mc * axis.y * axis.y;
float mazy = mc * azy;
float maxz = mc * axz;
float maxy = mc * axy;
tMat.x11 = c + mc * axis.x * axis.x;
tMat.x12 = maxy - saxz;
tMat.x13 = maxz + saxy;
tMat.x21 = maxy + saxz;
tMat.x22 = c + mxaxysqr;
tMat.x23 = mazy - saxx;
tMat.x31 = maxz - saxy;
tMat.x32 = mazy + saxx;
tMat.x33 = c + mxaxysqr;
//Apply the transformation matrix to the model's xformation.
tMatrix_ = tMatrix_ * tMat;
//Save the new axis.
xAxis_ = tMat * xAxis_; xAxis_.normalize();
yAxis_ = tMat * yAxis_; yAxis_.normalize();
zAxis_ = tMat * zAxis_; zAxis_.normalize();
}
I'm using Euler's rotation matrix for rotation about an arbitrary 3D axis. The problem is that if I rotate for a long time or in great angles, it seems like the precision is lost (at least that's what I think the problem is) and the model starts scaling up quickly. What do you guys think about a way of fixing this?
Thanks,
md2model1_->rotate( dt * 10, Vec3D( 1, 1, 0 ) );
void
Entity::rotate( float angle, Vec3D axis )
{
Mat44 tMat;
float c = cos(angle);
float s = sin(angle);
float mc = 1 - c;
float axy = axis.y * axis.x;
float axz = axis.z * axis.x;
float azy = axis.z * axis.y;
float saxx = s * axis.x;
float saxy = s * axis.y;
float saxz = s * axis.z;
float mxaxysqr = mc * axis.y * axis.y;
float mazy = mc * azy;
float maxz = mc * axz;
float maxy = mc * axy;
tMat.x11 = c + mc * axis.x * axis.x;
tMat.x12 = maxy - saxz;
tMat.x13 = maxz + saxy;
tMat.x21 = maxy + saxz;
tMat.x22 = c + mxaxysqr;
tMat.x23 = mazy - saxx;
tMat.x31 = maxz - saxy;
tMat.x32 = mazy + saxx;
tMat.x33 = c + mxaxysqr;
//Apply the transformation matrix to the model's xformation.
tMatrix_ = tMatrix_ * tMat;
//Save the new axis.
xAxis_ = tMat * xAxis_; xAxis_.normalize();
yAxis_ = tMat * yAxis_; yAxis_.normalize();
zAxis_ = tMat * zAxis_; zAxis_.normalize();
}