private void SetupStringJoint() { _stringJoint = gameObject.AddComponent <ConfigurableJoint>(); var axis = Forward; _stringJoint.axis = axis; _stringJoint.secondaryAxis = axis.OrthogonalVector(); _stringJoint.LimitXMotion(); _stringJoint.LockYMotion(); _stringJoint.LockZMotion(); _stringJoint.LockAllAngularMotion(); _stringJoint.SetXDrive(StringSpring, 0, StringSpring); _stringJoint.anchor = transform.InverseTransformPoint(NockRigidbody.position) - axis * StringLimit; _stringJoint.targetPosition = Vector3.right * StringLimit; _stringJoint.autoConfigureConnectedAnchor = false; _stringJoint.connectedBody = NockRigidbody; _stringJoint.connectedAnchor = Vector3.zero; _stringJoint.linearLimit = new SoftJointLimit() { limit = StringLimit }; if (StringLimitStyle == HVRBowLimitStyle.Limit) { _stringLimitJoint = gameObject.AddComponent <ConfigurableJoint>(); _stringLimitJoint.axis = axis; _stringLimitJoint.secondaryAxis = axis.OrthogonalVector(); _stringLimitJoint.LimitXMotion(); _stringLimitJoint.LockYMotion(); _stringLimitJoint.LockZMotion(); _stringLimitJoint.LockAllAngularMotion(); _stringLimitJoint.anchor = transform.InverseTransformPoint(NockRigidbody.position); _stringLimitJoint.autoConfigureConnectedAnchor = false; _stringLimitJoint.connectedBody = NockRigidbody; _stringLimitJoint.connectedAnchor = Vector3.zero; _stringLimitJoint.linearLimit = new SoftJointLimit() { limit = StringLimit }; } }
private void FixedUpdate() { if (UpdateSpring) { _joint.SetXDrive(Spring, Damper, Spring); UpdateSpring = false; } var distance = (StartPosition - transform.localPosition).magnitude; if (!IsPressed && distance >= DownThreshold) { IsPressed = true; OnButtonDown(); } else if (IsPressed && distance < ResetThreshold) { IsPressed = false; OnButtonUp(); } }
private void SetupJoint() { _joint = gameObject.AddComponent <ConfigurableJoint>(); _joint.connectedBody = ConnectedBody; //_joint.anchor = StartPosition; _joint.autoConfigureConnectedAnchor = false; var worldStartPosition = StartPosition; if (transform.parent) { worldStartPosition = transform.parent.TransformPoint(StartPosition); } var worldEndPosition = EndPosition; if (transform.parent) { worldEndPosition = transform.parent.TransformPoint(EndPosition); } if (ConnectedBody) { _joint.connectedAnchor = ConnectedBody.transform.InverseTransformPoint(worldStartPosition); } else { _joint.connectedAnchor = worldStartPosition; } _joint.SetXDrive(Spring, Damper, Spring); _joint.LimitXMotion(); _joint.LockYMotion(); _joint.LockZMotion(); _joint.LockAllAngularMotion(); _joint.axis = _axis; _joint.secondaryAxis = _joint.axis.OrthogonalVector(); _joint.SetLinearLimit(Vector3.Distance(StartPosition, EndPosition)); _limitJoint = gameObject.AddComponent <ConfigurableJoint>(); _limitJoint.connectedBody = ConnectedBody; //_limitJoint.anchor = EndPosition; _limitJoint.autoConfigureConnectedAnchor = false; if (ConnectedBody) { _limitJoint.connectedAnchor = ConnectedBody.transform.InverseTransformPoint(worldEndPosition); } else { _limitJoint.connectedAnchor = worldEndPosition; } _limitJoint.LockYMotion(); _limitJoint.LockZMotion(); _limitJoint.LockAllAngularMotion(); _limitJoint.axis = _axis; _limitJoint.secondaryAxis = _joint.axis.OrthogonalVector(); _limitJoint.LimitXMotion(); _limitJoint.SetLinearLimit(Vector3.Distance(StartPosition, EndPosition)); }
public static void SetLinearDrive(this ConfigurableJoint joint, float spring, float damper, float maxforce) { joint.SetXDrive(spring, damper, maxforce); joint.SetYDrive(spring, damper, maxforce); joint.SetZDrive(spring, damper, maxforce); }
protected override void OnStringReleased(HVRHandGrabber arg0, HVRGrabbable arg1) { _stringJoint.SetXDrive(StringSpring, 0f, StringSpring); }