黑猩猩/花栗鼠2D-动态物体与产生碰撞冲动的静态物体的碰撞 [英] Pymunk/Chipmunk2d - dynamic bodies colliding with static bodies generating collsion impulses

查看:30
本文介绍了黑猩猩/花栗鼠2D-动态物体与产生碰撞冲动的静态物体的碰撞的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

简单问题,但找不到答案:

静态物体可以对动态物体施加碰撞脉冲吗?

here's a little recording of what my code does

如您所见,这两个动态三角形相互碰撞,并被静态线阻止。然而,这种行为并不是我想要的。如果我只有一个三角形,它将只滑下一个顶点的平台-->静态物体不会对三角形施加任何形式的扭矩或反力(我不是物理学家)。

这是否意味着我应该只使用具有很高质量的动态物体作为障碍物?我使用静态障碍的理由是,我计划在我的模拟程序中设置很多障碍,动态物体会撞到它们。使用动态体构建整个环境可行吗?我错过了什么?

我在这个btw中使用了金龟子和果子游戏。感谢我能得到😀的任何帮助

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))

这篇关于黑猩猩/花栗鼠2D-动态物体与产生碰撞冲动的静态物体的碰撞的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆