【发布时间】:2018-06-15 02:39:58
【问题描述】:
我正在调整 THREE.js 示例页面上的对象加载示例,以允许加载的对象选择它们的面并着色。我的总体策略是按照here 列出的步骤进行操作。
但是,由于我没有使用 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;
}
当我运行它时,我的对象是黑色的,当我点击面时,它们不会改变颜色。
如何更改我的代码以允许在选择时对更改进行着色?
【问题讨论】:
标签: javascript three.js