in Assets/MRTK/SDK/Features/UX/Scripts/BoundingBox/BoundingBox.cs [1587:1721]
private void AddLinks()
{
edgeCenters = new Vector3[12];
CalculateEdgeCenters();
edgeAxes = new CardinalAxisType[12];
edgeAxes[0] = CardinalAxisType.X;
edgeAxes[1] = CardinalAxisType.Y;
edgeAxes[2] = CardinalAxisType.X;
edgeAxes[3] = CardinalAxisType.Y;
edgeAxes[4] = CardinalAxisType.X;
edgeAxes[5] = CardinalAxisType.Y;
edgeAxes[6] = CardinalAxisType.X;
edgeAxes[7] = CardinalAxisType.Y;
edgeAxes[8] = CardinalAxisType.Z;
edgeAxes[9] = CardinalAxisType.Z;
edgeAxes[10] = CardinalAxisType.Z;
edgeAxes[11] = CardinalAxisType.Z;
for (int i = 0; i < edgeCenters.Length; ++i)
{
GameObject midpoint = new GameObject();
midpoint.name = "midpoint_" + i.ToString();
midpoint.transform.position = edgeCenters[i];
midpoint.transform.parent = rigRoot.transform;
GameObject midpointVisual;
if (rotationHandlePrefab != null)
{
midpointVisual = Instantiate(rotationHandlePrefab);
}
else
{
midpointVisual = GameObject.CreatePrimitive(PrimitiveType.Sphere);
Destroy(midpointVisual.GetComponent<SphereCollider>());
}
// Align handle with its edge assuming that the prefab is initially aligned with the up direction
if (edgeAxes[i] == CardinalAxisType.X)
{
Quaternion realignment = Quaternion.FromToRotation(Vector3.up, Vector3.right);
midpointVisual.transform.localRotation = realignment * midpointVisual.transform.localRotation;
}
else if (edgeAxes[i] == CardinalAxisType.Z)
{
Quaternion realignment = Quaternion.FromToRotation(Vector3.up, Vector3.forward);
midpointVisual.transform.localRotation = realignment * midpointVisual.transform.localRotation;
}
Bounds midpointBounds = GetMaxBounds(midpointVisual);
float maxDim = Mathf.Max(
Mathf.Max(midpointBounds.size.x, midpointBounds.size.y),
midpointBounds.size.z);
float invScale = rotationHandleSize / maxDim;
midpointVisual.transform.parent = midpoint.transform;
midpointVisual.transform.localScale = new Vector3(invScale, invScale, invScale);
midpointVisual.transform.localPosition = Vector3.zero;
Bounds bounds = new Bounds(midpointBounds.center * invScale, midpointBounds.size * invScale);
if (edgeAxes[i] == CardinalAxisType.X)
{
bounds.size = new Vector3(bounds.size.y, bounds.size.x, bounds.size.z);
}
else if (edgeAxes[i] == CardinalAxisType.Z)
{
bounds.size = new Vector3(bounds.size.x, bounds.size.z, bounds.size.y);
}
AddComponentsToAffordance(midpoint, bounds, rotationHandlePrefabColliderType, CursorContextInfo.CursorAction.Rotate, rotateHandleColliderPadding);
balls.Add(midpoint.transform);
handles.Add(new Handle()
{
Type = HandleType.Rotation,
HandleVisual = midpointVisual.transform,
HandleVisualRenderer = midpointVisual.GetComponent<Renderer>(),
});
if (handleMaterial != null)
{
ApplyMaterialToAllRenderers(midpointVisual, handleMaterial);
}
}
if (links != null)
{
GameObject link;
for (int i = 0; i < edgeCenters.Length; ++i)
{
if (wireframeShape == WireframeType.Cubic)
{
link = GameObject.CreatePrimitive(PrimitiveType.Cube);
Destroy(link.GetComponent<BoxCollider>());
}
else
{
link = GameObject.CreatePrimitive(PrimitiveType.Cylinder);
Destroy(link.GetComponent<CapsuleCollider>());
}
link.name = "link_" + i.ToString();
Vector3 linkDimensions = GetLinkDimensions();
if (edgeAxes[i] == CardinalAxisType.Y)
{
link.transform.localScale = new Vector3(wireframeEdgeRadius, linkDimensions.y, wireframeEdgeRadius);
link.transform.Rotate(new Vector3(0.0f, 90.0f, 0.0f));
}
else if (edgeAxes[i] == CardinalAxisType.Z)
{
link.transform.localScale = new Vector3(wireframeEdgeRadius, linkDimensions.z, wireframeEdgeRadius);
link.transform.Rotate(new Vector3(90.0f, 0.0f, 0.0f));
}
else // edgeAxes[i] == CardinalAxisType.X
{
link.transform.localScale = new Vector3(wireframeEdgeRadius, linkDimensions.x, wireframeEdgeRadius);
link.transform.Rotate(new Vector3(0.0f, 0.0f, 90.0f));
}
link.transform.position = edgeCenters[i];
link.transform.parent = rigRoot.transform;
Renderer linkRenderer = link.GetComponent<Renderer>();
linkRenderers.Add(linkRenderer);
if (wireframeMaterial != null)
{
linkRenderer.material = wireframeMaterial;
}
links.Add(link.transform);
}
}
}