2017年10月2日月曜日

ボール 落下 改良

以下やはり間違い

pyodeの基本コードの骨組み クラス変数 リスト グローバル変数
http://hannsihannsyou.blogspot.jp/2017/10/pyode.html

自由落下 ボール 無重力 運動 vpython     修正削除移動
https://blogs.yahoo.co.jp/hhhappyyyymoto/42655311.html


ボールの落下のコードがおかしかったので修正
Fieldクラスに__init__をいれる
tick関数の中にball updateがあったのをif __name__ == '__main__'
の中にいれる。


E:\goolgedrive\myprg_main\python_my_prg\ode_prg\ball_bound1.py


# coding: UTF-8
#ボールの自由落下による 地面とのバウンドから停止まで
#ball_bound.pyが文法的におかしいと思うので、というより
#すべていままでのコードがおかしかったと思うので修正
#なんせpyodeのサンプルコードがすくない。

import ode
from visual import *

class Field:
    def __init__(self):
        # 多分norm()から(0,0,0)をみるようにしている
        # autoscaleはボールがバウンドしてもいちいち遠目近目になったりしない   
        self.scene = display(forward=norm((-2.0,-1.0,-1.0)),autoscale=0)
       
        #物理世界を作成
        self.world=ode.World()
        self.world.setGravity((0, -9.81, 0))
        #自由落下させたいなら worldのコメントアウトのほうを生かし
        # 最後の方の ball.body.addForce((0,-1000,0)) を殺す
        #world.setGravity((0, 0, 0))
        #地平面を作成?
        self.space=ode.Space()

        #衝突関係
        self.jointgroup=ode.JointGroup()
        self.ode_floor=ode.GeomPlane(self.space,(0,1,0),0)
        #()なかの引数 上の例ではy軸方向に重力が発生
        #多分 spaceの最後の引数が y軸の座標を示す
        self.ode_floor.setCategoryBits(1)
        self.ode_floor.setCollideBits(3)
        self.ode_floor.viz=box(
            pos=(0,-0.03,0),
            width=10,length=10,height=0.06,color=(0.5,0.5,1.0))

        self.target_fps=30
        #target_fps=30だから1秒間に30回の処理をする
        self.dt=1.0/self.target_fps

    def near_callback(self,args,geom1,geom2):
        for c in ode.collide(geom1,geom2):
            #接触ジョイント (Contact joint) 
            #mu    摩擦係数 (摩擦方向1) mu2    摩擦係数 (摩擦方向2)
            #bounce    反発係数
            c.setBounce(0.97)
            c.setMu(50)
            c.setMu2(50)
            j=ode.ContactJoint(self.world,self.jointgroup,c)
            j.attach(geom1.getBody(),geom2.getBody())

    def tick(self):
        #time はとくにimport timeとしなくても使える
        #odeかvpythonかどちらかに付属している。調べても分からなかった。
        time.sleep(0.03)
        self.space.collide((),self.near_callback)
        #self.dtの間隔で世界を動かしていく
        self.world.step(self.dt)
        self.jointgroup.empty()
        return True

class Ball:
    def __init__(self,field):
        self.body=ode.Body(field.world)
        M=ode.Mass()
        M.setSphere(1, 1)
        self.body.setMass(M)
        self.geom=ode.GeomSphere(
                space=field.space,
                radius=0.3
                )
        #この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=0.3,
            color=color.red)

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


if __name__ == '__main__':
    field = Field()
    ball=Ball(field)
    ball.body.setPosition((0,2,0))
    ball.body.addForce((0,-1000,0))
   
    while True:
        #Filedに__init__をいれたらここにball.updateをいれないと動作しない
        #tick内ではだめ
        ball.update()
        field.tick()

0 件のコメント:

コメントを投稿

About

参加ユーザー

連絡フォーム

名前

メール *

メッセージ *

ページ

Featured Posts