Javascript Three.js:计算子网格的复合比例因子

Javascript Three.js:计算子网格的复合比例因子,javascript,three.js,Javascript,Three.js,我希望单击任何目标(网格对象)并将标准大小的球体网格对象附加到它。 如果目标网格的缩放不是(1,1,1),则以下代码将调整附着的标记球体的缩放,以便后者的打印半径保持标准 //...attach marker sphere to clicked object intersected_object.add ( marker_sphere ); var positionV3 = new THREE.Vector3(); positionV3 =

我希望单击任何目标(网格对象)并将标准大小的球体网格对象附加到它。 如果目标网格的缩放不是(1,1,1),则以下代码将调整附着的标记球体的缩放,以便后者的打印半径保持标准

//...attach marker sphere to clicked object

        intersected_object.add ( marker_sphere );

        var positionV3 = new THREE.Vector3(); 
        positionV3 = intersected_object.worldToLocal( intersects[ 0 ].point );
        xxx = F_Position_Copy_from_vector3_to_Object3D( positionV3, marker_sphere );

        marker_sphere.scale.x = 1/ intersected_object.scale.x;
        marker_sphere.scale.y = 1/ intersected_object.scale.y;
        marker_sphere.scale.z = 1/ intersected_object.scale.z;
但是,如果单击的目标网格是父网格(或父Object3D的子网格)的子网格,并且父网格具有非单一缩放,则有必要将父网格缩放因子化为标记球体缩放。如果目标是一个孙子,事情会变得更加复杂

另一种方法是找出目标“祖先层次”中最高级(非场景)的对象,然后定义与高级对象的相应值相关的附加标记球体位置和缩放参数

问题


那么,是否有一种简单/可靠的方法可以在网格对象的祖先层次中找到“高级”对象呢?

这似乎适用于不同对象的示例

//... find senior parent (non-Scene) object
var thisOb = intersected_object; //...default
var done = false;
while ( done == false)
{
    if ( thisOb.parent != "" ) //... not undefined
    { 
        if ( thisOb.parent.type == "Scene" ) //... got to the top
        {
            done = true;
            var senior_object = thisOb;
        }
        else
        {
            thisOb = thisOb.parent
        }
    }
    else  //... no parentOb
    {
     alert ('ehhh???');
     done = true;
    }
}//... end while

//... attach sphere to object at click point on object
senior_object.add ( marker_sphere );

//... position marker sphere relative to clicked object
var positionV3 = new THREE.Vector3(); 
positionV3 = senior_object.worldToLocal( intersects[ 0 ].point );
xxx = SOW_F_Position_Copy_from_vector3_to_Object3D( positionV3, marker_sphere );

marker_sphere.scale.x = 1/ senior_object.scale.x;
marker_sphere.scale.y = 1/ senior_object.scale.y;
marker_sphere.scale.z = 1/ senior_object.scale.z;