稍微复杂,所以忍受我:
当对象没有morphTargets时,Ray intersect完美地工作。
当一个物体具有morphTargets时,只有原始位置可以相交,也就是说,如果我将模型从0,0,0
变形为50,50,50
,则该光线不会与该物体相交50,50,50,相反,当我鼠标移过0,0,0
时,我得到一个交叉点(即使对象不再存在!?)。
是否需要打开一些标志才能使三个.js知道顶点已移动?
编辑,添加代码。
这使我的网格并将其添加到对象数组(光线交叉使用):
function createDeer( deerGeometry, materials ) {
mesh = new THREE.MorphAnimMesh( deerGeometry, new THREE.MeshLambertMaterial( { color: 0xE8E8E8, ambient: 0xE8E8E8, morphTargets: true, vertexColors: THREE.FaceColors } ) );
mesh.scale.set( 3, 3, 3 );
mesh.position.set( 0, -3, 0 );
mesh.rotation.set( 0, 0, 0 );
mesh.castShadow = true;
mesh.receiveShadow = true;
mesh.geometry.dynamic = true;
scene.add( mesh );
objects.push( mesh );
}
在mouseDown上发生了Ray交叉(也有一个mouseOver,同样的事情),就像我说的那样,代码运行正常,它只是与原始的不变形网格相交:
function onDocumentMouseDown( event ) {
event.preventDefault();
var vector = new THREE.Vector3( mouse.x, mouse.y, 0.5 );
projector.unprojectVector( vector, camera );
var ray = new THREE.Ray( camera.position, vector.subSelf( camera.position ).normalize() );
var intersects = ray.intersectObjects( objects );
if ( intersects.length > 0 ) {
SELECTED = intersects[ 0 ].object;
for(var i=0; i<objects.length; i++)
{
if(SELECTED.position.x == objects[0].position.x) {
thisObject = i;
}
}
}
var intersects = ray.intersectObject( plane );
container.style.cursor = 'pointer';
}
}
我已经确定问题必须与鹿的位置(如在网格变换中)永远不会改变这一事实有关,然而顶点确实会移开,并且当光线相交时比较对象位置可能是问题在这儿?
答案 0 :(得分:2)
我已经合并了pull request并修复了此问题。
请注意,要使其工作,对象的boundingSphere
需要包含变形的完整范围
答案 1 :(得分:0)
MorphTarget
动画完全在GPU
上(在着色器代码中),而光线交点始终在CPU
上计算。所以事实上,没有简单的方法来实现你在这里描述的内容。