рдореБрдЭреЗ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рд╛, - рдЬрдм рджреГрд╢реНрдп рдореЗрдВ рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдХреИрдорд░рд╛ рдХреЛ рдЗрд╕ рд╡рд╕реНрддреБ рдкрд░ рдХреЗрдиреНрджреНрд░рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕рдХреЗ рд▓рд┐рдП рдореБрдЭреЗ рдСрдмреНрдЬреЗрдХреНрдЯ (y рдЕрдХреНрд╖) рдХреЗ рдХреЗрдВрджреНрд░ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдореИрдВ рдЗрд╕рдХреА рдЧрдгрдирд╛ рдХреИрд╕реЗ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ? рдЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╕рднреА рд╢реАрд░реНрд╖реЛрдВ рдХреЛ рдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рдФрд░ рдЗрд╕реЗ рд╡рд░реНрдЯрд┐рд╕ рдХрд╛рдЙрдВрдЯ рдкрд░ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЧрд▓рдд рдирд┐рд░реНрдгрдп рд╣реИред
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 };
}
рдЖрдк рдЕрд▓реНрд▓реЗрджрдХ рдХреЗ рдЧрдгрд┐рдд рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ (рдХрд╛рд╢ рдореИрдВ рдЙрд╕рдХреЗ рд╢реЙрд░реНрдЯрдХрдЯ рдХреЛ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╕реНрдорд╛рд░реНрдЯ рд╣реЛрддрд╛)
рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реИ ... рдпрд╣ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реЛрдЧрд╛?
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;
(рдЖрд░ 47 рдХреЗ рд░реВрдк рдореЗрдВ)
рд╡реИрдЪрд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ, рдпрд╣ рджреЛ рд╡реИрдХреНрдЯрд░ рдЬреЛрдбрд╝ рд░рд╣рд╛ рд╣реИ рдФрд░ рдкрд░рд┐рдгрд╛рдо рдХрд╛ рдЖрдзрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд▓реЗ рд░рд╣рд╛ рд╣реИред рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЕрдЧрд░ рдпрд╣ рддреЗрдЬрд╝ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрдзрд┐рдХ рд╣реИ ... рд╕рдВрдХреНрд╖рд┐рдкреНрдд:
c.addVectors(
object.children[0].geometry.boundingBox.min,
object.children[0].geometry.boundingBox.max
);
c.divideScalar(2);
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
рдЖрдк рдЬреНрдпрд╛рдорд┐рддрд┐ рдмрд╛рдЙрдВрдбрд┐рдВрдЧ рдмреЙрдХреНрд╕ рдХрд╛ рдХреЗрдВрджреНрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
рдлрд┐рд░ рдЖрдк рдЕрдкрдиреЗ рдХреИрдорд░реЗ рдХреЗ рд▓рдХреНрд╖реНрдп рдХреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реНрдерд┐рддрд┐ рдкреНрд▓рд╕ рдХреЗрдВрджреНрд░ рдкрд░ рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: