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

}

당신은 alteredq의 μˆ˜ν•™μ„ 톡합 ν•  μˆ˜μžˆμ„ κ²ƒμž…λ‹ˆλ‹€.

ꢁ금 ν•΄μš” ...이게 더 κ°„λ‹¨ν•˜μ§€ μ•Šμ„κΉŒμš”?

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

예, μ„Όν„° 만 ν•„μš”ν•˜λ©΄ 더 κ°„λ‹¨ν•©λ‹ˆλ‹€. 이미 경계 μƒμžκ°€ μžˆκ±°λ‚˜ λ‹€λ₯Έ 것에 λŒ€ν•œ 경계 μƒμžκ°€ ν•„μš”ν•œ 경우 쀑심을 κ³„μ‚°ν•˜λŠ” 것이 더 κ°„λ‹¨ν•©λ‹ˆλ‹€.

음, 이제이 두 가지 방법이 λ™μΌν•œ κ²°κ³Όλ₯Ό 얻을 수 μžˆλŠ”μ§€ κΆκΈˆν•©λ‹ˆλ‹€. ν•œμͺ½μ— λ§Žμ€ 점이 있고 λ‹€λ₯Έμͺ½μ— 적은 수의 μ μ΄μžˆλŠ” 경우 경계 μƒμžμ˜ 쀑심은 ν˜•μƒμ˜ μ€‘μ‹¬μ΄λ˜κ³  쀑심은 "쀑λ ₯ 쀑심"에 있으며 밀도가 높은 점 ν΄λŸ¬μŠ€ν„°μ— 더 κ°€κΉμŠ΅λ‹ˆλ‹€.

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

두 가지 방법이 μ„œλ‘œ λ‹€λ₯Έ μ‚¬μš© 사둀에 μœ μš©ν•˜λ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€.

μ‚¬μ‹€μž…λ‹ˆλ‹€. 경계 μƒμžμ˜ 쀑심은 λŒ€λΆ€λΆ„μ˜ μ‚¬λžŒλ“€μ΄ ν•„μš”λ‘œν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.

그래, λ‚΄ 생각 μ—” 정말 쀑심 ν•¨μˆ˜κ°€ μ•„λ‹ˆμ•Ό.

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 κΈ°μ€€)

κ°œλ…μ μœΌλ‘œ 두 개의 벑터λ₯Ό μΆ”κ°€ν•˜κ³  결과의 μ ˆλ°˜μ„ μ·¨ν•©λ‹ˆλ‹€. 더 λΉ λ₯Έμ§€ ν™•μ‹€ν•˜μ§€ μ•Šμ§€λ§Œ 더 ... λͺ…ν™•ν•©λ‹ˆλ‹€.

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

        c.divideScalar(2);
이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰