我正在調整THREE.js示例頁面上的對象加載示例,以允許加載的對象將其面部選中並着色。我的總體策略是遵循步驟here。THREE.js obj loader with face selection
但是,由於我沒有使用THREE.geometry對象,因此我無法將此策略與obj加載器代碼拼接在一起。
我目前有射線交叉工作,所以我知道當我點擊對象時,我只是無法着色面部。我知道我需要申請:vertexColors: THREE.FaceColors
到obj材料,那是我卡住的地方。
我當前的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;
}
當我運行此,我的對象是黑色的,當我點擊的面孔,他們不會改變顏色。
如何更改我的代碼以允許在選擇時更改顏色?
我的幾何沒有顏色屬性,我該如何解決這個問題?我已經將vertexColors更新爲THREE.VertexColors,用於我的材質 – Glynbeard
我將顏色屬性添加到緩衝區幾何然而,我仍然沒有看到任何事情發生時,我相交 – Glynbeard
我更新了我的上述代碼以反映您所建議的更改。 – Glynbeard