             @opts.height ?= @opts.width*2/3
 
             @setDynamicRenderer()
-            @init_orbit_controls()
             @init_on_mouseover()
 
             # add a bunch of lights

        @maxDim = Math.max dim.x, dim.y, dim.z
        @minDim = Math.min dim.x, dim.y, dim.z

    # always call this after adding things to the scene to make sure track
    # controls are sorted out, etc. The client should never have to worry
    # about calling this

                addLabel [avg.x, max.y, min.z], "x = #{format avg.x}"
                addLabel [min.x, max.y, min.z], format(min.x)

    setCamera: ->
        view_angle = 45
        aspect     = @opts.width/@opts.height
        near = @minDim/4
        far = @maxDim*16

        @camera    = new THREE.PerspectiveCamera view_angle, aspect, near, far
        @camera.up = new THREE.Vector3 0, 0, 1

        @camera.lookAt @center

        @camera.position.set 1.5, 1.5, 0.75
        @camera.position.multiplyScalar(@maxDim).add @center

        @camera.updateProjectionMatrix()

        @scene.add @camera

    runChangeHooks: ->
        if @renderer_type is 'dynamic'
            for hook in @changeHooks
                hook()

            @renderer.render @scene, @camera

    setOrbitControls: ->
        # set up camera controls
        @controls = new OrbitControls @camera, @renderer.domElement

        @controls.target = @center

        @controls.damping = 2
        @controls.noKeys = true
        #@controls.zoomSpeed = 0.6

        if @opts.spin
            if typeof @opts.spin is "boolean"
                @controls.autoRotateSpeed = 2.0
            else
                @controls.autoRotateSpeed = @opts.spin
            @controls.autoRotate = true

        @controls.addEventListener 'change', => @runChangeHooks()

    animate: (opts = {}) ->
        opts = defaults opts,
