Как изменить одно изображение текстуры 3d-модели (maya) в three.js во время выполнения

Этот сайт загружает модель Maya с использованием three.js. Эта модель имеет ниже текстурные изображения

введите здесь описание изображениявведите здесь описание изображения введите здесь описание изображениявведите здесь описание изображения

Вот JS

 var SCREEN_WIDTH = window.innerWidth;
 var SCREEN_HEIGHT = window.innerHeight;

 var container;

 var camera, scene;
 var canvasRenderer, webglRenderer;

 var mesh, zmesh, geometry, materials;

 var windowHalfX = window.innerWidth / 2;
 var windowHalfY = window.innerHeight / 2;

 var meshes = [];

 function init() {

     container = document.createElement('div');
     document.body.appendChild(container);

     camera = new THREE.PerspectiveCamera(75, SCREEN_WIDTH / SCREEN_HEIGHT, 1, 100000);
     camera.position.x = 400;
     camera.position.y = 200;
     camera.position.z = 400;

     scene = new THREE.Scene();

     // LIGHTS
     var ambient = new THREE.AmbientLight(0x666666);
     scene.add(ambient);

     var directionalLight = new THREE.DirectionalLight(0xffeedd);
     directionalLight.position.set(0, 70, 100).normalize();
     scene.add(directionalLight);

     // RENDERER
     webglRenderer = new THREE.WebGLRenderer();
     webglRenderer.setSize(SCREEN_WIDTH, SCREEN_HEIGHT);
     webglRenderer.domElement.style.position = "relative";

     container.appendChild(webglRenderer.domElement);

     var loader = new THREE.JSONLoader(),
         callbackKey = function (geometry, materials) {
             createScene(geometry, materials, 0, 0, 0, 6)
         };
     loader.load("chameleon.js", callbackKey);

     window.addEventListener('resize', onWindowResize, false);

 }

 function createScene(geometry, materials, x, y, z, scale) {

     zmesh = new THREE.Mesh(geometry, new THREE.MeshFaceMaterial(materials));
     zmesh.position.set(x, y, z);
     zmesh.scale.set(scale, scale, scale);
     meshes.push(zmesh);
     scene.add(zmesh);
 }

 function onWindowResize() {

     windowHalfX = window.innerWidth / 2;
     windowHalfY = window.innerHeight / 2;

     camera.aspect = window.innerWidth / window.innerHeight;
     camera.updateProjectionMatrix();

     webglRenderer.setSize(window.innerWidth, window.innerHeight);
 }

 function animate() {
     for (var i = 0; i < meshes.length; i++) {
         meshes[i].rotation.y += .01;
     }
     requestAnimationFrame(animate);
     render();
 }

 function render() {
     camera.lookAt(scene.position);
     webglRenderer.render(scene, camera);
 }
 $(document).ready(function () {
     init();
     animate();
 });

теперь я хочу изменить 1-е изображение текстуры на другую текстуру, а остальная часть текстуры остается неизменной во время выполнения! как это сделать?


person MD TAHMID HOSSAIN    schedule 09.09.2013    source источник


Ответы (1)


если вы хотите изменить текстуру во время выполнения. Все, что вам нужно сделать, это посмотреть на материал объектов zmesh. Найдите соответствующий индекс материала синего платья и замените его. Ваша модель немного сложна тем, что у вас есть множество материалов, но это не имеет значения. Для одного материального объекта вы просто меняете mesh.material.map и обновляете его, в вашем случае нам нужен mesh.material.materials[index].map. Поэтому попробуйте добавить это в конец вашей функции createScene. Оно заменит платье текстурой глазного яблока:

zmesh.material.materials[1].map = THREE.ImageUtils.loadTexture( 'c006_10.jpg' );

Конечно, замените «c006_10.jpg» на соответствующий путь к текстуре глазного яблока. Одно добавленное примечание: если вы подключаете замену текстуры к onclick, например, вам нужно иметь активный цикл рендеринга или вызывать функцию рендеринга рендерера, чтобы отобразить его.

person Darryl_Lehmann    schedule 09.09.2013
comment
loadTexture устанавливает флаг texture.needsUpdate на текстуре. Не устанавливайте его самостоятельно при вызове этой функции. Также не устанавливайте material.needsUpdate. Это создает новую шейдерную программу. - person WestLangley; 09.09.2013
comment
Это здорово, спасибо за разъяснение. Собираюсь оптимизировать несколько проектов, над которыми работаю. Спасибо, WestLangley! Редактирование ответа сейчас. - person Darryl_Lehmann; 09.09.2013
comment
@Darryl_Lehmann @WestLangley Работает как сон. Спасибо большое. это сработало отлично. одна вещь, которую я хотел бы знать. мне нужна переменная изображения для передачи в качестве моей текстуры, поэтому я сделал это `var tempimage = new Image(); tempimage.onload = function () { zmesh.material.materials[0].map = new THREE.Texture(tempimage); zmesh.material.materials[0].map.needsUpdate = true; // если я удалю эту строку, все станет черным! }; tempimage.src = Soundwave/RB_Soundwave_Norm_XY_1024.png;` это работает. правильно ли я кодирую? - person MD TAHMID HOSSAIN; 10.09.2013
comment
Действительно, простое создание THREE.Texture не приведет к обновлению, поэтому вам нужно сделать это вручную. Если бы вы использовали подход THREE.ImageUtils.loadTexture, этот вызов обновления обрабатывался автоматически. Взгляните на ссылка файл для справки. - person Darryl_Lehmann; 10.09.2013