pyodeでもできなくはない。 ちょと様子がちがうが、
//////////////////////////////////////////////////////////////////////
http://so-zou.jp/robot/tech/physics-engine/ode/object/geometry.htm
ジオメトリ変換オブジェクトの作成
dCreateGeomTransform()によって作成されるジオメトリ変換オブジェクトはdGeomID型であり、そこに格納されるジオメトリであるかのように振る舞います。dGeomID dCreateGeomTransform ( dSpaceID space );
カプセル化 (encapsulation)
格納
ジオメトリ変換オブジェクトgに、ジオメトリobjを格納 (カプセル化) します。void dGeomTransformSetGeom ( dGeomID g, dGeomID obj );※ ここで格納するジオメトリobjは、スペースに格納されていたり、ボディと関連付けられていてはなりません。」
////////////////////////////////////////////////////////////////////////////////////////////
L:\goolgedrive\myprg_main\python_my_prg\ode_prg\cylinder.geom_transform3.py
上のファイルで検討した。
結果
boxのgeomを GeomTransformのgeomにいれ る場合bodyは GeomTransformにせっとする・
つまり setBodyはGeomTransformの方にする
c言語odeとちがって
GeomTransformには一個のgeomしかいれられない。
GeomTransform独自にsetCategoryBitなど衝突に関するものが設定できる
#ボックス 1, 2 作成
# box = Box(field, 10, 1, 4, (0,2.51,0))
self.box_geom1 = ode.GeomBox(
space=None, lengths=(l, h, w))
self.box_geom2 = ode.GeomBox(
space=None, lengths=(l/2, h, w/2))
self.body = ode.Body(field.world)
M = ode.Mass()
M.setBox(20, l, h, w)
self.body.setMass(M)
self.body.setPosition(pos)
#self.box_geom.setBody(self.body)
#box_geomをsetBodyにしてしまうとエラーとなる
#setBodyはGeomTransformの方にする
self.geom = ode.GeomTransform(space=field.space)
self.geom.setBody(self.body)
# ここではGeomTransformを作成しこのなかにboxのgeomをカプセル
# 化している
self.geom.setGeom(self.box_geom1)
self.geom.setGeom(self.box_geom2)
#self.box_geom.setCategoryBits(1) #0010
#self.box_geom.setCollideBits(3) #0011
#ここで以下2行のコードを有効にするとboxが床をすり抜ける
#つまりGeomTransformの衝突設定のほうが有効になる
# self.geom.setCategoryBits(4) #0010
# self.geom.setCollideBits(4) #0011
self.frame = frame()
self.vbox1 = box(
frame=self.frame, width=w, height=h, length=l)
self.vbox2 = box(
frame=self.frame, width=w/2, height=h, length=l/2, pos=(0,1,0))
#self.vbox = box(pos=(pos), width=w, height=h, length=l)
#注意 vpythonとodeのCylinderでは posの位置が違う
#端と重心の位置の違い
def update(self):
pos = self.geom.getPosition()
mat = self.geom.getRotation()
self.frame.pos = pos
self.frame.axis = mat[0], mat[3], mat[6]
self.frame.up = mat[1], mat[4], mat[7]
0 件のコメント:
コメントを投稿