我正在尝试将图像应用于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写这个语句?
答案 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”,否则会出现编译错误。