Three.js: Dapatkan pusat objek

Dibuat pada 23 Agu 2011  ·  11Komentar  ·  Sumber: mrdoob/three.js

Saya mengalami masalah, - saat mengklik beberapa objek dalam adegan, kamera harus berada di tengah objek ini. Untuk ini saya membutuhkan koordinat pusat objek (sumbu y). Bagaimana saya bisa menghitung ini? Mencoba menjumlahkan semua simpul dari objek ini dan membaginya pada hitungan simpul, tapi ini, tentu saja, keputusan yang salah.

Question

Komentar yang paling membantu

Anda bisa mendapatkan pusat kotak pembatas geometri:

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 ] );

Kemudian Anda dapat mengatur target kamera Anda ke posisi objek plus tengah:

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

Semua 11 komentar

object.position.y ?

dalam model kami selalu 0, model benar-benar positif

Apa yang Anda maksud dengan posisi absolut? Semua objek berada di 0,0,0 tetapi cluster simpul tidak berada di sekitar pusat?

Anda bisa mendapatkan pusat kotak pembatas geometri:

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 ] );

Kemudian Anda dapat mengatur target kamera Anda ke posisi objek plus tengah:

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

Ini adalah fungsi kecil yang saya tulis beberapa waktu lalu. Mungkin itu akan sedikit membantu Anda.

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 };

}

Anda mungkin bisa memasukkan matematika alteredq (saya harap saya cukup pintar untuk memahami jalan pintasnya)

Aku bertanya-tanya ... bukankah lebih mudah melakukan ini?

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 );

Ya, jika Anda hanya membutuhkan pusat, ini lebih sederhana. Jika Anda sudah memiliki kotak pembatas, atau Anda memerlukan kotak pembatas untuk sesuatu yang lain, maka lebih mudah menghitung pusatnya saja.

Hmmm, sekarang saya bertanya-tanya apakah kedua metode ini akan memberikan hasil yang sama. Jika Anda memiliki banyak titik di satu sisi dan sejumlah kecil titik di sisi lain, pusat kotak pembatas akan menjadi pusat geometri, sedangkan sentroid akan berada di "pusat gravitasi", lebih dekat ke kelompok titik yang lebih padat.

>>> 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

Saya kira kedua metode ini berguna, untuk kasus penggunaan yang berbeda.

Benar bahwa. Centroid dari kotak pembatas adalah apa yang kebanyakan orang butuhkan.

ya, saya kira milik saya sebenarnya bukan fungsi sentroid: 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 ];

sekarang:

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;

(sejak r47)

Secara konseptual, ini menambahkan dua vektor dan mengambil setengah dari hasilnya. Saya tidak yakin apakah ini lebih cepat, tetapi ini lebih ... konkpetual:

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

        c.divideScalar(2);
Apakah halaman ini membantu?
0 / 5 - 0 peringkat