|
|
(37 intermediate revisions by 12 users not shown) |
Line 1: |
Line 1: |
| ==Quick overview== | | {{Obsolete|Max distance has been raised from 54m to 64m as of 2023/06/27. Update was announced here. [https://community.secondlife.com/blogs/entry/13626-coming-soon-server-release-202306/ Tech Updates Server Release 2023.06]}} |
| * Whether two prims can be linked depends only on their scale and position. Other properties such as rotation, hollow, cut, etc do not contribute. Read the section below for details of the linkability formula.
| | {{Multi-lang}} |
| * At the small extreme: two tiny prims can be linked if they are within about 2 meters from each other.
| | = New Linkability Rule = |
| * At the large extreme: the largest linked object that can be created must fit within a sphere with a diameter of 54 meters.
| | '''The linkability rule for objects changed as of Dec 2010.''' The main motivation was to make the linkability check more efficient but a consequence is that they are also much simpler. The size-dependency of the prims has been discarded. The only thing that matters is the bounding sphere of the collection of prim centers. The linkability rule can be written as: |
| * For linkability calculations megaprim scale components greater than 10 meters are clamped to 10.
| |
|
| |
|
| | LINKABLE = {{HoverText|D|diameter of the smallest bounding sphere of the collection of prim centers}} < 54 AND {{HoverText|N|number of prims in the collection}} ≤ 256 |
| | where D = diameter of the smallest bounding sphere of the collection of prim centers |
| | and N = number of prims in the collection |
|
| |
|
| ==The details==
| | [[User:Andrew Linden|Andrew Linden]] 21:47, 02 December 2010 (UTC) |
| Consider two primitives, A and B. Whether they can be linked or not is determined
| |
| by measuring the ''span'' from the edge of one object's ''bounding sphere'' to
| |
| the far opposite edge of the other's bounding sphere and comparing that value to the
| |
| ''maximum linkability span'' which is a function of the radii of the two bounding spheres:
| |
|
| |
|
| (1) max_link_span = minimum( 3 * (radius_A + radius_B) + SMALLEST_MAX, LARGEST_MAX )
| | If you are interested in how the old formula worked, see [[Linkability Rules/Havok 4]]. |
|
| |
|
| where:
| | === Notes === |
| | * [2011-08-27-16:52] Andrew Linden: 54 was the minimum sphere that still contained all of the legacy linkable content. |
|
| |
|
| (3) SMALLEST_MAX = 2.0 meters
| | [[Category:Havok]] |
| (4) LARGEST_MAX = 54.0 meters
| |
| (5) radius_X = radius of the primitive X's ''bounding sphere'' (Figure A)
| |
| (6) minimum(C, D) = C if less than D, otherwise D
| |
| | |
| If the measured span of the two bounding spheres is less than or equal to max_link_span then the corresponding primitives can be linked. Put in mathematical
| |
| terms:
| |
| | |
| (7) A_can_link_to_B = ( length(center_A - center_B) + radius_A + radius_B <= max_link_distance )
| |
| | |
| {|align="right"
| |
| |[[Image:Primitive_diameter.png]]
| |
| |}
| |
| The '''bounding sphere''' is the smallest sphere that totally encloses the
| |
| primitive's ''local bounding box''.
| |
| | |
| The '''local bounding box''' is centered at the primitive's ''geometric center'' and
| |
| has sides that are equal to the primitive's ''scale''. One exception to this
| |
| rule is that megaprim scale components greater than 10 meters are clamped to 10.
| |
| | |
| The '''geometric center''' of the primitive is its local symmetric center prior to
| |
| any ''cut'', ''shear'', ''twist'', ''taper'', or ''hollow'' operations.
| |
| | |
| '''Note''' that a primitive's bounding sphere is not necessarily the tightest sphere
| |
| possible for its shape, unless it is a simple box. The bounding sphere
| |
| depends only on the primitive's position and scale, so any
| |
| severly cut and hollowed primitive will be significantly smaller than its bounding
| |
| sphere, and not necessarily near the center. Also, a primitive with twist and/or
| |
| shear may have corners that extend outside of its bounding sphere. Since the
| |
| linkability rules depend only on the bounding sphere, which is ultimately dependent
| |
| only on the primitive's position and scale, the linkability of two prims is independent
| |
| of changes to form and rotation.
| |
| | |
| TODO -- we need a new figure_A that shows ''radius'' instead of ''diameter''.
| |
| Also need new figures _B and _C for two linkable prims and two linkable multi-prim objects.
| |
| | |
| === Linkability algorithm ===
| |
| | |
| The rules governing the '''linkability of multi-prim objects''' is very similar to
| |
| the two-primitive case. The same formulae (1) and (7) apply, but the
| |
| bounding spheres of multi-prim objects are the smallest spheres that completely
| |
| contain all of the bounding spheres of the corresponding primitives.
| |
| | |
| When linking '''three or more objects''' the algorithm iterates over the candidate
| |
| objects until all linkable pieces have been found. First the root object
| |
| is tested against each candidate object and the larger bounding sphere is
| |
| recomputed after a successful link. Then any unlinked pieces are tested between
| |
| themselves and merged into larger collections according to the formulae. The
| |
| root object is then re-tested against the modified candidates and the process
| |
| continues until all objects are linked, or no new links have been found.
| |
| | |
| === Failure modes ===
| |
| | |
| If an '''unlinkable set''' is tested by the linkability algorithm then the final subset
| |
| of linkable parts is determined by the order in which the candidates were submitted.
| |
| The trivial proof for this is to consider a root primitive in the middle of an infinite
| |
| grid of other primitives. It can't link to everything, but it were first tested against
| |
| all primitives west of it the final linkable subset of that first operation might not
| |
| link to any primitives to the east because of the LARGEST_MAX requirement (4). If the
| |
| primitives to the east were tested first then the final result would be different.
| |
| | |
| If a '''linkable set''' is tested by the linkability algorithm then the final subset
| |
| of linkable parts is NOT affected by the order in which the candidates were submitted.
| |
| That is, if just the linkable subsets of the failure modes above are tested for
| |
| all permutations of sequence they will always link. The proof of this is left
| |
| as an exercise for the reader.
| |
| | |
| === Examples ===
| |
| | |
| ==== 2 very small prims ====
| |
| radius_A = ~0.01
| |
| | |
| radius_B = ~0.01
| |
| | |
| SMALLEST_MAX = 2.0 meters
| |
| | |
| LARGEST_MAX = 54.0 meters
| |
| | |
| 3 * (radius_A + radius_B) + SMALLEST_MAX = 2.06 meters
| |
| | |
| 2.06 is less than 54
| |
| | |
| Thus max_link_distance = 2.06m
| |
| | |
| ==== one large prim and one small prim ====
| |
| radius_A = 5m
| |
| | |
| radius_B = ~0.01
| |
| | |
| SMALLEST_MAX = 2.0 meters
| |
| | |
| LARGEST_MAX = 54.0 meters
| |
| | |
| 3 * (radius_A + radius_B) + SMALLEST_MAX = 16.03 meters
| |
| | |
| 16.03 is smaller than 54.0
| |
| | |
| Thus max_link_distance = 16.03m
| |
| | |
| ==== 2 very large prims ====
| |
| The diameter of a bounding sphere is the square root of x^2 + y^2 + z^2
| |
| thus, the diameter of a 10m x 10m x 10m prim is the square root of (100+100+100) = ~17.3m
| |
| and the diameter of a 10m x 1m x 1m prim is square root (100+1+1) = ~10.1m
| |
| (The type of prim doesn't matter for this calculation. We only care about the dimentions.)
| |
| Let's take the case of two 10m x 10m x 10m prims.
| |
| | |
| radius_A = 8.66m
| |
| | |
| radius_B = 8.66m
| |
| | |
| SMALLEST_MAX = 2.0 meters
| |
| | |
| LARGEST_MAX = 54.0 meters
| |
| | |
| 3 * (radius_A + radius_B) + SMALLEST_MAX = 27.98m
| |
| | |
| 27.98 is smaller than 54
| |
| | |
| Thus max_link_distance = 27.98m
| |
| | |
| [[Category:Havok4]] | |