【发布时间】:2020-07-28 19:35:52
【问题描述】:
我正在使用three.js,我正在尝试加载多个材质对象。当我运行代码时,第一个材质对象正确映射到数据。一旦它旋转,第二个材质对象就会意外填充。理想情况下,我希望第一个材质对象 [cubeMaterial] 读取数据 [0],即 49,第二个材质对象 [cubeMaterialTwo] 读取数据 [1],即 7。
这是我的代码:
<script src="https://cdn.jsdelivr.net/npm/three@0.118.3/build/three.js"></script>
let scene, camera, renderer;
let cubeGroup;
init();
animate();
function init() {
const data = [
[49, 7]
]
var i = 1;
width = 500
height = 500
fov = 9
aspect = 1/5
near = .1
far = 1000
loader = new THREE.TextureLoader()
scene = new THREE.Scene(); // ADDED
camera = new THREE.PerspectiveCamera(fov, aspect, near, far);
camera.position.set(50, 30, 50);
camera.lookAt( scene.position );
cubeGeometries = data.map(row => {
return row.map(c => {
return new THREE.BoxBufferGeometry(0.2, c / 8, 0.2);
})
})
var materialArray = [];
const cubeMaterial = new THREE.MeshBasicMaterial({
map: loader.load('../path/to/.jpgOne')
});
cubeMaterial.color.convertSRGBToLinear();
const cubeMaterialTwo = new THREE.MeshBasicMaterial({
map: loader.load('../path/to/.jpgTwo')
});
cubeMaterialTwo.color.convertSRGBToLinear();
materialArray.push(cubeMaterial, cubeMaterialTwo);
const cubeMeshes = cubeGeometries.map(row => {
return row.map(cubeGeometry => new THREE.Mesh(cubeGeometry, materialArray))
})
cubeGroup = new THREE.Group();
data.forEach((row, i, iarr) => {
row.forEach((d, j, jarr) => {
cubeMeshes[i][j].position.set(
i / iarr.length - 0.5,
d / 8 * 0.5 - 0.6,
j / jarr.length - 0.5);
//cubeMeshes[i][j].scale.set(1,4,1);
cubeGroup.add(cubeMeshes[i][j]);
})
})
const mainLight = new THREE.DirectionalLight(0xffffff, 5.0);
mainLight.position.set(10, 10, 10);
const ambientLight = new THREE.HemisphereLight(0xddeeff, 0x202020, 3);
var material = new THREE.LineBasicMaterial({
color: 0x0000ff
});
scene.add(cubeGroup);
scene.add(mainLight);
scene.add(ambientLight);
renderer = new THREE.WebGLRenderer({
antialias: true
});
renderer.setSize(window.innerWidth, window.innerHeight);
renderer.setPixelRatio(window.devicePixelRatio);
renderer.outputEncoding = THREE.sRGBEncoding;
renderer.physicallyCorrectLights = true;
document.body.appendChild(renderer.domElement);
}
function animate() {
requestAnimationFrame( animate );
cubeGroup.rotation.y += 0.005;
renderer.render( scene, camera );
}
【问题讨论】:
-
只是快速阅读您的代码,您正在以同步模式为加载器(异步)使用单个变量。我建议创建一个
TextureLoader的新实例以检查问题所在 -
@jscastro 感谢您的评论。不幸的是还是同样的问题。
标签: javascript canvas three.js data-visualization