需要clojurescript相当于一个three.js javascript'loadTexture'语句

时间:2015-02-14 07:50:50

标签: javascript clojure three.js clojurescript

我正在尝试将图像应用于three.js(3js)项目中的多维数据集。我在clojurescript(cljs)中写它。为此,您需要将图像从磁盘加载并将其应用于材质。原始JavaScript语句如下所示:

var material = new THREE.MeshPhongMaterial({map:THREE.ImageUtils.loadTexture("images/webgl-logo-256.jpg")})

我能在cljs中得到的最好的是:

(def material  (js/THREE.MeshPhongMaterial. (clj->js {:map (THREE.ImageUtils.loadTexture "images/webgl-logo-256.jpg")})))

这是有效的,因为它没有给我一个错误,但立方体没有应用图像,而是深蓝色。

使用type命令,我可以看到我认为应该具有文件名的map属性未设置:

(type material)
function(parameters) {

    THREE.Material.call( this );

    this.type = 'MeshPhongMaterial';

    this.color = new THREE.Color( 0xffffff ); // diffuse
    this.ambient = new THREE.Color( 0xffffff );
    this.emissive = new THREE.Color( 0x000000 );
    this.specular = new THREE.Color( 0x111111 );
    this.shininess = 30;

    this.metal = false;

    this.wrapAround = false;
    this.wrapRGB = new THREE.Vector3( 1, 1, 1 );

    this.map = null;
   # ...

更新:即使解决了问题(请参阅下面的答案),this.map仍然在null命令输出中显示为type。因此,我认为type输出中的字段只是默认值,您不应指望它们反映所使用的实际值(?)

我最不确定的部分是loadTexture命令。我希望它写成:

(.-loadTexture THREE.ImageUtils "images/webgl-logo-256.jpg")

但是这会回来:

clojure.lang.ExceptionInfo: Unknown dot form of (. THREE.ImageUtils -loadTexture ("images/webgl-logo-256.jpg")) with classification [:cljs.analyzer/expr :cljs.analyzer/property :cljs.analyzer/expr] at line 1  {:tag :cljs/analysis-error, :file "", :line 1, :column 1}
nil

有谁知道如何用clojurescript写这个语句?

2 个答案:

答案 0 :(得分:3)

(THREE.ImageUtils.loadTexture "images/webgl-logo-256.jpg")不是有效的ClojureScript函数调用(至少使用tree.js)。这种尝试

(.-loadTexture THREE.ImageUtils "images/webgl-logo-256.jpg")

非常接近。它应该改为:

(.loadTexture (.-ImageUtils THREE) "images/webgl-logo-256.jpg")

在ClojureScript中,.用于JS函数调用(包括方法)和.-用于访问对象属性。更多详细信息为here

答案 1 :(得分:2)

根据Jarlax的建议,这是我提出的最终解决方案。

我用两种形式实现它:一种分为两种表达式,另一种是组合式。注意:部分问题是使用'MeshPhongMaterial'而不是'MeshBasicMaterial'。无论我做什么,我都无法在使用'MeshPhongMaterial'时显示图像,因此我转而使用“MeshBasicMaterial”。

解决方案A(两行):

(def mat-map (.loadTexture (.-ImageUtils js/THREE) "images/webgl-logo-256.jpg"))
(def material (js/THREE.MeshBasicMaterial. (clj->js {:map mat-map})))

溶液B(合并):

(def material (js/THREE.MeshBasicMaterial. (clj->js {:map (.loadTexture (.-ImageUtils js/THREE) "images/webgl-logo-256.jpg")})))

注意:你总是需要在'THs /'前加上'js /',例如“js / THREE”,否则会出现编译错误。