diff --git a/Vis.cabal b/Vis.cabal
--- a/Vis.cabal
+++ b/Vis.cabal
@@ -1,5 +1,5 @@
 name:                Vis
-version:             0.7.7.0
+version:             0.7.7.1
 stability:           Experimental
 synopsis:            Painless 3D graphics, no affiliation with gloss
 description:{
@@ -30,12 +30,12 @@
                        GLUT                          >= 2.7.0 && < 2.8,
                        OpenGL                        >= 3.0.3 && < 3.1,
                        OpenGLRaw                     >= 3.3.4 && < 3.4,
-                       bytestring                    >= 0.11.4 && < 0.12,
+                       bytestring                    >= 0.11.4 && < 0.13,
                        binary                        >= 0.8.9 && < 0.9,
                        bmp                           >= 1.2.6 && < 1.3,
-                       SpatialMath                   >= 0.2.7 && < 0.3,
                        vector                        >= 0.13.0 && < 0.14,
-                       time                          >= 1.11.1 && < 1.12,
+                       time                          >= 1.11.1 && < 1.13,
+                       linear                        >= 1.22  && < 1.24,
                        vector-binary-instances       >= 0.2.5 && < 0.3
   default-language:    Haskell2010
 
diff --git a/src/Vis/Camera.hs b/src/Vis/Camera.hs
--- a/src/Vis/Camera.hs
+++ b/src/Vis/Camera.hs
@@ -14,7 +14,7 @@
                         )
 import qualified Graphics.UI.GLUT as GLUT
 
-import SpatialMath ( V3(..) )
+import Linear ( V3(..) )
 
 data Camera0 = Camera0 { phi0 :: GLdouble
                        , theta0 :: GLdouble
diff --git a/src/Vis/VisObject.hs b/src/Vis/VisObject.hs
--- a/src/Vis/VisObject.hs
+++ b/src/Vis/VisObject.hs
@@ -29,10 +29,31 @@
                         , ($=)
                         )
 
-import SpatialMath
+--import SpatialMath (Euler(..))
+import Linear (V3(..),Quaternion,M33,fromQuaternion)
 
 import qualified Vis.GlossColor as GlossColor
 
+-- | 3-2-1 Euler angle rotation sequence
+data Euler a = Euler { eYaw :: a
+                     , ePitch :: a
+                     , eRoll :: a
+                     } deriving (Eq, Show, Functor, Ord, Generic)
+--                     } deriving (Eq, Show, Functor, Foldable, Traversable, Ord)
+
+instance B.Binary a => B.Binary (Euler a)
+
+dcmOfQuat :: Num a => Quaternion a -> M33 a
+dcmOfQuat q = V3
+              (V3 m11 m21 m31)
+              (V3 m12 m22 m32)
+              (V3 m13 m23 m33)
+  where
+    V3
+      (V3 m11 m12 m13)
+      (V3 m21 m22 m23)
+      (V3 m31 m32 m33) = fromQuaternion q
+
 glColorOfColor :: GlossColor.Color -> Color4 GLfloat
 glColorOfColor = (\(r,g,b,a) -> fmap realToFrac (Color4 r g b a)) . GlossColor.rgbaOfColor
 
@@ -348,7 +369,7 @@
         coneHeight = 2*coneRadius
 
         rotAngle = acos(z/(sqrt(x*x + y*y + z*z) + 1e-15))*180/pi :: GLdouble
-        rotAxis = Vector3 (-y) x 0
+        rotAxis = Vector3 (-y + 1e-15) x 0
 
     GLUT.rotate rotAngle rotAxis
 
