私はTHREE.jsの例のページにオブジェクトの読み込みの例を適用して、読み込まれたオブジェクトの面を選択して色付けできるようにしています。私の一般的な戦略は、hereの手順に従ったものです。THREE.jsフェイスを選択したobjローダー
しかし、私はTHREE.geometryオブジェクトを使用していないので、この戦略をobjローダーコードで組み合わせるのに問題があります。
私は現在、オブジェクトをクリックしているときに知っているので、私は面を着色するのに問題があります。私は適用する必要があることを知っています:vertexColors: THREE.FaceColors
objの材料とthatsに私は立ち往生です。
私の現在のOBJローディングコードは次のとおりです。
var loader = new THREE.OBJLoader(manager);
loader.load(path, function (object) {
object.traverse(function (child) {
if (child instanceof THREE.Mesh) {
var faceColorMaterial = new THREE.MeshBasicMaterial({ color: 0xff00ff, vertexColors: THREE.VertexColors });
child.material = faceColorMaterial;
child.geometry.addAttribute("color", new THREE.BufferAttribute(new Float32Array(3 * 3), 3));
child.geometry.dynamic = true;
}
});
scene.add(object);
targetList.push(object);
}, onProgress, onError);
をそして、私の検出および着色コード:私はこれを実行すると
var vector = new THREE.Vector3(mouse.x, mouse.y, 1);
vector.unproject(camera);
var ray = new THREE.Raycaster(camera.position, vector.sub(camera.position).normalize());
var intersects = ray.intersectObjects(targetList, true);
if (intersects.length > 0) {
var colorArray = intersects[0].object.geometry.attributes.color.array;
var face = intersects[0].face;
colorArray[face.a] = 1;
colorArray[face.a + 1] = 0;
colorArray[face.a + 2] = 0;
colorArray[face.b] = 1;
colorArray[face.b + 1] = 0;
colorArray[face.b + 2] = 0;
colorArray[face.c] = 1;
colorArray[face.c + 1] = 0;
colorArray[face.c + 2] = 0;
intersects[0].object.geometry.attributes.color.needsUpdate = true;
}
は、私の物体が黒であると私は顔をクリックすると、彼らは色を変えない。
選択したときに変更が色付けされるようにするには、どのようにコードを変更できますか?
ジオメトリにはcolors属性がありません。どうすれば修正できますか?私は材料のためにTHREE.VertexColorsにvertexColorsを更新しました – Glynbeard
バッファ属性にcolors属性を追加しましたが、交差しても何も起こりません。 – Glynbeard
提案した変更を反映するために上記のコードを更新しました。 – Glynbeard