以下の画像のように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 件のコメント:
コメントを投稿