2017年10月2日月曜日

pyode vpython 座標 geomの一致



以下の画像のようにvpythonとgemoが一致しないことがある。
それをvpythonのrotateをしたのページのように使ってにげていたが。





rotateを生かす



rotateを殺す


---------------------------------------
結局は以下コードでいいようだ
 K:\MyBackups\goolgedrive\myprg_main\python_my_prg\vpython\GeomCCylinder_kakunin.py

class Ball:
    def __init__(
            self,field,
            m_density=0.01,
            m_radius=0.3,
            g_radius=0.3,
            v_radius=0.3,
            b_pos=vector(1,3,0),
            b_sp =vector(10,0,0),
            v_color=color.cyan
            ):
        self.body=ode.Body(field.world)
        M=ode.Mass()
        M.setSphere(m_density, m_radius)
        #(密度,半径)
        self.body.setMass(M)
        self.body.setPosition(b_pos)
        #self.body.addForce(b_sp)
        self.geom=ode.GeomSphere(
                space=field.space,
                radius=g_radius
                )
        #このradiusが実際のバウンドを決める
        #多分 sphereの座標が0で radiusが0.3だから
        #posが0.3ぐらいのバウンド点になる
        self.geom.setCategoryBits(1)
        self.geom.setCollideBits(3)
        #ボール同士の衝突を避ける
        #上は Boxのジオメトリを作成
        self.geom.setBody(self.body)
        # 剛体にジオメトリをセット
        self.vball=sphere(
            radius=v_radius,
            color=v_color
            )

    def update(self):
        pos=self.geom.getPosition()
        #boxのジオメトリの位置を得る
        self.vball.pos=pos
        #print pos,
----------------------------------------------------



vpyhton pyode 座標2
http://hannsihannsyou.blogspot.jp/2015/12/vpyhton-pyode-2.html

geom の座標の設定の仕方に注意すればクリアできる。

boxの場合GeomBoxの引数の順を赤文字のごとくすればいい
 class Box:
    def __init__(self, field, w, h, l, pos):
        #初期的設定では、Carクラスのなかで以下行のようにしているので
        #self.body = Box(field, width=2.0, height=0.5, length=3.5)

        self.body = ode.Body(field.world)
        M = ode.Mass()
        M.setBox(20, l, h, w)
        self.body.setMass(M)
        self.body.setPosition(pos)
        #self.geom = ode.GeomBox(
        #        space=field.space, lengths=(w, h, l))
        self.geom = ode.GeomBox(
                space=field.space, lengths=(l, h, w))

        self.geom.setBody(self.body)
        self.geom.setCategoryBits(2)
        self.geom.setCollideBits(3)
        self.frame = frame()
        self.vbox = box(
            frame=self.frame, width=w, height=h, length=l)




cylinderの場合は
 赤文字のposとaxisに気をつける
 class Cylinder:
    #cyld=Cylinder(field, 1, 5, (0,1.5,0))となっている
    #多分pyodeとvpythonの座標系は一緒だったな
    def __init__(self, field, r, h, pos):
        self.body = ode.Body(field.world)
        M = ode.Mass()
        M.setCylinder(1, 1, r, h)#密度,方向1はx軸の向き,半径,長さ
        #方向のパラメータは役にたっていない
        self.body.setMass(M)
        self.body.setPosition(pos)
        #とりあえずbodyのシリンダーの位置はboxのように物体の重心にあるものとして設定
        #vpythonとpyodeのposが合うか?

        self.geom = ode.GeomCylinder(space=field.space, radius=r, length=h)#vpythonの座標でx,y,z
        #lengthの向きはz方向のようだ。

        self.geom.setBody(self.body)
        #ここでgeomをbodyにセットするとgeomはz軸に-1/2h~+1/2hにセッ
        #トされる。従って、下の self.vcyld = cylinder でvpythonのcylinder
        #の位置は pos=(0,0,-h/2) となりその長さの方向はaxis=(0, 0,
        #h)となる。なぜならvpythonのcylinderは端がポジションの位置とな
        #っているから

        self.geom.setCategoryBits(2)
        self.geom.setCollideBits(3)
        self.frame = frame()
        #self.vbox = box(
        #        frame=self.frame, width= 1, height= 2, length= 5)
        self.vcyld = cylinder(
                frame=self.frame, pos=(0,0,-h/2),

                axis=(0, 0, h), radius=r) #vpythonの座標系でx,y,zの順
       # axixでcylinderの向きをzの方向へ向ける
        self.frame.pos = pos



vpython HPより

すると上の画像のようにvpythonとgeomが一致してボールがcylinderに対して
きれいにバウンドする。
緑のボールはz+方向(vpython)を示す














0 件のコメント:

コメントを投稿

About

参加ユーザー

連絡フォーム

名前

メール *

メッセージ *

ページ

Featured Posts