【问题标题】:Ray intersection when using morphtargets not working使用变形目标时光线相交不起作用
【发布时间】:2012-11-23 07:02:00
【问题描述】:

有点复杂,请耐心等待:

  • 当对象没有 morphTargets 时,Ray intersect 可以完美运行。

  • 当一个对象有 morphTargets 时,只有原始位置可以相交,也就是说,如果我将一个模型从0,0,0 变形为50,50,50,射线将不会与对象在 50,50 相交, 50,相反,当我将鼠标悬停在0,0,0 上时,我得到了一个交叉点(即使对象不再存在!?)。

是否需要打开某种标志才能让 three.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 );
}

Ray 相交发生在 mouseDown 上(还有一个 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';
    }

}

我已经确定问题一定与鹿的位置(如在网格变换中)永远不会改变的事实有关,但是顶点确实会移开,并且当射线相交时比较对象位置可能是问题在吗?

【问题讨论】:

    标签: three.js


    【解决方案1】:

    我已经创建了一个 pull request,它已经被合并并修复了这个问题。

    请注意,要使其正常工作,对象的boundingSphere 需要包含变形的全部范围

    【讨论】:

      【解决方案2】:

      MorphTarget 动画完全在GPU 上进行(在着色器代码中),而光线交点始终在CPU 上计算。所以事实上,没有简单的方法可以实现您在此处描述的内容。

      【讨论】:

      • 那么我猜对边界框进行光线投射可能是一个更容易(但并不完美)的解决方案?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-18
      • 2014-05-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多