Pymunk/Chipmunk2d - 动态物体与静态物体碰撞产生碰撞脉冲
Pymunk/Chipmunk2d - dynamic bodies colliding with static bodies generating collsion impulses
简单的问题,但找不到答案:
静态物体可以对动态物体施加碰撞冲击力吗?
here's a little recording of what my code does
如你所见,两个动态三角形碰撞在一起,被静态线挡住了。但是,这种行为不是我想要的。如果我只有一个三角形,它只会在一个顶点上滑下壁架 --> 静态物体不会对三角形施加任何类型的扭矩或反作用力(我不是物理学家)。
这是否意味着我应该只使用质量非常高的动态物体作为障碍物?我使用静态障碍物的原因是,我计划在我的 sim 中设置很多障碍物,动态物体会撞到它们上。使用动态物体构建整个环境是否可行?我错过了什么?
顺便说一句,我正在使用 pymunk 和 pygame。感谢我能得到的任何帮助
import pygame
import pymunk
import pymunk.pygame_util
pygame.init()
screen = pygame.display.set_mode((1000, 500))
space = pymunk.Space()
space.gravity = 0, -0.07
# triangle creation func, takes position arguments
def create_tri(x, y):
pos = pygame.math.Vector2(x, y)
points = (0, 0), (50, 0), (25, 50)
moment = pymunk.moment_for_poly(1, points)
body = pymunk.Body(1, moment)
body.position = pos
shape = pymunk.Poly(body, points)
return body, shape
# creating 2 triangles
tri2 = create_tri(100, 400)
space.add(tri2[0], tri2[1])
# temporary obstacle setup
line_moment = pymunk.moment_for_segment(0, (0, 0), (600, -300), 10)
line_body = pymunk.Body(10, line_moment, body_type=pymunk.Body.STATIC)
line_body.position = (0, 300)
line_shape = pymunk.Segment(line_body, (0, 0), (600, -300), 10)
space.add(line_shape)
# Main loop
game_running = True
while game_running:
ev = pygame.event.poll()
if ev.type == pygame.QUIT:
pygame.quit()
screen.fill((255, 255, 255))
draw_options = pymunk.pygame_util.DrawOptions(screen)
space.debug_draw(draw_options)
space.step(0.02)
pygame.display.flip()
问题是三角形的重心在角(0,0)。这意味着它的所有质量都在那个点上,这就是为什么它不会转动并从侧面向下滑动的原因。
解决它的一种方法是进行调整,使 (0,0) 位于三角形的中间:
points = (-25, -25), (25, -25), (0, 25)
另一种方法是在创建形状时变换三角形的顶点,通过在每个方向上平移它们 -25:
shape = pymunk.Poly(body, points, pymunk.Transform(tx=-25,ty=-25))
简单的问题,但找不到答案:
静态物体可以对动态物体施加碰撞冲击力吗?
here's a little recording of what my code does
如你所见,两个动态三角形碰撞在一起,被静态线挡住了。但是,这种行为不是我想要的。如果我只有一个三角形,它只会在一个顶点上滑下壁架 --> 静态物体不会对三角形施加任何类型的扭矩或反作用力(我不是物理学家)。
这是否意味着我应该只使用质量非常高的动态物体作为障碍物?我使用静态障碍物的原因是,我计划在我的 sim 中设置很多障碍物,动态物体会撞到它们上。使用动态物体构建整个环境是否可行?我错过了什么?
顺便说一句,我正在使用 pymunk 和 pygame。感谢我能得到的任何帮助
import pygame
import pymunk
import pymunk.pygame_util
pygame.init()
screen = pygame.display.set_mode((1000, 500))
space = pymunk.Space()
space.gravity = 0, -0.07
# triangle creation func, takes position arguments
def create_tri(x, y):
pos = pygame.math.Vector2(x, y)
points = (0, 0), (50, 0), (25, 50)
moment = pymunk.moment_for_poly(1, points)
body = pymunk.Body(1, moment)
body.position = pos
shape = pymunk.Poly(body, points)
return body, shape
# creating 2 triangles
tri2 = create_tri(100, 400)
space.add(tri2[0], tri2[1])
# temporary obstacle setup
line_moment = pymunk.moment_for_segment(0, (0, 0), (600, -300), 10)
line_body = pymunk.Body(10, line_moment, body_type=pymunk.Body.STATIC)
line_body.position = (0, 300)
line_shape = pymunk.Segment(line_body, (0, 0), (600, -300), 10)
space.add(line_shape)
# Main loop
game_running = True
while game_running:
ev = pygame.event.poll()
if ev.type == pygame.QUIT:
pygame.quit()
screen.fill((255, 255, 255))
draw_options = pymunk.pygame_util.DrawOptions(screen)
space.debug_draw(draw_options)
space.step(0.02)
pygame.display.flip()
问题是三角形的重心在角(0,0)。这意味着它的所有质量都在那个点上,这就是为什么它不会转动并从侧面向下滑动的原因。
解决它的一种方法是进行调整,使 (0,0) 位于三角形的中间:
points = (-25, -25), (25, -25), (0, 25)
另一种方法是在创建形状时变换三角形的顶点,通过在每个方向上平移它们 -25:
shape = pymunk.Poly(body, points, pymunk.Transform(tx=-25,ty=-25))