             # add the bounding box to the scene
             @scene.add @boundingBox
 
-            if @_frameLabels?
-                for x in @_frameLabels
-                    @scene.remove x
-
-            if @frameOpts.fontsize isnt 0
-                @_frameLabels = []
-
-                min.divide @opts.aspect_ratio
-                avg.divide @opts.aspect_ratio
-                max.divide @opts.aspect_ratio
-
-                textSize = Math.min(dim.x, dim.y, dim.z)/7
+            if @frameOpts.labels and not @_labeled
+                @_labeled = true
+
+                maxDim = Math.max(dim.x, dim.y, dim.z)
+                textSize = Math.min(dim.x, dim.y, dim.z)/10
                 textDepth = textSize/100
 
                 if textSize is 0
                     return
 
                 frameColor = [@frameColor.r, @frameColor.g, @frameColor.b]
+                offset = maxDim*0.05
 
                 addLabel = (loc, text) =>
-                    @_frameLabels.push(
-                        @add_3dtext
-                            loc           : loc
-                            text          : text
-                            size          : textSize
-                            depth         : textDepth
-                            in_frame      : false
-                            material:
-                                color   : frameColor
-                                opacity : 1
-                        )
-
-                format = (num) ->
+                    loc2 = new THREE.Vector3 loc...
+                    if offsetDirection[0] is '+'
+                        loc2[offsetDirection[1]] += offset*0.75
+                    else if offsetDirection[0] is '-'
+                        loc2[offsetDirection[1]] -= offset*0.75
+                    loc2 = [loc2.x, loc2.y, loc2.z]
+
+                    @add_line
+                            points     : [loc, loc2]
+                            thickness  : @frameOpts.thickness*4
+                            in_frame   : false
+                            material   :
+                                    color   : frameColor
+                                    opacity : 1
+
+                    text = @add_3dtext
+                            loc         : loc
+                            text        : text
+                            size        : textSize
+                            depth       : textDepth
+                            in_frame    : false
+                            material    :
+                                    color   : frameColor
+                                    opacity : 1
+
+                    textBox = text.geometry.boundingBox.size()
+                    extraOffset = Math.max(textBox.x, textBox.y, textBox.z)*0.5
+                    realOffset = offset + extraOffset
+                    if offsetDirection[0] is '+'
+                        text.position[offsetDirection[1]] += realOffset
+                    else if offsetDirection[0] is '-'
+                        text.position[offsetDirection[1]] -= realOffset
+
+                format = (vec, coord) =>
+                    num = vec[coord]/@opts.aspect_ratio[coord]
                     Number(num.toFixed 2).toString()
 
-                offset = 0.075
-
-                e = (max.y - min.y)*offset
-                addLabel [max.x, min.y-e, min.z], format(min.z)
-                addLabel [max.x, min.y-e, avg.z], "z = #{format avg.z}"
-                addLabel [max.x, min.y-e, max.z], format(max.z)
-
-                e = (max.x - min.x)*offset
-                addLabel [max.x+e, min.y, min.z], format(min.y)
-                addLabel [max.x+e, avg.y, min.z], "y = #{format avg.y}"
-                addLabel [max.x+e, max.y, min.z], format(max.y)
-
-                e = (max.y - min.y)*offset
-                addLabel [max.x, max.y+e, min.z], format(max.x)
-                addLabel [avg.x, max.y+e, min.z], "x = #{format avg.x}"
-                addLabel [min.x, max.y+e, min.z], format(min.x)
+                offsetDirection = ['-','y']
+                addLabel [max.x, min.y, min.z], format(min, 'z')
+                addLabel [max.x, min.y, avg.z], "z = #{format avg, 'z'}"
+                addLabel [max.x, min.y, max.z], format(max, 'z')
+
+                offsetDirection = ['+','x']
+                addLabel [max.x, min.y, min.z], format(min, 'y')
+                addLabel [max.x, avg.y, min.z], "y = #{format avg, 'y'}"
+                addLabel [max.x, max.y, min.z], format(max, 'y')
+
+                offsetDirection = ['+','y']
+                addLabel [max.x, max.y, min.z], format(max, 'x')
+                addLabel [avg.x, max.y, min.z], "x = #{format avg, 'x'}"
+                addLabel [min.x, max.y, min.z], format(min, 'x')
 
     add_obj: (opts) ->
         opts = defaults opts,

        if @controls?
            @controls.target = @_center

        if @frameOpts.thickness isnt 0
            # set the color and linewidth of the bounding box
            @boundingBox.material.color = @frameColor
            @boundingBox.material.linewidth = @frameOpts.thickness


            @matrixWorldNeedsUpdate = true

        if opts.rotation?
            mesh.rotation.set opts.rotation...
        else if @_3dText?
            @_3dText.push mesh
        else
            @_3dText = [mesh]

        if opts.in_frame
            @updateBoundingBox mesh
        @scene.add mesh
        return mesh

    add_line: (opts) ->
        opts = defaults opts,
