MatrixD.rotateAngle constructor

MatrixD.rotateAngle(
  1. Vector3D axis,
  2. double angle
)

Implementation

factory MatrixD.rotateAngle(Vector3D axis, double angle) {
  double x = axis.x, y = axis.y, z = axis.z;

  final lengthSquared = x*x + y*y + z*z;

  if ((lengthSquared != 1.0) && (lengthSquared != 0.0))
  {
    final ilength = 1.0/math.sqrt(lengthSquared);
    x *= ilength;
    y *= ilength;
    z *= ilength;
  }

  final sinres = math.sin(angle);
  final cosres = math.cos(angle);
  final t = 1.0 - cosres;

  MatrixD result = .zero();

  result.m0 = x*x*t + cosres;
  result.m1 = y*x*t + z*sinres;
  result.m2 = z*x*t - y*sinres;

  result.m4 = x*y*t - z*sinres;
  result.m5 = y*y*t + cosres;
  result.m6 = z*y*t + x*sinres;

  result.m8 = x*z*t + y*sinres;
  result.m9 = y*z*t - x*sinres;
  result.m10 = z*z*t + cosres;

  result.m15 = 1.0;

  return result;
}