问题描述
- 如何将pymunk旋转(body_type.angular_veLocity = 1)转换为实际弧度/秒。
- 如何根据移动的像素/秒确定下降质量的x和y速度
它与space.step()或每秒帧数有关系吗?
import pymunk
import pymunk.pygame_util
import pygame
GRAY = (220,220,220)
width_mass=50
height_mass=50
pygame.init()
size = 800,600
screen = pygame.display.set_mode(size)
draw_options = pymunk.pygame_util.DrawOptions(screen)
space = pymunk.Space()
space.gravity = (0,-50)
pts = [(-27,-238.5),(27,238.5),(-27,238.5)]
body_type=pymunk.Body(body_type=pymunk.Body.KINEMATIC)
body_type.position = (400,263.5)
space.add(body_type)
for i in range(4):
segment = pymunk.Segment(body_type,pts[i],pts[(i+1)%4],2)
segment.elasticity = 0
segment.friction=0
space.add(segment)
body_type.angular_veLocity=1
body = pymunk.Body(mass=1,moment=100)
body.position = 400,400
mass = pymunk.poly.create_Box(body,(width_mass,height_mass))
mass.elasticity = 0
space.add(body,mass)
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
#pygame.image.save(screen,'intro1.png')
screen.fill(GRAY)
space.debug_draw(draw_options)
pygame.display.update()
space.step(0.01)
解决方法
文档中对Pymunk使用的单位进行了简短说明:http://www.pymunk.org/en/latest/overview.html#mass-weight-and-units
通常,Pymunk不知道或不在乎您使用什么单位,当您对模拟进行建模以使用有意义的单位时,这取决于您。从Pymunk读取的值将使用您输入的任何值的单位(或派生单位)。
例如:
在您的代码中,您进行space.step(0.01)
,Pymunk不知道这是0.01秒还是0.01小时或其他时间。持仓也是如此。您进行了body.position = 400,400
,但是Pymunk不知道给定的位置是像素,米还是其他。这意味着如果您确定与Pymunk一起使用的时间单位是秒,而距离单位是像素,那么body.velocity
所能获得的速度将是像素/秒([unit of distance]/[unit of time]
)。
鉴于上述body.angular_velocity
将为1 rad /秒,而body.velocity
将以像素/秒为单位返回。但是请注意,您在屏幕上看到的内容不会完美匹配,因为您将dt
设置为space.step(dt)
为0.01,但是绘制循环不一定每秒运行100次(使用Pygame {{ 1}}方法来限制循环)