使用clojurescript在HTML页面上渲染Three.js场景

Kao*_*shi 7 html three.js clojurescript

我正在尝试在clojurescript中为three.js 创建一个场景示例.

我不是在做动画而只想显示静态场景(绿色块).

问题似乎出现在此函数中,该函数被调用以渲染场景.

    (defn ^:export draw []
      (.render renderer scene camera)
    )
Run Code Online (Sandbox Code Playgroud)

这是从HTML进行调用的内容.

    %script{:type => "text/javascript"}
      three.demo.draw();
Run Code Online (Sandbox Code Playgroud)

它会看到并运行绘图功能,例如,当我将"HELLO"打印到文档正文时.

    (.write js/document "HELLO")
Run Code Online (Sandbox Code Playgroud)

我不知道什么是错的,页面上的其他内容都会呈现.

在这个HTML文件中,我有

<script src='https://raw.github.com/mrdoob/three.js/master/build/three.js'></script>
<script src='js/main.js' type='text/javascript'></script>
<script type='text/javascript'>goog.require('main')</script>
Run Code Online (Sandbox Code Playgroud)

<script type='text/javascript'>
  three.demo.draw();
</script>
Run Code Online (Sandbox Code Playgroud)

下面是main.js的结尾,它是从clojurescript文件创建的Javascript.

    goog.provide("three.demo");
    goog.require("cljs.core");
    goog.require("goog.dom");
    three.demo.scene = new THREE.Scene;
    three.demo.camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1E3);
    three.demo.renderer = new THREE.WebGLRenderer;
    three.demo.renderer.setSize(window.innerWidth, window.innerHeight);
    document.body.appendChild(three.demo.renderer.domElement);
    three.demo.geometry = new THREE.CubeGeometry(1, 1, 1);
    three.demo.material = new THREE.MeshBasicMaterial(cljs.core.ObjMap.fromObject(["\ufdd0'color"], {"\ufdd0'color":255}));
    three.demo.cube = new THREE.Mesh(three.demo.geometry, three.demo.material);
    three.demo.scene.add(three.demo.cube);
    three.demo.camera.position.setZ(5);
    three.demo.draw = function draw() {
      three.demo.renderer.render(three.demo.scene, three.demo.camera);
      return document.write("HELLO")
    };
    goog.exportSymbol("three.demo.draw", three.demo.draw);
Run Code Online (Sandbox Code Playgroud)

在:project.clj文件中的cljsbuild

    :foreign-libs [{:file "https://raw.github.com/mrdoob/three.js/master/build/three.js"
                    :provides ["three"]}]
Run Code Online (Sandbox Code Playgroud)

我试过:externs和:foreign-libs,似乎都不起作用.

f3l*_*lix 5

创建场景代码的直接翻译是:

(defn ^:export example []
  (let [scene (js/THREE.Scene.)
        width (.-innerWidth js/window)
        height (.-innerHeight js/window)
        camera (js/THREE.PerspectiveCamera. 75 (/ width height) 0.1 1000 )
        renderer (js/THREE.CanvasRenderer.)
        geometry (js/THREE.CubeGeometry. 1 1 1)
        material (js/THREE.MeshBasicMaterial. (clj->js {:color 0x00ff00}))
        cube (js/THREE.Mesh. geometry material)
        render (fn cb []
                   (js/requestAnimationFrame cb) 
                   (set! (.-x (.-rotation cube))  (+ 0.1 (.-x (.-rotation cube))) )
                   (set! (.-y (.-rotation cube))  (+ 0.1 (.-y (.-rotation cube))) )
                   (.render renderer scene camera)
                 ) 
        ]
    (.setSize renderer width height)
    (.appendChild js/document.body (.-domElement renderer) )
    (.add scene cube)
    (set! (.-z (.-position camera))  5)
    (render)
    )
  )
Run Code Online (Sandbox Code Playgroud)

这不是使用:foreign-libs:require; 它使用直接JS互操作,并假定先前已加载three.js。可能可以用更好的方法来完成,但这是一对一的翻译。