PyODE 접촉 판정 및 점프 행위의 샘플
구현 경과
PyODE 웹 사이트여기.
본가의 튜토리얼에는'접촉 판정'과'바닥에서 튕기는'튜토리얼 3이 있다.
그러나 많은 낙하 대상이 있고 3D 묘사 부분의 코드가 많아 OpenGL이 필요하다
아무래도 과도해서 실시하기 어려운 샘플이다.
그래서 이 기사에서 우리는 가장 간단한'Tutorial 1'을 접촉해 보았고 바닥에 배척을 더했다.
↓ 관련 기사입니다.
・Tutorial 1 구현 보도
・Tutorial 3 구현 보도
개요
본가의'터토리얼 1'은 대상자에게 초속으로 자유롭게 떨어지는 모습을 관찰하는 것이다.
앞기사에서는 Matplotlib을 통해 드로잉 디스플레이를 추가하여 구현합니다.
이 시간에 프로그램에서.
• 대상의 접촉 판정에 대한 형상 정의
마루의 정의
접촉 판정 절차
중의 세 개.
이들 추가 부분은 이 같은'본가 터트리얼 3'을 패러디했다.
2 샘플 코드(전체)
상수
COLLISION
로 여는 곳은 추가분이다.Tutorial-1_bouncing.py
## pyODE example-1: with MPL-plot
## Appended ``A floor and collision'' to observe bouncing motion.
import ode
# Create a world object
world = ode.World()
world.setGravity( (0,-9.81,0) )
# Create a body inside the world
body = ode.Body(world)
M = ode.Mass()
rho = 2500.0
r = 0.05
M.setSphere( rho, r)
M.mass = 1.0
body.setMass(M)
body.setPosition( (0,0,0) )
#body.addForce( (0,200,0) )
body.setLinearVel( (0.0,10.0,0.0))
ERP_GLOBAL = 1.0
CFM_GLOBAL = 0.0
COLLISION = True
BOUNCE = 0.5
if COLLISION:
# Create a space object
space = ode.Space()
# Create a plane geom which prevent the objects from falling forever
floor = ode.GeomPlane( space, (0,1,0), 0. )
geom = ode.GeomSphere( space, radius=r )
geom.setBody( body )
world.setERP( ERP_GLOBAL ) #### ERP : Error Reduction Parameter
world.setCFM( CFM_GLOBAL ) #### CFM : Constraint Force Mixing
# A joint group for the contact joints that are generated whenever
# two bodies collide
contactgroup = ode.JointGroup()
# Collision callback
def near_callback(args, geom1, geom2):
""" Callback function for the collide() method.
This function checks if the given geoms do collide and
creates contact joints if they do.
"""
# Check if the objects do collide
contacts = ode.collide(geom1, geom2)
# Create contact joints
(world, contactgroup) = args
for c in contacts:
c.setBounce( BOUNCE ) #0.2)
c.setMu(5000)
j = ode.ContactJoint( world, contactgroup, c )
j.attach( geom1.getBody(), geom2.getBody() )
## Proceed the simulation...
total_time = 0.0
dt = 0.04
import numpy as np
nt = 100
txyzuvw = np.zeros( (7,nt+1) )
tn=0
END_TIME = 5.0
while total_time <= END_TIME:
x,y,z = body.getPosition()
u,v,w = body.getLinearVel()
print( "%1.2fsec: pos=(%6.3f, %6.3f, %6.3f) vel=(%6.3f, %6.3f, %6.3f)" % (total_time, x, y, z, u,v,w) )
if tn <= nt:
txyzuvw[0][tn]=total_time
txyzuvw[1][tn]=x
txyzuvw[2][tn]=y
txyzuvw[3][tn]=z
txyzuvw[4][tn]=u
txyzuvw[5][tn]=v
txyzuvw[6][tn]=w
if COLLISION:
# Detect collisions and create contact joints
space.collide( (world,contactgroup), near_callback )
world.step(dt)
total_time+=dt
if COLLISION:
# Remove all contact joints
contactgroup.empty()
tn += 1
end_tn = tn
import matplotlib.pyplot as plt
# MPL-Plot
plt.plot( txyzuvw[0][0:end_tn], txyzuvw[2][0:end_tn], label='Vertical position')
plt.plot( txyzuvw[0][0:end_tn], txyzuvw[5][0:end_tn], label='Vertical velocity')
plt.xlabel('time [s]')
plt.ylabel('Vertical position [m]')
plt.legend()
xmin = np.min( txyzuvw[0] )
xmax = np.max( txyzuvw[0] )
plt.hlines( [0], xmin, xmax, "blue", linestyles='dashed') # hlines
savepath = './y_ERP%g_CFM%g_BR%g.png'%(ERP_GLOBAL, CFM_GLOBAL, BOUNCE)
plt.savefig( savepath )
print('An image-file exported : [%s]'%savepath )
#plt.show()
plt.pause(1.0)
↑ 20200506: 수정은 시작 위치를 기록할 수 없습니다BOUNCE = 0.5
는 배척 계수다.3 프로그램 실행 및 결과
numby와 matplotlib을 미리 설치하십시오.
집행 후...
↑ 이 그래프 이미지(PNG)는 현재 저장됩니다.
수직 방향(Y 좌표)에서 물체의 높이와 속도를 투사하는 시간의 변화.
접촉 판정에 사용되는 물체의 직경값은 0.1m이다.(조금 더 작아도 괜찮아.)
떨어진 대상
-10.0[m/s]
이 바닥에 부딪혀+5.0 [m/s]
배척첫 번째 반등 행위는 계수와 같다.
두 번째 점프는 상당히 빗나갔다.
이 근거
dt
의 값도 변하고 ERP, CFM에 따라 달라질 수 있다. world.setERP( ERP_GLOBAL ) #### ERP : Error Reduction Parameter
world.setCFM( CFM_GLOBAL ) #### CFM : Constraint Force Mixing
↑ 이 부분에 설정된 두 값은 더 높은 계산을 할 때 연구가 필요하다.이번 수치
1.0
와 0.0
는 탄성 충돌 시 이상치다.아마도 아날로그의 부드러운 물리성에 근거하여 원가를 계산하는 상황에 따라 조정해야 할 것이다
(필자는 물건이라고 생각하고 아직 제대로 파악하지 못한 땀)
Reference
이 문제에 관하여(PyODE 접촉 판정 및 점프 행위의 샘플), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/emuai/items/652d36fb19b6f41dcd38텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)