2016年11月29日火曜日

pyode GeomTransform

c言語のodeではジオメトリのカプセル化が以下のようにできるが
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 件のコメント:

コメントを投稿

About

参加ユーザー

連絡フォーム

名前

メール *

メッセージ *

ページ

Featured Posts