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,似乎都不起作用.
创建场景代码的直接翻译是:
(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。可能可以用更好的方法来完成,但这是一对一的翻译。