从朋克乐队到现实世界的单位

问题描述

我正在使用下面的代码我有两个问题。

  1. 如何将pymunk旋转(body_type.angular_veLocity = 1)转换为实际弧度/秒。
  2. 如何根据移动的像素/秒确定下降质量的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}}方法来限制循环)