Обрыв ждоинтов

Общие вопросы о Unity3D

Обрыв ждоинтов

Сообщение JackSmith 04 авг 2012, 21:59

Вобщем есть комната, в ней лежат кубики, все rigidbody, кубики я могу поднимать и перетаскивать этим скриптом:

Синтаксис:
  1. var spring = 50.0; 
  2. var damper = 0; 
  3. var drag = 1; 
  4. var angularDrag = 0.5; 
  5. var distance = 0.5; 
  6. var attachToCenterOfMass = false; 
  7. var player:GameObject; 
  8.  
  9.  
  10. private var springJoint : SpringJoint; 
  11.  
  12. function Update () 
  13.  
  14. // Make sure the user pressed the mouse down 
  15. if (!Input.GetMouseButtonDown (0)) 
  16. return; 
  17.  
  18. var mainCamera = FindCamera(); 
  19.  
  20. // We need to actually hit an object 
  21. var hit : RaycastHit; 
  22. if (!Physics.Raycast(mainCamera.ScreenPointToRay(Input.mousePosition), hit, 10)) 
  23. return; 
  24. // We need to hit a rigidbody that is not kinematic 
  25. if (!hit.rigidbody || hit.rigidbody.isKinematic) 
  26. return; 
  27.  
  28. if (!springJoint) 
  29. var go = new GameObject("Rigidbody dragger"); 
  30. var body : Rigidbody = go.AddComponent ("Rigidbody") as Rigidbody; 
  31. springJoint = go.AddComponent ("SpringJoint"); 
  32. body.isKinematic = true; 
  33.  
  34.  
  35.  
  36.  
  37.  
  38. springJoint.transform.position = hit.point; 
  39. if (attachToCenterOfMass) 
  40. var anchor = transform.TransformDirection(hit.rigidbody.centerOfMass) + hit.rigidbody.transform.position; 
  41. anchor = springJoint.transform.InverseTransformPoint(anchor); 
  42. springJoint.anchor = anchor; 
  43. else 
  44. springJoint.anchor = Vector3.zero; 
  45.  
  46. springJoint.spring = spring; 
  47. springJoint.damper = damper; 
  48. springJoint.maxDistance = distance; 
  49. springJoint.connectedBody = hit.rigidbody; 
  50.  
  51. StartCoroutine ("DragObject", hit.distance); 
  52.  
  53.  
  54. function DragObject (distance : float) 
  55. var oldDrag = springJoint.connectedBody.drag; 
  56. var oldAngularDrag = springJoint.connectedBody.angularDrag; 
  57. springJoint.connectedBody.drag = drag; 
  58. springJoint.connectedBody.angularDrag = angularDrag; 
  59. var mainCamera = FindCamera(); 
  60. while (Input.GetMouseButton (0)) 
  61.  
  62. var ray = mainCamera.ScreenPointToRay (Input.mousePosition); 
  63. springJoint.transform.position = ray.GetPoint(distance); 
  64. yield; 
  65. if (springJoint.connectedBody) 
  66. springJoint.connectedBody.drag = oldDrag; 
  67. springJoint.connectedBody.angularDrag = oldAngularDrag; 
  68. springJoint.connectedBody = null; 
  69.  
  70. function FindCamera () 
  71. if (camera) 
  72. return camera; 
  73. else 
  74. return Camera.main; 
  75.  


При высокой "упрогости" джоинта кубик передвигается со скоростью движения мыши, не отставая и не болтаясь, то есть то что надо, но есть такой момент, если пытаться вжимать куб в стену - он начинает дёргаться и глючить, в конце концов пролетая сквозь стену, что собственно и является проблемой.
В теории как решить проблему я знаю, если подумать логически то нужно подобное условие что при определённом растяжении джоинта, его просто дизейблить, грубо-говоря, ну или как вариант, при колизии со стеной обрывать джоинт, но это не дело, при любом лёгком касании кубик выпадает из рук.

Скажу прямо - я просто незнаю как написать условие растяжения джоинта, если такое вообще возможно, прошу помощи у вас ребят.
Спасибо заранее.
JackSmith
UNец
 
Сообщения: 3
Зарегистрирован: 04 авг 2012, 21:47

Re: Обрыв ждоинтов

Сообщение rim2812 04 авг 2012, 22:02

Как вариант,при коллизии со стеной,можешь уменьшать spring джоинта.
rim2812
UNец
 
Сообщения: 13
Зарегистрирован: 27 авг 2011, 18:38

Re: Обрыв ждоинтов

Сообщение JackSmith 05 авг 2012, 16:16

Вcё никак не получается описать колизию, условие что объект колизица со стеной висит на самом объекте, а перемещение этого объекта висит на камере. Юзал поиск, пытался связать 2 скрипта, но всё-равно немогу понять как это сделать, что-бы функция на камере понимала что объект прикасается к другому ~x(
JackSmith
UNец
 
Сообщения: 3
Зарегистрирован: 04 авг 2012, 21:47

Re: Обрыв ждоинтов

Сообщение JackSmith 06 авг 2012, 14:59

С предыдущим разобрался, теперь всё вроде работает кроме одного момента. Спринг джоинта изменяеца при касании со стеной при зажатой кнопке но ничего не меняется пока кнопку не отпустить и "взять предмет" опять, тогда ощутима разница в натяжении. В чём может быть проблема?

Каким-то образом заработало, просто очередной раз взял да запустил ничего не меняя..
Народ смотрю здесь на очень общительный, но всё-же попробую последний раз спросить..

Мб как-то надо определённо физику настроить что-бы сильно прижатый объект к другому не дёргался так сильно?
Просто даже уменьшая spring при касании выходит совсем не то что надо, если тащить объект вдоль стен и случайно её касаться то объект начинает как-бы прилипать немного, вобщем не то, а break force не срабатывает при сильном натяжении, когда взятый объект впресовывать в стену уводя мышку за неё, джоинт не рвёца, рвёца он только если резко дёрнуть..
JackSmith
UNец
 
Сообщения: 3
Зарегистрирован: 04 авг 2012, 21:47


Вернуться в Общие вопросы

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 19