仅在 canvas 单击 Three.js 时应用纹理
Texture applied only on canvas click with Three.js
我正在使用 Three.js 中的 WebGLRenderer 渲染从具有纹理的 IndexedFaceStructure 重建的对象。我的问题是,当页面加载对象时,显示的对象没有纹理,只显示黑色网格,但是,当我单击渲染对象的 canvas 时,纹理显示出来。
我一直在四处寻找并尝试了 texture.needsUpdate = true;技巧,但是这个也删除了页面加载时的黑色网格对象,所以我在这里不知所措。
这些是我的代码的主要部分:
function webGLStart() {
container = document.getElementById("webgl-canvas");
renderer = new THREE.WebGLRenderer({canvas:container, alpha:true, antialias: true});
renderer.setClearColor(0x696969,1);
renderer.setSize(container.width, container.height) ;
scene = new THREE.Scene();
camera = new THREE.PerspectiveCamera(45, container.width / container.height, 1, 100000);
camera.position.set(60, 120,2000) ;
//computing the geometry2
controls = new THREE.OrbitControls( camera );
controls.addEventListener( 'change', render );
texture = new THREE.ImageUtils.loadTexture(texFile);
//texture.needsUpdate = true;
material = new THREE.MeshBasicMaterial( {wireframe:false, map: texture, vertexColors: THREE.VertexColors} );
mesh = new THREE.Mesh(geometry2, material);
scene.add(mesh);
render();
animate();
}
function render()
{
renderer.render(scene, camera);
}
function animate()
{
controls.update();
}
和 html 部分:canvas id="webgl-canvas" style="border: none;" width="900" height="900" (我无法正确添加).
你知道为什么会这样吗?
如果是静态场景,不需要动画循环,只需要在OrbitControls
修改相机position/orientation.
时渲染场景
因此,您可以使用此模式——无需动画循环:
controls.addEventListener( 'change', render );
但是,您还需要在加载纹理时强制进行渲染。您可以通过在 ImageUtils.loadTexture()
方法中指定对 render
的回调来做到这一点:
var texture = THREE.ImageUtils.loadTexture( "textureFile", undefined, render );
或者,您可以将网格添加到场景并在回调中调用渲染。
three.js r.70
我正在使用 Three.js 中的 WebGLRenderer 渲染从具有纹理的 IndexedFaceStructure 重建的对象。我的问题是,当页面加载对象时,显示的对象没有纹理,只显示黑色网格,但是,当我单击渲染对象的 canvas 时,纹理显示出来。
我一直在四处寻找并尝试了 texture.needsUpdate = true;技巧,但是这个也删除了页面加载时的黑色网格对象,所以我在这里不知所措。
这些是我的代码的主要部分:
function webGLStart() {
container = document.getElementById("webgl-canvas");
renderer = new THREE.WebGLRenderer({canvas:container, alpha:true, antialias: true});
renderer.setClearColor(0x696969,1);
renderer.setSize(container.width, container.height) ;
scene = new THREE.Scene();
camera = new THREE.PerspectiveCamera(45, container.width / container.height, 1, 100000);
camera.position.set(60, 120,2000) ;
//computing the geometry2
controls = new THREE.OrbitControls( camera );
controls.addEventListener( 'change', render );
texture = new THREE.ImageUtils.loadTexture(texFile);
//texture.needsUpdate = true;
material = new THREE.MeshBasicMaterial( {wireframe:false, map: texture, vertexColors: THREE.VertexColors} );
mesh = new THREE.Mesh(geometry2, material);
scene.add(mesh);
render();
animate();
}
function render()
{
renderer.render(scene, camera);
}
function animate()
{
controls.update();
}
和 html 部分:canvas id="webgl-canvas" style="border: none;" width="900" height="900" (我无法正确添加). 你知道为什么会这样吗?
如果是静态场景,不需要动画循环,只需要在OrbitControls
修改相机position/orientation.
因此,您可以使用此模式——无需动画循环:
controls.addEventListener( 'change', render );
但是,您还需要在加载纹理时强制进行渲染。您可以通过在 ImageUtils.loadTexture()
方法中指定对 render
的回调来做到这一点:
var texture = THREE.ImageUtils.loadTexture( "textureFile", undefined, render );
或者,您可以将网格添加到场景并在回调中调用渲染。
three.js r.70