- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在使用Pymunk模拟安装在细长腿顶部枢轴上的盒子的物理特性,该腿固定在地面上。连接盒子和腿的枢轴是 PivotJoint 和 SimpleMotor 的组合,模拟原始伺服系统,用户可以打开和关闭伺服系统,以将盒子的质心转移到腿上。以下是我实现此模型的 Pymunk+Pygame 代码:
from __future__ import print_function
import sys
from math import pi
import pygame
from pygame.locals import USEREVENT, QUIT, KEYDOWN, KEYUP, K_s, K_r, K_q, K_ESCAPE, K_UP, K_DOWN
from pygame.color import THECOLORS
import pymunk
from pymunk import Vec2d
import pymunk.pygame_util
LEG_GROUP = 1
class Simulator(object):
def __init__(self):
self.display_flags = 0
self.display_size = (600, 600)
self.space = pymunk.Space()
self.space.gravity = (0.0, -1900.0)
self.space.damping = 0.999 # to prevent it from blowing up.
# Pymunk physics coordinates start from the lower right-hand corner of the screen.
self.ground_y = 100
ground = pymunk.Segment(self.space.static_body, (5, self.ground_y), (595, self.ground_y), 1.0)
ground.friction = 1.0
self.space.add(ground)
self.screen = None
self.draw_options = None
def reset_bodies(self):
for body in self.space.bodies:
if not hasattr(body, 'start_position'):
continue
body.position = Vec2d(body.start_position)
body.force = 0, 0
body.torque = 0
body.velocity = 0, 0
body.angular_velocity = 0
body.angle = body.start_angle
def draw(self):
### Clear the screen
self.screen.fill(THECOLORS["white"])
### Draw space
self.space.debug_draw(self.draw_options)
### All done, lets flip the display
pygame.display.flip()
def main(self):
pygame.init()
self.screen = pygame.display.set_mode(self.display_size, self.display_flags)
width, height = self.screen.get_size()
self.draw_options = pymunk.pygame_util.DrawOptions(self.screen)
def to_pygame(p):
"""Small hack to convert pymunk to pygame coordinates"""
return int(p.x), int(-p.y+height)
def from_pygame(p):
return to_pygame(p)
clock = pygame.time.Clock()
running = True
font = pygame.font.Font(None, 16)
# Create the torso box.
box_width = 50
box_height = 100
leg_length = 100
leg_thickness = 2
mass = 200
points = [(-box_width/2, -box_height/2), (-box_width/2, box_height/2), (box_width/2, box_height/2), (box_width/2, -box_height/2)]
moment = pymunk.moment_for_poly(mass, points)
body1 = pymunk.Body(mass, moment)
body1.position = (self.display_size[0]/2, self.ground_y+box_height/2+leg_length)
body1.start_position = Vec2d(body1.position)
body1.start_angle = body1.angle
shape1 = pymunk.Poly(body1, points)
shape1.group = LEG_GROUP
shape1.friction = 0.8
shape1.elasticity = 0.0
self.space.add(body1, shape1)
# Create bar 2 extending from the right to the origin.
mass = 10
points = [
(leg_thickness/2, -leg_length/2),
(-leg_thickness/2, -leg_length/2),
(-leg_thickness/2, leg_length/2-leg_thickness),
(leg_thickness/2, leg_length/2-leg_thickness/2)
]
moment = pymunk.moment_for_poly(mass, points)
body2 = pymunk.Body(mass, moment)
body2.position = (self.display_size[0]/2-box_width/2, self.ground_y+leg_length/2)
body2.start_position = Vec2d(body2.position)
body2.start_angle = body2.angle
shape2 = pymunk.Poly(body2, points)
shape2.group = LEG_GROUP
shape2.friction = 0.8
shape2.elasticity = 0.0
self.space.add(body2, shape2)
# Link bars together at end.
pj = pymunk.PivotJoint(body1, body2, (self.display_size[0]/2-box_width/2, self.ground_y+leg_length-leg_thickness))
self.space.add(pj)
# Attach the foot to the ground in a fixed position.
pj = pymunk.PivotJoint(self.space.static_body, body2, (self.display_size[0]/2-box_width/2, self.ground_y+leg_thickness))
self.space.add(pj)
# Actuate the bars via a motor.
motor_joint = pymunk.SimpleMotor(body1, body2, 0)
self.space.add(motor_joint)
# Add hard stops to leg pivot so the torso can't rotate through leg.
hip_limit_joint = pymunk.RotaryLimitJoint(body1, body2, -pi/4., pi/4.) # -45deg:+45deg
self.space.add(hip_limit_joint)
pygame.time.set_timer(USEREVENT+1, 70000) # apply force
pygame.time.set_timer(USEREVENT+2, 120000) # reset
pygame.event.post(pygame.event.Event(USEREVENT+1))
pygame.mouse.set_visible(False)
simulate = False
while running:
# print('angles:', body1.angle, body2.angle)
servo_angle = (body1.angle - body2.angle) * 180/pi # 0 degrees means leg is angled straight down
servo_cw_enabled = servo_angle > -45
servo_ccw_enabled = servo_angle < 45
for event in pygame.event.get():
if event.type == QUIT or (event.type == KEYDOWN and event.key in (K_q, K_ESCAPE)):
#running = False
sys.exit(0)
elif event.type == KEYDOWN and event.key == K_s:
# Start/stop simulation.
simulate = not simulate
elif event.type == KEYDOWN and event.key == K_r:
# Reset.
# simulate = False
self.reset_bodies()
elif event.type == KEYDOWN and event.key == K_UP:
if servo_ccw_enabled:
motor_joint.rate = 5
else:
motor_joint.rate = 0
elif event.type == KEYDOWN and event.key == K_DOWN:
if servo_cw_enabled:
motor_joint.rate = -5
else:
motor_joint.rate = 0
elif event.type == KEYUP:
motor_joint.rate = 0
self.draw()
### Update physics
fps = 50
iterations = 25
dt = 1.0/float(fps)/float(iterations)
if simulate:
for x in range(iterations): # 10 iterations to get a more stable simulation
self.space.step(dt)
pygame.display.flip()
clock.tick(fps)
if __name__ == '__main__':
sim = Simulator()
sim.main()
您可以通过按“s”开始模拟,然后使用向上/向下键围绕腿旋转盒子。它的行为基本上与预期一致……直到它接触地面,然后它开始猛烈地“弹跳”。 See this screen capture举个例子。
我该如何阻止这个?我通过赋予盒子很大的质量来使其变得非常重,并且我将所有东西的弹性设置为 0。文档提到,如果每次更新使用的迭代次数少于 10 次,则东西可能会变得有弹性或柔软,但我'我使用 25。我还缺少什么?
最佳答案
尝试设置电机关节的 max_force。没有它,电机关节可以使用无限的力量。
例如这样:motor_joint.max_force = 100000000
另请注意,两个形状的组设置是错误的。 shape2.group = LEG_GROUP
不执行任何操作。在以前的版本 (<5.0) 中,组的工作方式如下,但现在您应该使用 ShapeFilter:shape1.filter = pymunk.ShapeFilter(group=LEG_GROUP)
关于python - 如何阻止皮蒙克关节的 body 弹跳?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49595170/
这个问题在这里已经有了答案: What is a NullReferenceException, and how do I fix it? (27 个答案) 关闭 9 年前。 我已经设法创建了一个
我被要求简化这个问题,所以这就是我正在做的事情。 我在 SpriteKit 的物理关节(以及可能的物理 body 属性)中苦苦挣扎。我尝试了每个子类和许多配置,但接缝好像没有任何效果,或者我做错了什么
我正在使用 SpriteKit 为项目创建一个有趣的 Hotspot UI。应该很简单吧!只是一个背景图片,上面有很多点。当您点击一个点时,它会放大。当您再次点击时,它会恢复到正常大小和位置。但是,更
我目前正在使用 physx(尝试将 ik 添加到布娃娃)。出于某种原因,布娃娃的所有关节都是无摩擦的,因此,布娃娃往往会“摇晃”,尤其是当它悬卡在空中并连接到多个移动的运动参与者时。 我想给关节增加摩
我正在使用 NAOqi 和 Python 为我的 NAO 机器人编程。当我从 Python 文件复制代码时 here它工作正常。我这样调整它以适应我的变量: nav.setStiffnesses("H
SKPhysicsJointSpring 的damping 和frequency 属性有什么区别? 我的代码是 var spring = SKPhysicsJointSpring.jointWithB
TL;DR:Sticky 实际上能够对我通过 JavaScript 提供的更改使用react吗?如果是,怎么做? (该项目使用 Foundation 6.2 和 WordPress 4.4,主题安装使
我想从这个 JSon 文本中使用 JSON 获取“source”中文本的值:{“id”: { "cells": [ { "type": "dev
我显示来自 JointJS 演示的 uml 图 https://github.com/clientIO/joint/tree/master/demo/umlcd在 Angular 8 中,我收到错误:
我是一名优秀的程序员,十分优秀!