我希望能够锁定车轮相对于汽车底盘的角度。在两个车轮之间,有弹簧,可以让汽车暂停,但现在,角度没有锁定。我正在使用pymunk的函数“RotaryLimitJoint”
这样的行为就是目标(gif)
现在看起来是这样的:
我的代码:
car_pos = Vec2d(100,500)
mass = 30
radius = 10
moment = pymunk.moment_for_circle(mass, 20, radius)
wheel1_b = pymunk.Body(mass, moment)
wheel1_s = pymunk.Circle(wheel1_b, radius)
wheel1_s.friction = 1.5
wheel1_s.color = wheel_color
space.add(wheel1_b, wheel1_s)
mass = 30
radius = 10
moment = pymunk.moment_for_circle(mass, 20, radius)
wheel2_b = pymunk.Body(mass, moment)
wheel2_s = pymunk.Circle(wheel2_b, radius)
wheel2_s.friction = 1.5
wheel2_s.color = wheel_color
space.add(wheel2_b, wheel2_s)
mass = 100
size = (80,25)
moment = pymunk.moment_for_box(mass, size)
chassi_b = pymunk.Body(mass, moment)
chassi_s = pymunk.Poly.create_box(chassi_b, size)
chassi_s.color = chassi_color
space.add(chassi_b, chassi_s)
#Positions
chassi_b.position = car_pos + (0,-15)
wheel1_b.position = car_pos + (-25,0)
wheel2_b.position = car_pos + (25,0)
#Joints
spring1 = pymunk.DampedSpring(chassi_b, wheel1_b, (-25,0), (0,0), 20, 100000, 1)
spring1.collide_bodies = False
spring2 = pymunk.DampedSpring(chassi_b, wheel2_b, (25,0), (0,0), 20, 100000, 1)
spring2.collide_bodies = False
wheelAngle1 = pymunk.RotaryLimitJoint(wheel1_b, chassi_b, 0, 0)
wheelAngle1.collide_bodies = False
wheelAngle2 = pymunk.RotaryLimitJoint(chassi_b, wheel2_b, 0, 0)
wheelAngle2.collide_bodies = False
space.add(
spring1,
spring2,
wheelAngle1,
wheelAngle2
)
speed = 20
space.add(
pymunk.SimpleMotor(wheel1_b, chassi_b, speed),
pymunk.SimpleMotor(wheel2_b, chassi_b, speed)
)
旋转接头不是你需要的。它将约束车轮和底盘之间的角度,但车轮需要旋转,因此无法工作
您可以尝试使用GrooveJoint
这就是c代码中的代码,将其转换为python应该相当容易:
完整来源:https://github.com/slembcke/Chipmunk2D/blob/master/demo/Joints.c#L263
有关部分:
如果你不明白,我可以试着把它转换成python,但不幸的是,我的电脑上没有python&;Pymunk现在已经准备好了
首先是@viblo的积分
下面的代码之所以能够工作,是因为GrooveJoint(see docs)是垂直于汽车底盘创建的。GrooveJoint定义了一条线,在这条线上主体可以自由滑动。定义GrooveJoint它连接到汽车底盘和车轮(前轮和后轮)
现在看起来是这样的:
我将代码(从@viblo)转换为python,如下所示:
相关问题 更多 >
编程相关推荐