我正在尝试在运行时交换一个加载的3.js .obj的图像纹理.以下是来自three.js示例的代码,稍作修改:
var container,stats; var camera,scene,renderer; var mouseX = 0,mouseY = 0; var windowHalfX = window.innerWidth / 2; var windowHalfY = window.innerHeight / 2; init(); animate(); function init() { container = document.createElement( 'div' ); document.body.appendChild( container ); camera = new THREE.PerspectiveCamera( 45,window.innerWidth / window.innerHeight,1,2000 ); camera.position.z = 100; //scene scene = new THREE.Scene(); var ambient = new THREE.AmbientLight( 0x101030 ); scene.add( ambient ); var directionalLight = new THREE.DirectionalLight( 0xfFeedd ); directionalLight.position.set( 0,1 ); scene.add( directionalLight ); //manager var manager = new THREE.LoadingManager(); manager.onProgress = function ( item,loaded,total ) { console.log( item,total ); }; //model var loader = new THREE.OBJLoader( manager ); loader.load( 'obj/female02/female02.obj',function ( object ) { object.traverse( function ( child ) { if ( child instanceof THREE.Mesh ) { //create a global var to reference later when changing textures myMesh = child; //apply texture myMesh.material.map = THREE.ImageUtils.loadTexture( 'textures/ash_uvgrid01.jpg'); myMesh.material.needsUpdate = true; } } ); object.position.y = - 80; scene.add( object ); } ); //render renderer = new THREE.WebGLRenderer(); renderer.setSize( window.innerWidth,window.innerHeight ); container.appendChild( renderer.domElement ); document.addEventListener( 'mousemove',onDocumentMouseMove,false ); window.addEventListener( 'resize',onWindowResize,false ); } function newTexture() { myMesh.material.map = THREE.ImageUtils.loadTexture( 'textures/land_ocean_ice_cloud_2048.jpg'); myMesh.material.needsUpdate = true; } function onWindowResize() { windowHalfX = window.innerWidth / 2; windowHalfY = window.innerHeight / 2; camera.aspect = window.innerWidth / window.innerHeight; camera.updateProjectionMatrix(); renderer.setSize( window.innerWidth,window.innerHeight ); } function onDocumentMouseMove( event ) { mouseX = ( event.clientX - windowHalfX ) / 2; mouseY = ( event.clientY - windowHalfY ) / 2; } //animate function animate() { requestAnimationFrame( animate ); render(); } function render() { camera.position.x += ( mouseX - camera.position.x ) * .05; camera.position.y += ( - mouseY - camera.position.y ) * .05; camera.lookAt( scene.position ); renderer.render( scene,camera ); }
我添加的唯一的东西是newTexture函数和网格的引用作为myMesh.这是原始的例子(http://threejs.org/examples/webgl_loader_obj.html).该函数不会抛出任何错误,但是.obj不会更新.我知道我只是在这里错过了一些基本的东西.
更新:根据下面的优秀答案,以下是正确的代码,通过输入字段交换纹理的一些补充:
var container,stats; var camera,renderer; var mouseX = 0,mouseY = 0; var windowHalfX = window.innerWidth / 2; var windowHalfY = window.innerHeight / 2; var globalObject; init(); animate(); function init() { container = document.createElement('div'); document.body.appendChild(container); camera = new THREE.PerspectiveCamera(45,2000); camera.position.z = 100; //scene scene = new THREE.Scene(); var ambient = new THREE.AmbientLight( 0x101030 ); scene.add( ambient ); var directionalLight = new THREE.DirectionalLight( 0xfFeedd ); directionalLight.position.set( 0,1 ); scene.add( directionalLight ); //manager var manager = new THREE.LoadingManager(); manager.onProgress = function (item,total) { console.log( item,total ); }; //model var loader = new THREE.OBJLoader( manager ); loader.load( 'obj/female02/female02.obj',function (object) { //store global reference to .obj globalObject = object; object.traverse( function (child) { if ( child instanceof THREE.Mesh ) { child.material.map = THREE.ImageUtils.loadTexture( 'textures/grid.jpg'); child.material.needsUpdate = true; } }); object.position.y = - 80; scene.add( object ); }); //render renderer = new THREE.WebGLRenderer(); renderer.setSize( window.innerWidth,window.innerHeight ); container.appendChild( renderer.domElement ); document.addEventListener( 'mousemove',false ); window.addEventListener( 'resize',false ); } function onWindowResize() { windowHalfX = window.innerWidth / 2; windowHalfY = window.innerHeight / 2; camera.aspect = window.innerWidth / window.innerHeight; camera.updateProjectionMatrix(); renderer.setSize( window.innerWidth,window.innerHeight ); } function onDocumentMouseMove( event ) { mouseX = ( event.clientX - windowHalfX ) / 2; mouseY = ( event.clientY - windowHalfY ) / 2; } //animate function animate() { requestAnimationFrame( animate ); render(); } function render() { camera.position.x += ( mouseX - camera.position.x ) * .05; camera.position.y += ( - mouseY - camera.position.y ) * .05; camera.lookAt( scene.position ); renderer.render( scene,camera ); } function newTexture() { var newTexturePath = "textures/" + document.getElementById("texture").value + ""; globalObject.traverse( function ( child ) { if (child instanceof THREE.Mesh) { //create a global var to reference later when changing textures child; //apply texture child.material.map = THREE.ImageUtils.loadTexture(newTexturePath); child.material.needsUpdate = true; } }); }