void Matrix::TurnToVertical (Vector& vPoint, float fAngle) { Vector vToPoint = vPoint - GetPos(); vToPoint.fComp[0] = 0; Vector vForward = GetZ(); vForward.fComp[0] = 0; if (vToPoint == Vector (0,0,0) || vForward == Vector (0,0,0)) return; // if the angle of rotation makes you rotate past the target point, face the target point instead float fFinalAngle = fAngle; float fAngleToPoint = vToPoint.AngleTo (vForward); if (fAngleToPoint < fAngle) fFinalAngle = fAngleToPoint; // find out whether to rotate left or right float yDot = -(GetY() * vToPoint); if (yDot < 0) fFinalAngle = -fFinalAngle; // now for the punchline RotateX (fFinalAngle); }