рд╣реИрд▓реЛ рджреЛрд╕реНрддреЛрдВ,
рдореИрдВ рдПрдХ Object3D рдЙрджрд╛рд╣рд░рдг рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдПрдХ CubeGometry рдФрд░ рдПрдХ TextGeometry рд╢рд╛рдорд┐рд▓ рд╣реИред рдореЗрд░рд╛ рдкреНрд░рд╢реНрди: рдпрд╣ рд╕рдВрднрд╡ рд╣реИ
рдЗрд╕ рдорд┐рд╢реНрд░рд┐рдд рдЬреНрдпрд╛рдорд┐рддреАрдп рдХрд╛ рдмрд╛рдЙрдВрдбрд┐рдВрдЧ рдмреЙрдХреНрд╕? рдореИрдВ рдпрд╣ рдкреВрдЫрддрд╛ рд╣реВрдВ, рдХреНрдпреЛрдВрдХрд┐ рдореИрдВрдиреЗ рджреЗрдЦрд╛ рдХрд┐ Object3D рд╡рд░реНрдЧ рдореЗрдВ рдПрдХ рдмрд╛рдЙрдВрдбрд┐рдВрдЧрдмреЙрдХреНрд╕-рд╡рд┐рдзрд┐ рдирд╣реАрдВ рд╣реИ
рдФрд░ рдореБрдЭреЗ рдСрдмреНрдЬреЗрдХреНрдЯ 3 рдбреА рдХрдВрдЯреЗрдирд░ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╕рднреА рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИред
рдореЗрд░рд╛ рд╡рд┐рдЪрд╛рд░ рдпрд╣ рдерд╛ рдХрд┐ Object3D- рдХрдВрдЯреЗрдирд░реЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХреИрдорд░реЗ рдХреЛ рдХреЗрдВрджреНрд░ рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рдП рдФрд░ рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдмрд╛рдЙрдВрдбрд┐рдВрдЧрдмреЙрдХреНрд╕ рдХреЛ рдЬрд╛рдирдирд╛ рд╣реЛрдЧрд╛ред
рдЕрднрд┐рд╡рд╛рджрди рд░рд╛рдЙрдВрдбреНрд░реЛрдмрд┐рди
Object3D
рдкрд╛рд╕ рдмрд╛рдЙрдВрдбрд┐рдВрдЧ рдмреЙрдХреНрд╕ рдХреА рдЧрдгрдирд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдзрд┐ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди Geometry
рд╣реИ ред
рдЙрд╕ рд░рд╛рд╕реНрддреЗ рд╕реЗ рдмрд╛рд╣рд░, рдЖрдкрдХреЛ рдмрд╕ рдЗрд╕рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдЕрдм рддрдХ рдзрдиреНрдпрд╡рд╛рджред рд╢рд╛рдпрдж рдореИрдВ рдЧрд▓рдд рдкреВрдЫрддрд╛ рд╣реВрдВ, рдореЗрд░рд╛ рдзреНрдпрд╛рди рджреЛ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдмрд╛рдЙрдВрдбрд┐рдВрдЧ рдмреЙрдХреНрд╕ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдерд╛ред рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдЬреНрдпрд╛рдорд┐рддрд┐ рдХреЗ рд▓рд┐рдП рдмрд╛рдЙрдВрдбрд┐рдВрдЧ рдмреЙрдХреНрд╕ рдХреА рдЧрдгрдирд╛ рдХреИрд╕реЗ рдХреА рдЬрд╛рддреА рд╣реИ, рд▓реЗрдХрд┐рди рдЬрдм рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рдЬрдЯрд┐рд▓ 3 рдбреА рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИ, рддреЛ рдореИрдВ рджреЛ рдХреНрдпреВрдмреНрд╕ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдмрд╛рдЙрдВрдбрд┐рдВрдЧ рдмреЙрдХреНрд╕ рдХреА рдЧрдгрдирд╛ рдХреИрд╕реЗ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред рдпрд╛ рдПрдХ рдЬреНрдпрд╛рдорд┐рддрд┐ рд╕реЗ рдкрд╣рд▓реЗ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдорд░реНрдЬ рдХрд░рдирд╛ neccecary рд╣реИ?
рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдореЗрд░реА рдмрд╛рдд рд╕рдордЭ рдореЗрдВ рдЖ рдЧрдИ рд╣реЛрдЧреА :) рдпрд╣ рд╕рдордЭрд╛рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИред
рд╕рдордЭрд╛ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрднреА рдПрдХ рд╣реА рд░рд╛рд╕реНрддрд╛ рд╣реИ рдХрд┐ рд╕рднреА рдмрд╛рдЙрдВрдбрд┐рдВрдЧ рдмреЙрдХреНрд╕ рдХреА рддреБрд▓рдирд╛ рдХрд░реЗрдВ рдФрд░ рд╕рднреА рдореВрд▓реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдХреБрдЫ max()
рдФрд░ min()
ред
рдареАрдХ рд╣реИ рд╢реБрдХреНрд░рд┐рдпрд╛ред рдЕрдЧрд░ рдореИрдВ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рд╣реВрдВ рддреЛ рдореИрдВ рдЕрдкрдирд╛ рд╕рдорд╛рдзрд╛рди рдкреЛрд╕реНрдЯ рдХрд░реВрдВрдЧрд╛
рдпрд╣рд╛рдБ рдореЗрд░рд╛ рд╕рдорд╛рдзрд╛рди рд╣реИред рдмрд╕ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рдкрд╛рд╕ рдХрд░реЗрдВ рдФрд░ рдпрд╣ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рдКрдВрдЪрд╛рдИ / рдЪреМрдбрд╝рд╛рдИ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдФрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдПрдХ рдКрдВрдЪрд╛рдИ рдФрд░ рдЪреМрдбрд╝рд╛рдИ рд╕рдВрдкрддреНрддрд┐ рдЕрд╕рд╛рдЗрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдЪреНрдЪреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рджрд┐рдЦреЗрдЧрд╛ред
calculateDimensions(myObject);
...
/*
* Get the size of the compound object by computing the bounding box and getting the max/min of each of its children
*/
function calculateDimensions(_object) {
var absoluteMinX = 0, absoluteMaxX = 0, absoluteMinY = 0, absoluteMaxY = 0, absoluteMinZ = 0, absoluteMaxZ = 0;
for (var i = 0; i < _object.children.length; i++) {
_object.children[i].geometry.computeBoundingBox();
absoluteMinX = Math.min(absoluteMinX,_object.children[i].geometry.boundingBox.min.x);
absoluteMaxX = Math.max(absoluteMaxX,_object.children[i].geometry.boundingBox.max.x);
absoluteMinY = Math.min(absoluteMinY,_object.children[i].geometry.boundingBox.min.y);
absoluteMaxY = Math.max(absoluteMaxY,_object.children[i].geometry.boundingBox.max.y);
absoluteMinZ = Math.min(absoluteMinZ,_object.children[i].geometry.boundingBox.min.z);
absoluteMaxZ = Math.max(absoluteMaxZ,_object.children[i].geometry.boundingBox.max.z);
}
// set generic height and width values
_object.depth = (absoluteMaxX - absoluteMinX) * _object.scale.x;
_object.height = (absoluteMaxY - absoluteMinY) * _object.scale.y;
_object.width = (absoluteMaxZ - absoluteMinZ) * _object.scale.z;
// remember the original dimensions
if (_object.originalDepth === undefined) _object.originalDepth = _object.depth;
if (_object.originalHeight === undefined) _object.originalHeight = _object.height;
if (_object.originalWidth === undefined) _object.originalWidth = _object.width;
console.log("Depth: " + _object.depth + ", Height: " + _object.height + ", Width: " + _object.width);
}
рдореИрдВ рдЗрд╕реА рдЪреАрдЬрд╝ рдХреА рддрд▓рд╛рд╢ рдореЗрдВ рдЖрдпрд╛ рдерд╛ рдФрд░ рдЗрд╕ рдкрд░ рдмрд╕рдиреЗ рдХреЗ рдмрд╛рдж рд╕рдорд╛рдкреНрдд рд╣реБрдЖ:
function getCompoundBoundingBox(object3D) {
var box = null;
object3D.traverse(function (obj3D) {
var geometry = obj3D.geometry;
if (geometry === undefined) return;
geometry.computeBoundingBox();
if (box === null) {
box = geometry.boundingBox;
} else {
box.union(geometry.boundingBox);
}
});
return box;
}
@NickLarsen рдЕрдЪреНрдЫрд╛ рд▓рдЧ рд░рд╣рд╛ рд╣реИ!
рдореЗрд░реЗ рдкрд╛рд╕ рдареАрдХ рд╡реИрд╕реА рд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реИ рдФрд░ рджреЛ рд╕рд╛рд▓ рдкрд╣рд▓реЗ рд░рд╛рдЙрдВрдбреНрд░реЛрдмрд┐рди рдХреЗ рд╕рдорд╛рди рд╡рд┐рдЪрд╛рд░ рд╣реИред @NickLarsen рдХрд╛ рд╕рдорд╛рдзрд╛рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдЪреНрдЫрд╛ рд▓рдЧ рд░рд╣рд╛ рд╣реИ, рдЬреИрд╕реЗ @mrdoob рдиреЗ рдХрд╣рд╛, рд▓реЗрдХрд┐рди рдПрдХ рдмрдбрд╝реА рд╕рдорд╕реНрдпрд╛ рд╣реИ ... рдореИрдВ рдЗрд╕реЗ рд╕рдордЭрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдБрдЧрд╛ред
рдореЗрд░реЗ рджреГрд╢реНрдп рдореЗрдВ рд╣рдореЗрд╢рд╛ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ 3 рдбреА рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╕рднреА рдЬреНрдпрд╛рдорд┐рддреАрдп рд╣реЛрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдореЗрд░реЗ рдкрд╛рд╕ рдЕрд▓рдЧ-рдЕрд▓рдЧ рддреНрд░рд┐рдЬреНрдпрд╛ рдФрд░ рдЕрд▓рдЧ-рдЕрд▓рдЧ y- рд╕рдордиреНрд╡рдп рдХреЗ рд╕рд╛рде different рдХреНрд╖реЗрддреНрд░ рд╣реИрдВред рд╡реЗ рд╕рднреА x = 0 рдФрд░ z = 0 рдкрд░ рд╕реНрдерд┐рдд рд╣реИрдВред
рдлрд┐рд░ рдореИрдВрдиреЗ NickLarsen рд╕реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдкреВрд░реЗ рдмрд╛рдЙрдВрдбрд┐рдВрдЧрдмреЙрдХреНрд╕ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рд▓реЗрдХрд┐рди рдкрд░рд┐рдгрд╛рдо рдмрд╣реБрдд рдЕрдЬреАрдм рдерд╛ред рддреНрд░реБрдЯрд┐ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдХрдВрд╕реЛрд▓ рдореЗрдВ рд╕рднреА рдПрдХрд▓ рдмрд╛рдЙрдВрдбрд┐рдВрдЧ рдмреЙрдХреНрд╕ рд▓реЙрдЧ рдХрд┐рдП:
({рдорд┐: {x: -10, y: -10, z: -10}, рдЕрдзрд┐рдХрддрдо: {x: 10, y: 10, z: 10}})
({рдорд┐: {x: -20, y: -20, z: -20}, рдЕрдзрд┐рдХрддрдо: {x: 20, y: 20, z: 20}})
({рдорд┐: {x: -7, y: -7, z: -7}, рдЕрдзрд┐рдХрддрдо: {x: 7, y: 7, z: 7}})
({рдорд┐: {x: -18, y: -18, z: -18}, рдЕрдзрд┐рдХрддрдо: {x: 18, y: 18, z: 18}})
({рдорд┐: {x: -15, y: -15, z: -15}, рдЕрдзрд┐рдХрддрдо: {x: 15, y: 15, z: 15}})
({рдорд┐: {x: -3, y: -3, z: -3}, рдЕрдзрд┐рдХрддрдо: {x: 3, y: 3, z: 3}})
({рдорд┐: {x: -10, y: -10, z: -10}, рдЕрдзрд┐рдХрддрдо: {x: 10, y: 10, z: 10}})
({рдорд┐: {x: -25, y: -25, z: -25}, рдЕрдзрд┐рдХрддрдо: {x: 25, y: 25, z: 25}})
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдмрд╛рдЙрдВрдбрд┐рдВрдЧ рдмреЙрдХреНрд╕ рдХреА рдЧрдгрдирд╛ рд╣рдореЗрд╢рд╛ рдПрдХрд▓ рдХреНрд╖реЗрддреНрд░ рдХреЗ рд╕реНрдерд╛рдиреАрдп рд╕рдордиреНрд╡рдп рдкреНрд░рдгрд╛рд▓реА рдореЗрдВ рдХреА рдЬрд╛рддреА рд╣реИред рдФрд░ рдЬрдм рдЖрдк рдЙрдиреНрд╣реЗрдВ рд╕рдВрдШ рдмрдирд╛рддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИ! рдореИрдВ рдЕрдкрдиреЗ рдСрдмреНрдЬреЗрдХреНрдЯ 3 рдбреА рдХреЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдмрд╛рдЙрдВрдбрд┐рдВрдЧрдмреЙрдХреНрд╕ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реНрд╡ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдореЗрдВ рдмрд╛рдЙрдВрдбрд┐рдВрдЧрдмреЙрдХреНрд╕ рдХреИрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ?
R.59dev рд╢рд╛рдЦрд╛ рдореЗрдВ, Box3.setFromObject( object )
ред
@PanChan рдЖрдкрдХреЛ рдЗрд╕реЗ рдЪрд▓рд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЕрдкрдиреЗ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рдпрд╣рд╛рдБ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЬрдм рдпрд╣ рдЗрд╕ рд╕рд╛рдорд╛рди рдХреА рдмрд╛рдд рдЖрддреА рд╣реИ рддреЛ рдореИрдВ рдмрд╣реБрдд рд╢реЛрд░ рдХрд░рддрд╛ рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рдореЗрд░реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд╕рдВрджреЗрд╣ рдХреА рдПрдХ рдЕрдЪреНрдЫреА рдЦреБрд░рд╛рдХ рдХреЗ рд╕рд╛рде рд▓реЗрдВред
@NickLarsen рдореБрдЭреЗ рдПрдХ рдФрд░ рд╕рдорд╛рдзрд╛рди рдорд┐рд▓рд╛ рдЬреЛ рдХрд╛рдо рдХрд░рдиреЗ рд▓рдЧрддрд╛ рд╣реИред рдмрд╛рдЙрдВрдбрд┐рдВрдЧрдмреЙрдХреНрд╕ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдореИрдВ рдЗрд╕реЗ рд╡рд┐рд╢реНрд╡ рдкреНрд░рдгрд╛рд▓реА рдореЗрдВ рдЕрдиреБрд╡рд╛рдж рдХрд░рддрд╛ рд╣реВрдВ:
var bb = geometry.boundingBox;
bb.translate(obj3D.localToWorld( new THREE.Vector3()));
рдЕрдЧрд░ рдпрд╣ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдзрд╛рди рд╣реИ рдкрддрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрдм рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдкреЗрд╢реЗрд╡рд░ рд╕рдорд╛рдзрд╛рди рдХреЗ рд╕рд╛рде рдирдП рд╕рдВрд╢реЛрдзрди рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ;) рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!
рдореЗрд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ @NickLarsen рд╕рдорд╛рдзрд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛
function getComplexBoundingBox(object3D) {
var box = null;
object3D.traverse(function(obj3D) {
if (obj3D.matrixWorldNeedsUpdate) obj3D.updateMatrixWorld();
var geometry = obj3D.geometry;
// If current is not a geometry (THREE.Geometry), proceed to the next one
if (geometry === undefined) return null;
// If this object is already bounding box, then use it
if (geometry.boundingBox) {
var workableBox = geometry.boundingBox.clone();
// Move the resulting bounding box to the position of the object itself
workableBox.applyMatrix4(obj3D.matrixWorld);
if (box === null) {
box = workableBox;
} else {
box.union(workableBox);
}
// If there is no bounding box for current object - creating
} else {
var workableGeometry = geometry.clone();
// Move the resulting geometry in the position of the object itself
workableGeometry.applyMatrix(obj3D.matrixWorld);
// Calculate the bounding box for the resulting geometry
workableGeometry.computeBoundingBox();
if (box === null) {
box = workableGeometry.boundingBox;
} else {
box.union(workableGeometry.boundingBox);
}
}
});
return box;
}
5 рдпрджрд┐ рд╕рд╣реА рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпрд╛рдБ - рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЕрдЪреНрдЫреЗ рдХреЛрдб рдХрд╛ рдЙрджрд╛рд╣рд░рдг рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИ, рдмреЗрд╣рддрд░ рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдЕрднреА рддрдХ рдХрд╛рдо рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ? :)
рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдкреБрд░рд╛рдирд╛ рдзрд╛рдЧрд╛ рд╣реИред рдЖрдЬрдХрд▓ рдЖрдк рд╕рд┐рд░реНрдл new THREE.Box3().setFromObject(object3d)
рдореИрдВ рдЗрд╕ рд╡рд┐рдзрд┐ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдБрдЧрд╛, рдзрдиреНрдпрд╡рд╛рдж!
рдХреЛрдИ рджрд┐рдХреНрдХрдд рдирд╣реАрдВ рд╣реИред рдореИрдВ рдХреБрдЫ рдорд╣реАрдиреЛрдВ рдкрд╣рд▓реЗ рдЦреБрдж рдЗрд╕ рдЕрд╣рд╕рд╛рд╕ рд╕реЗ рдЧреБрдЬрд╝рд░рд╛: https://github.com/danielribeiro/three-hub/commit/859f148349ca64ede9ee224d55ad2ea3f51cda0#diff -0dad6abd7a4801d561b8383bdedbedc1baa
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
рдореИрдВ рдЗрд╕реА рдЪреАрдЬрд╝ рдХреА рддрд▓рд╛рд╢ рдореЗрдВ рдЖрдпрд╛ рдерд╛ рдФрд░ рдЗрд╕ рдкрд░ рдмрд╕рдиреЗ рдХреЗ рдмрд╛рдж рд╕рдорд╛рдкреНрдд рд╣реБрдЖ: