立方体每个面上的ThreeJs不同的文本

时间:2019-12-15 07:10:06

标签: javascript html three.js html5-canvas

我正在使用Threejs对每个立方体面上具有不同文本的立方体进行动画处理。我使用DynamicTexture将文本放置在多维数据集面上,但是将相同的文本放置在多维数据集的每一侧。我不知道如何在每侧放置不同的文本。有什么办法可以通过用户输入在运行时放置文本?谢谢。

Main.js

var scene = new THREE.Scene();
scene.background = new THREE.Color('white');
var camera = new THREE.PerspectiveCamera(50, window.innerWidth/window.innerHeight, 1, 1000);
camera.position.set(4, 4, 4);
camera.lookAt(0, 0, 0);
var renderer = new THREE.WebGLRenderer();
renderer.setSize(window.innerWidth, window.innerHeight);
document.getElementById('display').appendChild(renderer.domElement);
var controls = new THREE.OrbitControls(camera);
var dynamictexture = new THREEx.DynamicTexture(512, 512);
dynamictexture.context.font = "bolder 90px verdana";
dynamictexture.texture.needsUpdate = true;
dynamictexture.clear('#d35400').drawText('Text', undefined, 256, 'green');
var geometry = new THREE.BoxGeometry(2, 2, 2);
var material = new THREE.MeshBasicMaterial({color: 0xffffff, map: dynamictexture.texture, opacity:1, 
transparent: true});
var cube = new THREE.Mesh(geometry, material);
scene.add(cube);
function animate() {
requestAnimationFrame(animate);
controls.update();
dynamictexture.texture
renderer.render(scene, camera);
};
animate();

1 个答案:

答案 0 :(得分:2)

您可以使用THREE.MeshFaceMaterial(materials)完成此操作。您需要做的就是传递一个包含材质的数组,并为每个面指定贴图。

var face_textures = [];
function createFaceTextures() {
  var i;
  for(i = 0; i < 6; i++) {
    var dynamictexture = new THREEx.DynamicTexture(512, 512);
    dynamictexture.context.font = "bolder 90px verdana";
    dynamictexture.texture.needsUpdate = true;
    dynamictexture.clear('#d35400').drawText(i.toString(), undefined, 256, 'green');
    face_textures.push(dynamictexture);
  }
}
createFaceTextures();

var scene = new THREE.Scene();
scene.background = new THREE.Color('white');
var camera = new THREE.PerspectiveCamera(50, window.innerWidth/window.innerHeight, 1, 1000);
camera.position.set(4, 4, 4);
camera.lookAt(0, 0, 0);
var renderer = new THREE.WebGLRenderer();
renderer.setSize(window.innerWidth, window.innerHeight);
document.getElementById('display').appendChild(renderer.domElement);
var controls = new THREE.OrbitControls(camera);
var dynamictexture = new THREEx.DynamicTexture(512, 512);
dynamictexture.context.font = "bolder 90px verdana";
dynamictexture.texture.needsUpdate = true;
dynamictexture.clear('#d35400').drawText('Text', undefined, 256, 'green');
var geometry = new THREE.BoxGeometry(2, 2, 2,);
var material = new THREE.MeshBasicMaterial({color: 0xffffff, map: dynamictexture.texture, opacity:1, transparent: true});

var materials = [
  new THREE.MeshBasicMaterial({map: face_textures[0].texture}),
  new THREE.MeshBasicMaterial({map: face_textures[1].texture}),
  new THREE.MeshBasicMaterial({map: face_textures[2].texture}),
  new THREE.MeshBasicMaterial({map: face_textures[3].texture}),
  new THREE.MeshBasicMaterial({map: face_textures[4].texture}),
  new THREE.MeshBasicMaterial({map: face_textures[5].texture})
];

var cube = new THREE.Mesh(geometry, materials);
scene.add(cube);
function animate() {
    requestAnimationFrame(animate);
    controls.update();
    dynamictexture.texture
    renderer.render(scene, camera);
}
animate();