2013-08-26 56 views
6

Tôi đang sử dụng ba.js để tạo trình chỉnh sửa kết cấu minecraft, tương tự như this. Tôi chỉ cố gắng để có được chức năng nhấp chuột và sơn cơ bản xuống, nhưng tôi không thể tìm ra nó. Tôi hiện đang có kết cấu cho mỗi khuôn mặt của mỗi khối lập phương và áp dụng chúng bằng cách làm cho vật liệu đổ bóng với các chức năng sau đây.Cập nhật hình ảnh Three.js

this.createBodyShaderTexture = function(part, update) 
{ 
    sides = ['left', 'right', 'top', 'bottom', 'front', 'back']; 
    images = []; 
    for (i = 0; i < sides.length; i++) 
    { 
     images[i] = 'img/'+part+'/'+sides[i]+'.png'; 
    } 
    texCube = new THREE.ImageUtils.loadTextureCube(images); 
    texCube.magFilter = THREE.NearestFilter; 
    texCube.minFilter = THREE.LinearMipMapLinearFilter; 
    if (update) 
    { 
     texCube.needsUpdate = true; 
     console.log(texCube); 
    } 
    return texCube; 
} 
this.createBodyShaderMaterial = function(part, update) 
{ 

    shader = THREE.ShaderLib['cube']; 
    shader.uniforms['tCube'].value = this.createBodyShaderTexture(part, update); 
    shader.fragmentShader = document.getElementById("fshader").innerHTML; 
    shader.vertexShader = document.getElementById("vshader").innerHTML; 

    material = new THREE.ShaderMaterial({fragmentShader: shader.fragmentShader, vertexShader: shader.vertexShader, uniforms: shader.uniforms}); 
    return material; 
} 

SkinApp.prototype.onClick = 
function(event) 
{ 
    event.preventDefault(); 
     this.change(); //makes texture file a simple red square for testing 
    this.avatar.remove(this.HEAD); 

    this.HEAD = new THREE.Mesh(new THREE.CubeGeometry(8, 8, 8), this.createBodyShaderMaterial('head', false)); 
    this.HEAD.position.y = 10; 
    this.avatar.add(this.HEAD); 
    this.HEAD.material.needsUpdate = true; 
     this.HEAD.dynamic = true; 
} 


Sau đó, khi người dùng nhấp vào bất kỳ nơi nào trên lưới, file hình ảnh chính nó là cập nhật bằng vải. Bản cập nhật xảy ra, nhưng thay đổi không hiển thị trong trình duyệt trừ khi trang được làm mới. Tôi đã tìm thấy rất nhiều ví dụ về cách thay đổi hình ảnh kết cấu thành một tệp mới, nhưng không tìm thấy cách hiển thị các thay đổi trong cùng một tệp kết cấu trong thời gian chạy hoặc thậm chí nếu có thể. Điều này có thể, và nếu không phải là lựa chọn thay thế?

Trả lời

12

Khi bạn cập nhật một kết cấu, cho dù nó dựa trên vải, video hoặc nạp từ bên ngoài, bạn cần phải thiết lập các tài sản trên các kết cấu sau để đúng:

Nếu một đối tượng được tạo ra như thế này:

var canvas = document.createElement("canvas"); 
var canvasMap = new THREE.Texture(canvas) 
var mat = new THREE.MeshPhongMaterial(); 
mat.map = canvasMap; 
var mesh = new THREE.Mesh(geom,mat); 

sau khi kết cấu đã được thay đổi, thiết lập sau để đúng:

cube.material.map.needsUpdate = true;

Và lần sau khi bạn hiển thị cảnh, nó sẽ hiển thị kết cấu mới.

+1

Cảm ơn, điều này đã làm việc hoàn hảo! Tôi nghĩ rằng nó có một cái gì đó để làm với tôi bằng cách sử dụng một ShaderMaterial, nhưng nó hoạt động tốt với một MeshBasicMaterial. – shaqb4

+3

Tôi thực sự phải thực hiện cả hai 'material.map.needsUpdate = true; material.needsUpdate = true' –

+3

@ shaqb4 Sau đó, upvote câu trả lời này và chấp nhận nó! Đó là cách chúng tôi cuộn trên stackoverflow. –

1

Dưới đây là tất cả những điều cơ bản về những gì bạn cần phải biết về "cập nhật" những thứ trong three.js: https://github.com/mrdoob/three.js/wiki/Updates

+0

Tôi đã xem trang đó trước đây, nhưng không có phương pháp nào có vẻ hoạt động. Khi tôi nhấp vào, tôi thử tạo một tài liệu hoàn toàn mới về lưới, vật liệu và đổ bóng, nhưng thay đổi không hiển thị trên màn hình mặc dù các cờ cập nhật được đặt thành true. – shaqb4

+0

Bạn có thể hiển thị ví dụ không? –

+0

Tôi đã cập nhật câu hỏi của mình để hiển thị thêm mã. – shaqb4

Các vấn đề liên quan