ΠΡΠΈΠ²Π΅Ρ ΡΠ΅Π±ΡΡΠ°,
Π£ ΠΌΠ΅Π½Ρ Π΅ΡΡΡ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ Object3D, ΠΊΠΎΡΠΎΡΡΠΉ Π²ΠΊΠ»ΡΡΠ°Π΅Ρ CubeGeometry ΠΈ TextGeometry. ΠΠΎΠΉ Π²ΠΎΠΏΡΠΎΡ: ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡΡΠΈΡΡ
ΠΎΠ³ΡΠ°Π½ΠΈΡΠΈΠ²Π°ΡΡΠ°Ρ ΡΠ°ΠΌΠΊΠ° ΡΡΠΎΠΉ ΡΠ»ΠΎΠΆΠ½ΠΎΠΉ Π³Π΅ΠΎΠΌΠ΅ΡΡΠΈΠΈ? Ρ ΡΠΏΡΠ°ΡΠΈΠ²Π°Ρ ΠΎΠ± ΡΡΠΎΠΌ, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ Ρ Π²ΠΈΠ΄Π΅Π», ΡΡΠΎ ΠΊΠ»Π°ΡΡ Object3D Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ ΠΌΠ΅ΡΠΎΠ΄Π° boundingBox
ΠΈ Ρ ΠΌΠ΅Π½Ρ Π½Π΅Ρ ΡΠΏΠΎΡΠΎΠ±Π° Π²ΡΡΠΈΡΠ»ΠΈΡΡ Π΅Π³ΠΎ Π΄Π»Ρ Π²ΡΠ΅Ρ
ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ², Π²ΠΊΠ»ΡΡΠ΅Π½Π½ΡΡ
Π² ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ Object3D.
ΠΠΎΡ ΠΈΠ΄Π΅Ρ Π·Π°ΠΊΠ»ΡΡΠ°Π»Π°ΡΡ Π² ΡΠΎΠΌ, ΡΡΠΎΠ±Ρ ΡΠ΅Π½ΡΡΠΈΡΠΎΠ²Π°ΡΡ ΠΊΠ°ΠΌΠ΅ΡΡ Π² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΎΡ ΡΠ΅Π½ΡΡΠ°ΠΎΠΈΠ΄Π° Object3D-ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΎΠ², ΠΈ ΠΏΠΎΡΡΠΎΠΌΡ Ρ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π·Π½Π°ΡΡ boundingBox.
ΠΡΠΈΠ²Π΅Ρ ΡΠ°ΡΠ½Π΄ΡΠΎΠ±ΠΈΠ½
Object3D
Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ ΠΌΠ΅ΡΠΎΠ΄Π° Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΡ ΠΎΠ³ΡΠ°Π½ΠΈΡΠΈΠ²Π°ΡΡΠ΅ΠΉ ΡΠ°ΠΌΠΊΠΈ, Π½ΠΎ Geometry
ΠΈΠΌΠ΅Π΅Ρ .
Π Π°Π·ΠΎΠ±ΡΠ°Π²ΡΠΈΡΡ Ρ ΡΡΠΈΠΌ, Π²Π°ΠΌ ΠΏΡΠΎΡΡΠΎ Π½ΡΠΆΠ½ΠΎ ΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΡ ΡΡΠΎΠΌΡ .
ΠΏΠΎΠΊΠ° ΡΠΏΠ°ΡΠΈΠ±ΠΎ. ΠΌΠΎΠΆΠ΅Ρ Ρ Π½Π΅ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎ ΡΠΏΡΠ°ΡΠΈΠ²Π°Ρ, Ρ Ρ ΠΎΡΠ΅Π» ΠΏΠΎΠ»ΡΡΠΈΡΡ ΠΎΠ³ΡΠ°Π½ΠΈΡΠΈΠ²Π°ΡΡΡΡ ΡΠ°ΠΌΠΊΡ Π΄Π²ΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ². Π― Π·Π½Π°Ρ, ΠΊΠ°ΠΊ ΡΠ°ΡΡΡΠΈΡΠ°ΡΡ ΠΎΠ³ΡΠ°Π½ΠΈΡΠΈΠ²Π°ΡΡΡΡ ΡΠ°ΠΌΠΊΡ Π΄Π»Ρ ΠΎΠ΄Π½ΠΎΠΉ Π³Π΅ΠΎΠΌΠ΅ΡΡΠΈΠΈ, Π½ΠΎ ΠΊΠΎΠ³Π΄Π° Ρ ΠΌΠ΅Π½Ρ Π΅ΡΡΡ ΡΠΎΡΡΠ°Π²Π½ΡΠ΅ 3D-ΠΎΠ±ΡΠ΅ΠΊΡΡ, ΠΊΠ°ΠΊ Ρ ΠΌΠΎΠ³Ρ Π²ΡΡΠΈΡΠ»ΠΈΡΡ ΠΎΠ³ΡΠ°Π½ΠΈΡΠΈΠ²Π°ΡΡΡΡ ΡΠ°ΠΌΠΊΡ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΈΠ· Π΄Π²ΡΡ ΠΊΡΠ±ΠΎΠ². ΠΠ»ΠΈ Π½ΡΠΆΠ½ΠΎ ΠΏΠ΅ΡΠ΅Π΄ ΡΡΠΈΠΌ ΠΎΠ±ΡΠ΅Π΄ΠΈΠ½ΠΈΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΡ Π² ΠΎΠ΄Π½Ρ Π³Π΅ΠΎΠΌΠ΅ΡΡΠΈΡ?
ΠΠ°Π΄Π΅ΡΡΡ, Π²Ρ ΠΏΠΎΠ½ΡΠ»ΠΈ ΠΌΠΎΡ ΡΠΎΡΠΊΡ Π·ΡΠ΅Π½ΠΈΡ :) ΠΡΠΎ ΡΠ»ΠΎΠΆΠ½ΠΎ ΠΎΠ±ΡΡΡΠ½ΠΈΡΡ.
ΠΠΎΠ½ΠΈΠΌΠ°Ρ. Π― Π΄ΡΠΌΠ°Ρ, ΡΡΠΎ ΡΠ΅ΠΉΡΠ°Ρ Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΡΠΉ ΡΠΏΠΎΡΠΎΠ± - ΡΡΠ°Π²Π½ΠΈΡΡ Π²ΡΠ΅ ΠΎΠ³ΡΠ°Π½ΠΈΡΠΈΠ²Π°ΡΡΠΈΠ΅ ΠΏΡΡΠΌΠΎΡΠ³ΠΎΠ»ΡΠ½ΠΈΠΊΠΈ ΠΈ ΡΠ΄Π΅Π»Π°ΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ max()
ΠΈ min()
s ΡΠΎ Π²ΡΠ΅ΠΌΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΡΠΌΠΈ.
Ρ ΠΎΡΠΎΡΠΎ ΡΠΏΠ°ΡΠΈΠ±ΠΎ. Π― ΠΎΠΏΡΠ±Π»ΠΈΠΊΡΡ ΡΠ²ΠΎΠ΅ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅, Π΅ΡΠ»ΠΈ Ρ ΡΡΠΏΠ΅ΡΠ½ΠΎ
ΠΠΎΡ ΠΌΠΎΠ΅ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅. ΠΡΠΎΡΡΠΎ ΠΏΠ΅ΡΠ΅Π΄Π°ΠΉΡΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡ ΡΡΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ, ΠΈ ΠΎΠ½Π° Π±ΡΠ΄Π΅Ρ ΠΏΡΠΎΡΠΌΠ°ΡΡΠΈΠ²Π°ΡΡ Π΅Π³ΠΎ Π΄ΠΎΡΠ΅ΡΠ½ΠΈΠ΅ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ, ΡΡΠΎΠ±Ρ Π²ΡΡΠΈΡΠ»ΠΈΡΡ Π²ΡΡΠΎΡΡ / ΡΠΈΡΠΈΠ½Ρ ΠΎΠ±ΡΠ΅ΠΊΡΠ° ΠΈ ΠΏΡΠΈΡΠ²ΠΎΠΈΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΡ ΡΠ²ΠΎΠΉΡΡΠ²Π° Π²ΡΡΠΎΡΡ ΠΈ ΡΠΈΡΠΈΠ½Ρ.
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 , Π½ΠΎ Π΅ΡΡΡ Π±ΠΎΠ»ΡΡΠ°Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° ... Π― ΠΏΠΎΡΡΠ°ΡΠ°ΡΡΡ ΡΡΠΎ ΠΎΠ±ΡΡΡΠ½ΠΈΡΡ.
Π ΠΌΠΎΠ΅ΠΉ ΡΡΠ΅Π½Π΅ Π²ΡΠ΅Π³Π΄Π° Π΅ΡΡΡ ΠΎΠ΄ΠΈΠ½ Object3D, ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΠΈΠΉ Π²ΡΠ΅ Π³Π΅ΠΎΠΌΠ΅ΡΡΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΡΠΎΡΠΌΡ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Ρ ΠΌΠ΅Π½Ρ Π΅ΡΡΡ 8 ΡΡΠ΅Ρ Ρ ΡΠ°Π·Π½ΡΠΌ ΡΠ°Π΄ΠΈΡΡΠΎΠΌ ΠΈ ΡΠ°Π·Π½ΠΎΠΉ ΠΊΠΎΠΎΡΠ΄ΠΈΠ½Π°ΡΠΎΠΉ y. ΠΡΠ΅ ΠΎΠ½ΠΈ ΡΠ°ΡΠΏΠΎΠ»ΠΎΠΆΠ΅Π½Ρ Π² ΡΠΎΡΠΊΠ°Ρ
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}})
ΠΠ°ΠΊ Π²ΠΈΠ΄ΠΈΡΠ΅, ΠΎΠ³ΡΠ°Π½ΠΈΡΠΈΠ²Π°ΡΡΠΈΠ΅ ΠΏΡΡΠΌΠΎΡΠ³ΠΎΠ»ΡΠ½ΠΈΠΊΠΈ Π²ΡΠ΅Π³Π΄Π° Π²ΡΡΠΈΡΠ»ΡΡΡΡΡ Π² Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΠ΅ ΠΊΠΎΠΎΡΠ΄ΠΈΠ½Π°Ρ ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎΠΉ ΡΡΠ΅ΡΡ. Π ΠΊΠΎΠ³Π΄Π° ΠΈΡ ΠΎΠ±ΡΠ΅Π΄ΠΈΠ½ΡΠ΅ΡΡ, Π² ΡΡΠΎΠΌ Π½Π΅Ρ ΡΠΌΡΡΠ»Π°! ΠΠ°ΠΊ Ρ ΠΌΠΎΠ³Ρ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΠΎΠ³ΡΠ°Π½ΠΈΡΠΈΡΠ΅Π»ΡΠ½ΡΡ ΡΠ°ΠΌΠΊΡ Π² ΠΌΠΈΡΠΎΠ²ΡΡ ΠΊΠΎΠΎΡΠ΄ΠΈΠ½Π°ΡΠ°Ρ , ΡΡΠΎΠ±Ρ ΠΏΠΎΠ»ΡΡΠΈΡΡ Π½Π°ΡΡΠΎΡΡΡΡ ΠΎΠ³ΡΠ°Π½ΠΈΡΠΈΠ²Π°ΡΡΡΡ ΡΠ°ΠΌΠΊΡ ΠΌΠΎΠ΅Π³ΠΎ Object3D?
Π Π²Π΅ΡΠΊΠ΅ 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/859f148349ca64ede9ee224d55ad2ea3f51c0da0#diff -0dad6abd7a4801d561b83deddedc1baa
Π‘Π°ΠΌΡΠΉ ΠΏΠΎΠ»Π΅Π·Π½ΡΠΉ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΉ
Π― Π½Π°ΡΠΊΠ½ΡΠ»ΡΡ Π½Π° ΡΡΠΎ Π² ΠΏΠΎΠΈΡΠΊΠ°Ρ ΡΠΎΠ³ΠΎ ΠΆΠ΅ ΡΠ°ΠΌΠΎΠ³ΠΎ ΠΈ Π² ΠΈΡΠΎΠ³Π΅ ΠΎΡΡΠ°Π½ΠΎΠ²ΠΈΠ»ΡΡ Π½Π° ΡΡΠΎΠΌ: