2013-08-26 16 views
6

私は、012.に似た、minecraftテクスチャエディタを作成するのにthree.jsを使用しています。私はちょうど基本的なクリックアンドペイント機能をダウンさせようとしていますが、私はそれを理解していないようです。私は現在、各キューブの各面にテクスチャを持っており、次の機能を持つシェーダ素材を作成することによってそれらを適用します。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; 
} 


ユーザーがメッシュ上の任意の場所をクリックすると次に、テクスチャファイル自体は、キャンバスを使用してアップデートです。更新は行われますが、ページが更新されない限り、変更はブラウザーに表示されません。テクスチャイメージを新しいファイルに変更する方法の例はたくさんありますが、実行時に同じテクスチャファイルに変更を表示する方法や、可能であれば変更を表示する方法の例はたくさんあります。これは可能なのでしょうか?あなたはテクスチャを更新すると、そのキャンバス、ビデオまたは外部ロードに基づいて、あなたがする必要があるかどうか、https://github.com/mrdoob/three.js/wiki/Updates

答えて

12

:ここ

+1

ありがとう、これは完全に働いた! ShaderMaterialを使って私と何か関係があったと思いますが、MeshBasicMaterialでうまく動作します。 – shaqb4

+3

実際には、両方とも 'material.map.needsUpdate = true; material.needsUpdate = true' –

+3

@ shaqb4この回答をupvoteして受け入れてください!それが私たちがstackoverflowでロールオーバーする方法です。 –

1

あなたはthree.jsで「更新」のものについて知っているかのすべての基本でありますtrueにテクスチャ上の次のプロパティを設定します。

オブジェクトは、次のように作成された場合:テクスチャは、変更をtrueに次のように設定された後

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); 

cube.material.map.needsUpdate = true;

次にシーンをレンダリングすると、新しいテクスチャが表示されます。

+0

私は前にそのページを見てきましたが、どのメソッドも動作していないようです。私がクリックすると、新しいメッシュ、マテリアル、シェーダの素材が全く作成されますが、更新フラグがtrueに設定されていても変更は画面に表示されません。 – shaqb4

+0

例を表示できますか? –

+0

もっと多くのコードを表示するように質問を更新しました。 – shaqb4

関連する問題