2012-06-28 19 views
14

メッシュの片面の色を変更しようとしています。これはWebGLのコンテキストにあります。私はメッシュの色全体を変えることができます。以下関連コード:Three.jsで顔色を変更する方法

// Updated Per Lee! 

var camera = _this.camera;  
var projector = new THREE.Projector(); 
var vector = new THREE.Vector3((event.clientX/window.innerWidth) * 2 - 1,         - (event.clientY/window.innerHeight) * 2 + 1, 0.5); 
projector.unprojectVector(vector, camera); 

var ray = new THREE.Ray(camera.position, vector.subSelf(camera.position).normalize()); 
var intersects = ray.intersectObjects(kage.scene.children); 

if (intersects.length > 0) { 
    face = intersects[0].face; 
    var faceIndices = ['a', 'b', 'c', 'd'];   
    var numberOfSides = (face instanceof THREE.Face3) ? 3 : 4; 
    // assign color to each vertex of current face 
    for(var j = 0; j < numberOfSides; j++) { 
     var vertexIndex = face[ faceIndices[ j ] ]; 
    // initialize color variable 
    var color = new THREE.Color(0xffffff); 
    color.setRGB(Math.random(), 0, 0); 
    face.vertexColors[ j ] = color; 
    } 
} 

次のように私はこの場合にも、キューブのオブジェクトを初期化:材料を変更

// this material causes a mesh to use colors assigned to vertices 
var material = new THREE.MeshBasicMaterial({ 
    color: 0xf0f0f0, 
    shading: THREE.FlatShading, 
    vertexColors: THREE.VertexColors 
}); 

var directionalLight = new THREE.DirectionalLight(0xEEEEEE); 
directionalLight.position.set(10, 1, 1).normalize(); 
kage.scene.add(directionalLight); 

var cube = new THREE.Mesh(new THREE.CubeGeometry(300, 300, 300,1,1,1), material); 
cube.dynamic = true; 
kage.scene.add(cube); 

にかかわらず、光の色のキューブは、白色となります。 交差ロジックがまだ機能しています。つまり、正しい顔を選択していますが、色は変わりません。

私は[うまくいけば、私の編集が混乱していない、よくある質問を] StackOverflowのために新たなんだ

答えて

21
  • 更新ライブラリを苦労しています誰にも役立ちます。
  • vertexColors: THREE.FaceColorsを に加えます。
  • 最後にface.color.setRGB(Math.random(), Math.random(), Math.random())を使用してください。今

    (D、B、C、)THREE.Face4又は3辺(A、B、C)のための THREE.Face3 4つの 側のループを通過する必要がありません。

    これは、WebGLとCanvasの両方のレンダリングで機能します。

Example

three.js r53

+0

r65で作業しています。 –

+6

これは私を近づけましたが、 'geometry.colorsNeedUpdate = true'を追加する必要がありました – twmulloy

6

「myGeometryは」あなたがの色を変更したい顔を含む形状であると仮定すると、 「faceIndex」は、色を変更したい特定の顔のインデックスです。

// the face's indices are labeled with these characters 
var faceIndices = ['a', 'b', 'c', 'd']; 

var face = myGeometry.faces[ faceIndex ]; 

// determine if face is a tri or a quad 
var numberOfSides = (face instanceof THREE.Face3) ? 3 : 4; 

// assign color to each vertex of current face 
for(var j = 0; j < numberOfSides; j++) 
{ 
    var vertexIndex = face[ faceIndices[ j ] ]; 
    // initialize color variable 
    var color = new THREE.Color(0xffffff); 
    color.setRGB(Math.random(), 0, 0); 
    face.vertexColors[ j ] = color; 
} 

その後、メッシュは、その顔の色が頂点に由来しているように、以下の材料を使用する必要がある:

// this material causes a mesh to use colors assigned to vertices 
var cubeMaterial = new THREE.MeshBasicMaterial( 
    { color: 0xffffff, shading: THREE.FlatShading, 
    vertexColors: THREE.VertexColors }); 
+0

私はあなたのフィードバックごとに私のコードスニペットを更新し、リーをありがとうございます。悲しいかな、顔は色を変えていません。私は色の変化を妨げている交差論理の外に物事を正しく設定していないかもしれないと思う。 – adamsch1

1

は私だけ上記の方法はWebGLRendererにうまくいくと思います。 CanvasRendererWebGLRendererの両方で動作するものをお探しなら、もう少し複雑ですが、最終的な結果がメモリ使用とパフォーマンスの面でより効率的だと思われます。

THREE.jS Projector.jsソースを通過した後、これは私がそれをやった方法です:

// create the face materials 
var material_1 = new THREE.MeshLambertMaterial(
    {color : 0xff0000, shading: THREE.FlatShading, overdraw : true} 
); 
var material_2 = new THREE.MeshLambertMaterial(
    {color : 0x00ff00, shading: THREE.FlatShading, overdraw : true} 
); 

// create a geometry (any should do) 
var geom = new THREE.CubeGeometry(1,1,1); 

// add the materials directly to the geometry 
geom.materials.push(material_1); 
geom.materials.push(material_2); 

// assign the material to individual faces (note you assign the index in 
// the geometry, not the material) 
for(var i in geom.faces) { 
    var face = geom.faces[i]; 
    face.materialIndex = i%geom.materials.length; 
} 

// create a special material for your mesh that tells the renderer to use the 
// face materials 
var material = new THREE.MeshFaceMaterial(); 
var mesh = new THREE.Mesh(geom, material); 

この例では、私が持っている作業コードから適応が、私は私が持っていない認めざるを得ませんさ実際にコードのこの正確なブロックを実行し、私は右最初に行くすべてのものを得るための素晴らしい実績を持っていないが、うまくいけば、それはR53に

1

私はthree.jsにかなり新しいですが、これらの例のほとんどは、過度に長く複雑に見えます。次のコードは、キューブの12の三角形のすべての面を塗りつぶしているようです(WebGLRenderer r73)。

これを行うときに私が指摘したことの1つは、顔の順序が少し奇妙であることです(私には少なくとも初心者として)。 Three JS Geometry文献1として

var geometry = new THREE.BoxGeometry(1, 1, 1); 
console.log(geometry.faces.length); // 12 triangles 
geometry.faces[0].color = new THREE.Color(0x000000); //Right 1 
geometry.faces[1].color = new THREE.Color(0xFF0000); //Right 2 
geometry.faces[2].color = new THREE.Color(0xFF8C08); //Left 1 
geometry.faces[3].color = new THREE.Color(0xFFF702); //Left 2 
geometry.faces[4].color = new THREE.Color(0x00FF00); //Top 1 
geometry.faces[5].color = new THREE.Color(0x0000FF); //Top 2 
geometry.faces[6].color = new THREE.Color(0x6F00FF); //Bottom 1 
geometry.faces[7].color = new THREE.Color(0x530070); //Bottom 2 
geometry.faces[8].color = new THREE.Color(0x3F3F3F); //Front 1 
geometry.faces[9].color = new THREE.Color(0x6C6C6C); //Front 2 
geometry.faces[10].color = new THREE.Color(0xA7A7A7);//Rear 1 
geometry.faces[11].color = new THREE.Color(0xFFFFFF);//Rear 2 
+7

新しい色をインスタンス化する必要はありません。 'color.setHex(0xff0000)'を使用してください。 – WestLangley

+0

ヒントのためのクールなthx:私は見た例に基づいてそれをやっていました。 – Gus

2

、これに更新を通知するにはtrueに設定する必要が、Geometry.elementsNeedUpdateに直面しています。

次のスニペットは、すべての顔の色を変更します。

mesh.material.vertexColors = THREE.FaceColors

var faces = mesh.geometry.faces; 

for(var i = 0 ; i < faces.length; i++){ 
    var face = faces[i]; 
    var color = new THREE.Color("rgb(255, 0, 0)"); 
    face.color = color; 
} 

mesh.geometry.elementsNeedUpdate = true; 

render(); 
+3

顔色が既に存在する場合は、新しい「THREE.Color」をインスタンス化しないでください。代わりに 'faces [i] .color.setRGB(1、0、0);'と 'mesh.geometry.colorsNeedUpdate = true;'を実行してください。参照先の文書を再度読​​んでください。 – WestLangley

関連する問題