Three.js: рдПрдХ рдорд┐рд╢реНрд░рд┐рдд Object3D рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдмрд╛рдЙрдВрдбрд┐рдВрдЧрдмреЙрдХреНрд╕?

рдХреЛ рдирд┐рд░реНрдорд┐рдд 26 рд╕рд┐рддре░ 2011  ┬╖  15рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: mrdoob/three.js

рд╣реИрд▓реЛ рджреЛрд╕реНрддреЛрдВ,

рдореИрдВ рдПрдХ Object3D рдЙрджрд╛рд╣рд░рдг рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдПрдХ CubeGometry рдФрд░ рдПрдХ TextGeometry рд╢рд╛рдорд┐рд▓ рд╣реИред рдореЗрд░рд╛ рдкреНрд░рд╢реНрди: рдпрд╣ рд╕рдВрднрд╡ рд╣реИ
рдЗрд╕ рдорд┐рд╢реНрд░рд┐рдд рдЬреНрдпрд╛рдорд┐рддреАрдп рдХрд╛ рдмрд╛рдЙрдВрдбрд┐рдВрдЧ рдмреЙрдХреНрд╕? рдореИрдВ рдпрд╣ рдкреВрдЫрддрд╛ рд╣реВрдВ, рдХреНрдпреЛрдВрдХрд┐ рдореИрдВрдиреЗ рджреЗрдЦрд╛ рдХрд┐ Object3D рд╡рд░реНрдЧ рдореЗрдВ рдПрдХ рдмрд╛рдЙрдВрдбрд┐рдВрдЧрдмреЙрдХреНрд╕-рд╡рд┐рдзрд┐ рдирд╣реАрдВ рд╣реИ
рдФрд░ рдореБрдЭреЗ рдСрдмреНрдЬреЗрдХреНрдЯ 3 рдбреА рдХрдВрдЯреЗрдирд░ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╕рднреА рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИред

рдореЗрд░рд╛ рд╡рд┐рдЪрд╛рд░ рдпрд╣ рдерд╛ рдХрд┐ Object3D- рдХрдВрдЯреЗрдирд░реЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХреИрдорд░реЗ рдХреЛ рдХреЗрдВрджреНрд░ рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рдП рдФрд░ рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдмрд╛рдЙрдВрдбрд┐рдВрдЧрдмреЙрдХреНрд╕ рдХреЛ рдЬрд╛рдирдирд╛ рд╣реЛрдЧрд╛ред

рдЕрднрд┐рд╡рд╛рджрди рд░рд╛рдЙрдВрдбреНрд░реЛрдмрд┐рди

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдореИрдВ рдЗрд╕реА рдЪреАрдЬрд╝ рдХреА рддрд▓рд╛рд╢ рдореЗрдВ рдЖрдпрд╛ рдерд╛ рдФрд░ рдЗрд╕ рдкрд░ рдмрд╕рдиреЗ рдХреЗ рдмрд╛рдж рд╕рдорд╛рдкреНрдд рд╣реБрдЖ:

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

рд╕рднреА 15 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

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

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

akshaysrin picture akshaysrin  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

filharvey picture filharvey  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

fuzihaofzh picture fuzihaofzh  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

jack-jun picture jack-jun  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

alexprut picture alexprut  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ