- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这个问题是关于pymunk的,但我知道有更多的黑猩猩用户;所以如果你的答案涉及到C/Chipmunk代码,那就没关系了。虽然我不知道如何编写C代码,但如果我读了别人的代码,我通常可以知道发生了什么。
设置
我在模拟一个自上而下的滑动物体游戏(比如卷发或洗牌)。
我对代码的相关部分做了一个简单的示例(在问题的末尾),但它的核心是:
两个相同的物理物体被创造出来(以下是卷曲术语,我称之为“石头”)
它们的位置具有相同的x值,但y值不同(一个位于另一个上方的直线上)。
使用apply_脉冲(目前,虽然尝试了其他方法),较低的石头直接“发射”到另一块石头上
我希望达到的目标
当石头碰撞时,下一块石头会突然停下来(或者可能会反弹一点——我还没想清楚细节),同时它的全部或大部分能量都会转移到上一块石头上,上一块石头就会开始向屏幕上方移动。
我得到的是
当石头碰撞时,下一块石头不会停止,并开始向上推动上一块石头。
就好像下面的质量比上面的大,但是它们的功能是一样的,所以它们应该是一样的。
我已经上传了一个.gif到imgur,如果它有帮助的话,可以说明这一点:
http://imgur.com/a/FF6Xq
它的帧速率比实际运行脚本时要低,但它仍然说明了发生了什么。
我试过的
阅读pygame文档,尝试识别所有可能相关的body和shape属性,我尝试以各种组合调整以下所有属性:
身体质量
形状.摩擦
形状.弹性
“地面摩擦力”(在自上而下方案中模拟地面摩擦力的枢轴约束的最大力)
下一块石头发射时的“能量”(传递给应用脉冲的参数之一)
用施加力代替施加脉冲
调整任何/所有这些都会使石头的行为发生明显和预期的变化,但没有改变一块石头碰撞时推另一块石头的根本问题。
我读过关于使用pymunk.CollisionHandler()的文章,但还没有尝试使用它。从文档中,我感觉到这主要是为了给碰撞添加额外的效果,而不是为了修改碰撞发生时的基本物理。但我可能误解了,不接受任何建议。
我看了好几部《侏儒》的演示。最值得注意的是,一个名为newtons_cradle.py的演示展示了我想要的行为。这是对其中一个小玩意的模拟,其中有五个球悬挂在一排;当用户将一端的一个球向后拉时,它会击中另一端的球,能量会转移到另一侧的球上。
newtons_crade.py与我的代码只有两个主要区别:
这是“侧视图”(所以,重力大于0)
不使用“应用脉冲”或“应用力”,只使用重力将球推向其他球(受约束)。
遗憾的是,在我自上而下的设置中,使用重力不是一个选项。
所以问题可能是我使用了“应用脉冲/应用力”,但我看不到任何方法来修改这些方法的使用(我已经尝试了各种功率和质量的组合,以及调整约束的设置)。
即使是把我指向正确的方向——也就是说,给我一些关于我可能读到的其他内容的建议,或者我可能尝试修改的其他内容——也会非常感激。我不可能是第一个在侏儒/花栗鼠身上尝试这个的人,但是我还没有找到一个例子。至少在侏儒方面没有;如果我能在C/花栗鼠方面研究一个好例子,那也会很有用。
谢谢大家抽出时间。
最小示例代码
没有必要研究代码来理解这个问题,但我已经把它贴在这里以防万一。虽然剥去了代码的核心部分,但它是一个完整的脚本,可以运行。在Python 3中。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
import pygame
from pygame.locals import *
import pymunk
import pymunk.pygame_util
def add_and_tether_stone(space,sx,sy):
"""Creates a stone and its corresponding shape, and tethers it with constraints that simulate ground friction and govern spin."""
#body
mass = stone_mass
radius = stone_radius
moment = pymunk.moment_for_circle(mass, 0, radius)
body = pymunk.Body(mass, moment)
body.position = sx,sy
#shape
shape = pymunk.Circle(body, radius)
shape.friction = stone_friction
shape.elisticity = stone_elisticity
space.add(body, shape)
#constraints
fpiv = pymunk.constraint.PivotJoint(space.static_body,body,(0.0,0.0),(0.0,0.0))
fpiv.max_force = ground_friction
fpiv.max_bias = 0.0
fmot = pymunk.constraint.SimpleMotor(space.static_body,body,0)
fmot.max_force = 5000000 #arbitry 'very high' value clamps down on the high rotation imparted by apply_impulse or apply_force
space.add(fpiv)
space.add(fmot)
return body,shape,fpiv,fmot
def launch_stone(body,power):
"""Launches a stone in the manner of a player taking a shot."""
body.apply_impulse_at_world_point((0,power),(0,0)) #force(x,y),offset(x,y)
def main():
global ground_friction,stone_mass,stone_radius,stone_friction,stone_elisticity
running = True
#PyGame setup
pygame.init()
screen = pygame.display.set_mode((500,500))
clock = pygame.time.Clock()
sheet = pygame.Surface((500,500))
sheetcolor = (0,0,0)
sheet.fill(sheetcolor)
sheet = sheet.convert()
sheetblit = (0,0)
screen.blit(sheet,sheetblit)
#PyMunk setup
space = pymunk.Space() #space.damping defaults to 1.0, and space.gravity defaults to (0.0, 0.0).
draw_options = pymunk.pygame_util.DrawOptions(sheet) #used only for the pygame_util debug draw mode
#Constants to Tweak
stone_mass = 1.4
stone_radius = 20
power = 340 #in a full implementation, this would vary with player input
ground_friction = 4.5
stone_friction = 2.0
stone_elisticity = 1.0
#Setup for the minimal example: add two stones and launch one at the other.
stone_a = add_and_tether_stone(space,40,260)
stone_b = add_and_tether_stone(space,40,21)
launch_stone(stone_b[0],power)
while running:
for event in pygame.event.get(): #listen for controls (all the controls except 'esc' have been removed for the minimal example)
if event.type == KEYDOWN and event.key == K_ESCAPE:
running = False
#Draw, update physics, and advance
sheet.fill(sheetcolor)
space.debug_draw(draw_options) #from pymunk.pygame-util (handy!)
screen.blit(sheet,sheetblit)
space.step(1/50.0)
pygame.display.flip()
clock.tick(50)
if __name__ == '__main__':
sys.exit(main())
最佳答案
也许我在你的代码中漏掉了一些东西(我这里只有命令行python,所以我不能运行你的脚本),但是我不能重新创建你的问题。
下面是我尝试的一个简短的代码,它似乎可以按您的要求工作:
import pymunk
s = pymunk.Space()
b1 = pymunk.Body(1,10)
b1.position = 0,0
b2 = pymunk.Body(1,10)
b2.position = 0,10
c1 = pymunk.Circle(b1, 1)
c1.elasticity = 1.0
c2 = pymunk.Circle(b2, 1)
c2.elasticity = 1.0
j1 = pymunk.constraint.PivotJoint(s.static_body, b1, (0,0),(0,0))
j1.max_force = 4.5
j1.max_bias = 0
j2 = pymunk.constraint.PivotJoint(s.static_body, b2, (0,0),(0,0))
j2.max_force = 4.5
j2.max_bias = 0
j3 = pymunk.constraint.SimpleMotor(s.static_body,b1,0)
j3.max_force = 5000000
j4 = pymunk.constraint.SimpleMotor(s.static_body,b2,0)
j4.max_force = 5000000
s.add(b1,b2,c1,c2,j1,j2,j3,j4)
b1.apply_impulse_at_world_point((0,30),(0,0))
for x in range(25):
s.step(0.02)
print(b1.position, b2.position)
Vec2d(0.0, 0.6) Vec2d(0.0, 10.0)
Vec2d(0.0, 1.1982) Vec2d(0.0, 10.0)
Vec2d(0.0, 1.7946) Vec2d(0.0, 10.0)
Vec2d(0.0, 2.3891999999999998) Vec2d(0.0, 10.0)
Vec2d(0.0, 2.9819999999999998) Vec2d(0.0, 10.0)
Vec2d(0.0, 3.573) Vec2d(0.0, 10.0)
Vec2d(0.0, 4.1622) Vec2d(0.0, 10.0)
Vec2d(0.0, 4.7496) Vec2d(0.0, 10.0)
Vec2d(0.0, 5.3352) Vec2d(0.0, 10.0)
Vec2d(0.0, 5.9190000000000005) Vec2d(0.0, 10.0)
Vec2d(0.0, 6.501) Vec2d(0.0, 10.0)
Vec2d(0.0, 7.081200000000001) Vec2d(0.0, 10.0)
Vec2d(0.0, 7.659600000000001) Vec2d(0.0, 10.0)
Vec2d(0.0, 8.2362) Vec2d(0.0, 10.0)
Vec2d(0.0, 8.228112001309862) Vec2d(0.0, 10.584682725252637)
Vec2d(0.0, 8.228112001309862) Vec2d(0.0, 11.159477451815137)
Vec2d(0.0, 8.228112001309862) Vec2d(0.0, 11.732472178377638)
Vec2d(0.0, 8.228112001309862) Vec2d(0.0, 12.303666904940137)
Vec2d(0.0, 8.228112001309862) Vec2d(0.0, 12.873061631502637)
Vec2d(0.0, 8.228112001309862) Vec2d(0.0, 13.440656358065137)
关于python - 在碰撞中将能量从一个对象转移到另一个对象(在pymunk/chipmunk中),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45803079/
我需要将文本放在 中在一个 Div 中,在另一个 Div 中,在另一个 Div 中。所以这是它的样子: #document Change PIN
奇怪的事情发生了。 我有一个基本的 html 代码。 html,头部, body 。(因为我收到了一些反对票,这里是完整的代码) 这是我的CSS: html { backgroun
我正在尝试将 Assets 中的一组图像加载到 UICollectionview 中存在的 ImageView 中,但每当我运行应用程序时它都会显示错误。而且也没有显示图像。 我在ViewDidLoa
我需要根据带参数的 perl 脚本的输出更改一些环境变量。在 tcsh 中,我可以使用别名命令来评估 perl 脚本的输出。 tcsh: alias setsdk 'eval `/localhome/
我使用 Windows 身份验证创建了一个新的 Blazor(服务器端)应用程序,并使用 IIS Express 运行它。它将显示一条消息“Hello Domain\User!”来自右上方的以下 Ra
这是我的方法 void login(Event event);我想知道 Kotlin 中应该如何 最佳答案 在 Kotlin 中通配符运算符是 * 。它指示编译器它是未知的,但一旦知道,就不会有其他类
看下面的代码 for story in book if story.title.length < 140 - var story
我正在尝试用 C 语言学习字符串处理。我写了一个程序,它存储了一些音乐轨道,并帮助用户检查他/她想到的歌曲是否存在于存储的轨道中。这是通过要求用户输入一串字符来完成的。然后程序使用 strstr()
我正在学习 sscanf 并遇到如下格式字符串: sscanf("%[^:]:%[^*=]%*[*=]%n",a,b,&c); 我理解 %[^:] 部分意味着扫描直到遇到 ':' 并将其分配给 a。:
def char_check(x,y): if (str(x) in y or x.find(y) > -1) or (str(y) in x or y.find(x) > -1):
我有一种情况,我想将文本文件中的现有行包含到一个新 block 中。 line 1 line 2 line in block line 3 line 4 应该变成 line 1 line 2 line
我有一个新项目,我正在尝试设置 Django 调试工具栏。首先,我尝试了快速设置,它只涉及将 'debug_toolbar' 添加到我的已安装应用程序列表中。有了这个,当我转到我的根 URL 时,调试
在 Matlab 中,如果我有一个函数 f,例如签名是 f(a,b,c),我可以创建一个只有一个变量 b 的函数,它将使用固定的 a=a1 和 c=c1 调用 f: g = @(b) f(a1, b,
我不明白为什么 ForEach 中的元素之间有多余的垂直间距在 VStack 里面在 ScrollView 里面使用 GeometryReader 时渲染自定义水平分隔线。 Scrol
我想知道,是否有关于何时使用 session 和 cookie 的指南或最佳实践? 什么应该和什么不应该存储在其中?谢谢! 最佳答案 这些文档很好地了解了 session cookie 的安全问题以及
我在 scipy/numpy 中有一个 Nx3 矩阵,我想用它制作一个 3 维条形图,其中 X 轴和 Y 轴由矩阵的第一列和第二列的值、高度确定每个条形的 是矩阵中的第三列,条形的数量由 N 确定。
假设我用两种不同的方式初始化信号量 sem_init(&randomsem,0,1) sem_init(&randomsem,0,0) 现在, sem_wait(&randomsem) 在这两种情况下
我怀疑该值如何存储在“WORD”中,因为 PStr 包含实际输出。? 既然Pstr中存储的是小写到大写的字母,那么在printf中如何将其给出为“WORD”。有人可以吗?解释一下? #include
我有一个 3x3 数组: var my_array = [[0,1,2], [3,4,5], [6,7,8]]; 并想获得它的第一个 2
我意识到您可以使用如下方式轻松检查焦点: var hasFocus = true; $(window).blur(function(){ hasFocus = false; }); $(win
我是一名优秀的程序员,十分优秀!