ワイヤのすり抜け対策
注意事項
agxWireは挟まれるような接触を想定して開発されていない
できる限りワイヤの接触を避けることが望ましい
ワイヤの接触をONにする
wire.setEnableCollisions(True)
ワイヤ自身の接触(セルフコリジョン、self collision)をONにする
agxWire.WireController.instance().setEnableCollisions(wire, wire, True)
ワイヤのセリフコリジョンはデフォルトでOFFなので、ON設定が必要
ワイヤ同士の接触をONにする
agxWire.WireController.instance().setEnableCollisions(wire1, wire2, True)
ワイヤ同士の接触はデフォルトでOFFなので、ON設定が必要
ワイヤ-オブジェクト間の接触をONにする
# rb: agx.RigidBody
agxWire.WireController.instance().setEnableCollisions(wire, rb, True)
# geometry: agxCollide.Geometry
agxWire.WireController.instance().setEnableCollisions(wire, geometry, True)
ワイヤとオブジェクト間のagx::ContactMaterialを調整する
# wireVsObjectCMat: agx.ContactMaterial
wireVsObjectCMat.setYoungsModulus()
wireVsObjectCMat.setDamping(2.0 * timeStep)
ヤング率を大きくし、物体間を硬くするすることで、お互いに侵入しにくくする
過減衰となるようにSpookDampingを調整し、侵入の解消を早める
BodyFixedNodeでワイヤを固定する
bodyFixedNode = agxWire.BodyFixedNode(rb, Vec3( 1, 0, 1))
wire.add(bodyFixedNode)
RigidBodyなどのオブジェクトと接触させてワイヤを固定している場合は、BodyFixedNodeを使ってワイヤを固定する
EyeNodeでワイヤを這わせる
# rb: EyeNodeを設置するRigidBody
# relativeTranslate: rbからEyeNodeを設置する相対位置
# extraEyeVector: ワイヤの出口方向ベクトル
# agxWire.EyeNode(rb: agx.RigidBody, relativeTranslate: agx.Vec3, extraEyeVector: agx.Vec3)
eyeNode: agxWire.EyeNode = agxWire.EyeNode(rb, Vec3(1, 0, 1), Vec3( -2, 0, 0)
wire.add(eyeNode)
RigidBodyなどのオブジェクトを丸カンボルトのようなワイヤの留め具として使っている場合は、EyeNodeを使う。ワイヤはEyeNodeを通り抜けられる。
ワイヤ、接触対象のオブジェクトのサイズを大きく調整する
ワイヤまたは接触対象のオブジェクトのサイズを大きくし、接触判定漏れを起きにくくする
シミュレーションのタイムステップを小さくする
# sim: agxSDK.Simulation
sim.setTimeStep()
タイムステップを小さくすることで、接触判定の頻度を増やし、侵入の解消を早める