public static CylinderHandleCap ( int controlID, Vector3 position, |
||
controlID | int | The control ID for the handle. |
position | Vector3 | The world-space position of the handle's start point. |
rotation | The rotation of the handle. | |
size | float | The size of the handle in world-space units. |
eventType | EventType | Event type for the handle to act upon. By design it handles EventType.Layout and EventType.Repaint events. |
Результат | void |
private void ShowPrismaticLimits(ArticulationBody body, ArticulationBody parentBody, Matrix4x4 parentAnchorSpace) { // if prismatic and unlocked - nothing to visualise if (body.linearLockX == ArticulationDofLock.FreeMotion || body.linearLockY == ArticulationDofLock.FreeMotion || body.linearLockZ == ArticulationDofLock.FreeMotion) { return; } float dashSize = 5; // compute the primary axis of the prismatic Vector3 primaryAxis = Vector3.zero; ArticulationDrive drive = body.xDrive; if (body.linearLockX == ArticulationDofLock.LimitedMotion) { primaryAxis = Vector3.right; drive = body.xDrive; } else if (body.linearLockY == ArticulationDofLock.LimitedMotion) { primaryAxis = Vector3.up; drive = body.yDrive; } else if (body.linearLockZ == ArticulationDofLock.LimitedMotion) { primaryAxis = Vector3.forward; drive = body.zDrive; } // now show the valid movement along the axis as well as limits using (new Handles.DrawingScope(parentAnchorSpace)) { Vector3 lowerPoint = primaryAxis * drive.lowerLimit; Vector3 upperPoint = primaryAxis * drive.upperLimit; Quaternion orientation = Quaternion.LookRotation(primaryAxis); Handles.color = Color.red; Handles.CylinderHandleCap(0, lowerPoint, orientation, CapScale, EventType.Repaint); Handles.color = Color.green; Handles.CylinderHandleCap(0, upperPoint, orientation, CapScale, EventType.Repaint); Handles.color = Color.white; Handles.DrawDottedLine(lowerPoint, upperPoint, dashSize); } }
private void ShowAngularLimitSpan(bool freeMotion, ArticulationBody body, ArticulationBody parentBody, Color color, Vector3 axis, Matrix4x4 space, ArticulationDrive drive, Vector3 zeroDirection) { // check if it's a free span - show only a solid disc in this case if (freeMotion) { using (new Handles.DrawingScope(space)) { color.a = 0.3f; Handles.color = color; Handles.DrawSolidDisc(Vector3.zero, axis, GizmoLinearSize); } return; } // here we know the angle is limited - show a span float totalAngle = drive.upperLimit - drive.lowerLimit; Quaternion zeroPose = Quaternion.FromToRotation(Vector3.forward, Vector3.Cross(axis, zeroDirection)); Quaternion lowerRotation = Quaternion.AngleAxis(drive.lowerLimit, axis); Quaternion upperRotation = Quaternion.AngleAxis(drive.upperLimit, axis); Vector3 from = lowerRotation * zeroDirection; Vector3 to = upperRotation * zeroDirection; // Nb: Cylinder cap is oriented along Z using (new Handles.DrawingScope(space)) { color.a = 0.3f; Handles.color = color; Handles.DrawSolidArc(Vector3.zero, axis, from, totalAngle, GizmoLinearSize); Handles.color = Color.red; Handles.CylinderHandleCap(0, from * GizmoLinearSize, lowerRotation * zeroPose, CapScale, EventType.Repaint); Handles.color = Color.green; Handles.CylinderHandleCap(0, to * GizmoLinearSize, upperRotation * zeroPose, CapScale, EventType.Repaint); } }
public void PrismaticHandleDrawFunction( int controlID, Vector3 position, Quaternion rotation, float size, EventType eventType ) { Handles.CylinderHandleCap(controlID, position, rotation, size * HandleUtility.GetHandleSize(position), eventType); }