Three.js: オブジェクトの中心を取得します

作成日 2011年08月23日  ·  11コメント  ·  ソース: mrdoob/three.js

問題が発生しました。シーン内のオブジェクトをクリックすると、カメラはこのオブジェクトの中央に配置する必要があります。 このためには、オブジェクトの中心座標(y軸)が必要です。 どうすればこれを計算できますか? このオブジェクトのすべての頂点を合計し、頂点数で除算しようとしましたが、これはもちろん間違った決定です。

Question

最も参考になるコメント

ジオメトリの中心の境界ボックスを取得できます。

geometry.computeBoundingBox();

var centerX = 0.5 * ( geometry.boundingBox.x[ 1 ] - geometry.boundingBox.x[ 0 ] );
var centerY = 0.5 * ( geometry.boundingBox.y[ 1 ] - geometry.boundingBox.y[ 0 ] );
var centerZ = 0.5 * ( geometry.boundingBox.z[ 1 ] - geometry.boundingBox.z[ 0 ] );

次に、カメラのターゲットをオブジェクトの位置と中心に設定できます。

camera.target.position.copy( object.position );
camera.target.position.addSelf( new THREE.Vector3( centerX, centerY, centerZ ) );

全てのコメント11件

object.position.y

私たちのモデルでは常に0であり、モデルは絶対に配置されています

絶対位置とはどういう意味ですか? すべてのオブジェクトは0,0,0にありますが、頂点クラスターは中心の周りにありませんか?

ジオメトリの中心の境界ボックスを取得できます。

geometry.computeBoundingBox();

var centerX = 0.5 * ( geometry.boundingBox.x[ 1 ] - geometry.boundingBox.x[ 0 ] );
var centerY = 0.5 * ( geometry.boundingBox.y[ 1 ] - geometry.boundingBox.y[ 0 ] );
var centerZ = 0.5 * ( geometry.boundingBox.z[ 1 ] - geometry.boundingBox.z[ 0 ] );

次に、カメラのターゲットをオブジェクトの位置と中心に設定できます。

camera.target.position.copy( object.position );
camera.target.position.addSelf( new THREE.Vector3( centerX, centerY, centerZ ) );

これは私がしばらく前に書いた小さな関数です。 多分それはあなたを少し助けるでしょう。

getCentroid: function ( mesh ) {

    mesh.geometry.computeBoundingBox();
    boundingBox = mesh.geometry.boundingBox;

    var x0 = boundingBox.x[ 0 ];
    var x1 = boundingBox.x[ 1 ];
    var y0 = boundingBox.y[ 0 ];
    var y1 = boundingBox.y[ 1 ];
    var z0 = boundingBox.z[ 0 ];
    var z1 = boundingBox.z[ 1 ];


    var bWidth = ( x0 > x1 ) ? x0 - x1 : x1 - x0;
    var bHeight = ( y0 > y1 ) ? y0 - y1 : y1 - y0;
    var bDepth = ( z0 > z1 ) ? z0 - z1 : z1 - z0;

    var centroidX = x0 + ( bWidth / 2 ) + mesh.position.x;
    var centroidY = y0 + ( bHeight / 2 )+ mesh.position.y;
    var centroidZ = z0 + ( bDepth / 2 ) + mesh.position.z;

    return mesh.geometry.centroid = { x : centroidX, y : centroidY, z : centroidZ };

}

あなたはalteratedqの数学を取り入れることができるかもしれません(私が彼の近道を理解するのに十分賢かったらいいのに)

私は疑問に思います...これを行う方が簡単ではないでしょうか?

geometry.centroid = new THREE.Vector3();

for ( var i = 0, l = geometry.vertices.length; i < l; i ++ ) {

    geometry.centroid.addSelf( geometry.vertices[ i ].position );

} 

geometry.centroid.divideScalar( geometry.vertices.length );

ええ、センターが必要なだけなら、これはもっと簡単です。 すでにバウンディングボックスがある場合、または他の何かのためにバウンディングボックスが必要な場合は、その中心を計算するだけの方が簡単です。

うーん、今、これらの2つの方法で同じ結果が得られるのではないかと思います。 片側に大量のポイントがあり、反対側に少数のポイントがある場合、図心はジオメトリの中心になり、図心は「重心」にあり、より密なポイントのクラスターに近くなります。

>>> points = [ 0, 10, 11, 12 ]
>>> sum(points)/float(len(points)) # centroid
8.25
>>> 0.5 * (min(points) + max(points)) # center of bounding box
6.0

さまざまなユースケースで、両方の方法が役立つと思います。

確かに。 バウンディングボックスの図心は、ほとんどの人が必要とするものです。

ええ、結局のところ、私のものは実際には重心関数ではないと思います:s

var x0 = boundingBox.x[ 0 ];
var x1 = boundingBox.x[ 1 ];
var y0 = boundingBox.y[ 0 ];
var y1 = boundingBox.y[ 1 ];
var z0 = boundingBox.z[ 0 ];
var z1 = boundingBox.z[ 1 ];

今です:

var x0 = boundingBox.min.x;
var x1 = boundingBox.max.x;
var y0 = boundingBox.min.y;
var y1 = boundingBox.max.y;
var z0 = boundingBox.min.z;
var z1 = boundingBox.max.z;

(r47現在)

概念的には、2つのベクトルを追加し、結果の半分を取得します。 それが速いかどうかはわかりませんが、もっと...コンペチュアル:

        c.addVectors( 
            object.children[0].geometry.boundingBox.min,
            object.children[0].geometry.boundingBox.max
        );

        c.divideScalar(2);
このページは役に立ちましたか?
0 / 5 - 0 評価

関連する問題

makc picture makc  ·  3コメント

seep picture seep  ·  3コメント

akshaysrin picture akshaysrin  ·  3コメント

Horray picture Horray  ·  3コメント

clawconduce picture clawconduce  ·  3コメント