2017-09-21 31 views
1

私は同様にObject3Dの高さを計算しています:objは、その高さが得られ、(Xおよび/またはZ軸上)boundingBox.min.y及びboundingBox.max.y増加/減少との間の差を回転させるとObject3Dの幅/高さ/奥行きを決定する方法(回転しない場合と同じように)?

let obj = ... ; // An Object3D instance. Could be a Mesh, Group, etc. 
let boundingBox = new THREE.Box3().setFromObject(obj); 
let height = Math.abs(boundingBox.min.y - boundingBox.max.y); 

回転していない場合とは異なります。

しかし、全く回転していないかのように、高さをobjとして計算したいと思います。これどうやってするの?

回転の角度に基づいてboundingBoxの寸法を変換する必要があると推測していますが、その方法はわかりません。


回転前:

2

(赤= obj、青= boundingBox

+2

計算を実行する前にローテーションを保存してローテーションをゼロに設定できないのはなぜですか? – WestLangley

答えて

1

1

回転後は、オブジェクトの「世界軸に沿ったバウンディングボックス」を提供します。すべての頂点のワールド座標(リード:オブジェクトの回転、位置、スケール、すべての親を含む)を明示的に計算します。あなただけのジオメトリのバウンディングボックスを使用する場合は

(位置、回転せずに、オブジェクトのスケールが)、あなただけcomputeBoundingBox()を呼び出した後obj.geometry.boundingBoxを使用することができます:オブジェクト階層の

obj.geometry.computeBoundingBox(); 
let boundingBox = obj.geometry.boundingBox; 

、することができます子供オブジェクトがどのような方法で変換されていない場合にのみ動作すること

function getCombinedBoundingBox(object) { 
    const result = new THREE.Box(); 
    object.traverse(child => { 
    // skip everything that doesn't have a geometry 
    if (!child.geometry) { return; } 

    child.geometry.computeBoundingBox(); 
    result.union(child.geometry.boundingBox); 
    }); 

    return result; 
} 

注:集計バウンディングボックスを取得するには、このような何かを行います。

+0

'Object3D'のすべてのサブクラスに、定義された' geometry'プロパティがあるわけではありません。 ['THREE.Group'](https://threejs.org/docs/api/objects/Group.html)。どのような種類の 'Object3D'でも動作する汎用的なソリューションが必要です。ありがとう。 –

+0

がその解決策で更新されました。 –

関連する問題