9

clojurescript で three.jsのシーンの作成例を実装しようとしています。

私はアニメーションを行っておらず、静的なシーン (緑色のブロック) を表示したいだけです。

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

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

以下は、clojurescript ファイルから作成された Javascript である 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"]}]

:externs と :foreign-libs を試しましたが、どちらも機能しないようです。

4

1 に答える 1

8

The direct translation of the Creating a scene code would be:

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

This is not using :foreign-libs and :require; it uses the direct JS interop and assumes that three.js was previously loaded. It can be probably done in a nicer way, but this is a one-to-one translation that works.

于 2013-08-29T10:05:33.510 に答える