2013-01-23 13 views
6

クロージャススクリプトでthree.jsのCreating a sceneの例を実装しようとしています。Clijurescriptを使用してHTMLページのThree.jsシーンをレンダリングする

私はアニメーションをやっておらず、スタティックシーン(緑色のブロック)を表示したいだけです。

シーンをレンダリングするために呼び出されたこの関数に問題があるようです。

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

これがHTMLからの呼び出しです。

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

たとえば、ドキュメントの本文に「HELLO」を印刷すると、描画機能が表示され、実行されます。

(.write js/document "HELLO") 

私は何が間違っているのか分かりません。ページのその他すべてがレンダリングされます。私は

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

を持って、このHTMLファイルで

は、Javascriptがclojurescriptファイルから作成された、main.jsの終わりです。アンダー

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"]}] 

を持っている私が試した:外部宣言と:外国-LIBSとどちらも動作するようですが。

+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が以前にロードされていることを前提としています。これはおそらくより良い方法で行うことができますが、これは動作する1対1の翻訳です。

関連する問題