2013-01-23 159 views
6

我想实现在clojurescript three.js所的Creating a scene例如在three.js所现场。使用clojurescript渲染HTML页面

我没有做动画,只是想显示静态场景(绿框)。

的问题似乎是在这个函数被调用来渲染场景。

(defn ^:export draw [] 
     (.render renderer scene camera) 
    ) 

这是从HTML调用的。

%script{:type => "text/javascript"} 
     three.demo.draw(); 

它看到并运行抽奖功能,例如,当我把它打印出来“HELLO”的文档的主体。

(.write js/document "HELLO") 

我不知道什么是错的,页面上的其他内容都被渲染。

在这个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> 

<script type='text/javascript'> 
    three.demo.draw(); 
</script> 

下面是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); 

下:在project.clj文件cljsbuild有

:foreign-libs [{:file "https://raw.github.com/mrdoob/three.js/master/build/three.js" 
        :provides ["three"]}] 

我想:实习医生和:外国库既不似乎工作。

+0

我认为,如果你写的完全一样的方法会有所帮助,但在纯JS,所以我们可以消除译码器作为问题。另外,是否有堆栈跟踪是否无错,但什么都不显示? –

回答

4

Creating a scene代码的直接翻译是:

(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) 
    ) 
) 

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