标签: physics

将凹多边形分解为凸多边形

我正在使用一个只支持凸多边形形状的游戏物理库(Box2D).但是,我希望关卡生成器能够指定凹多边形而不必担心.

那么,我怎样才能自动将凹多边形分解为凸多边形(甚至是所有三角形).速度会很酷,但实施的简便性更为重要.分手只会在游戏初始化时完成.

(我的语言是Flash/ActionScript 3,但这不重要)

physics polygon actionscript-3 box2d

10
推荐指数
2
解决办法
9060
查看次数

找到不规则(非凸)形状的稳定放置

给定一个二维不规则(非凸)形状的图像,我怎样才能计算出它在平面上稳定的所有方式?例如,如果形状是一个完美的方形矩形,那么它肯定有4种稳定方式.另一方面,圆圈没有稳定的方向,或者每个点都是稳定的方向.

编辑:有一个很好的小游戏叫做Splitter(小心,上瘾的游戏)似乎接近我想要的.注意到你砍掉了一块木头,它会掉到地上并以稳定的方式放置.

编辑:最后,我采用的方法是计算质心(形状)并计算凸包(使用OpenCV),然后遍历每对顶点.如果质心落在由2个顶点形成的线的顶部,则认为是稳定的,否则,不是.

algorithm physics

10
推荐指数
1
解决办法
1958
查看次数

Python的波浪模拟

我想在三维空间中模拟一些具有吸收和反射的传播波.我想用python做.我应该使用numpy吗?我应该使用一些特殊的库吗?

我该如何模拟波浪?我可以使用波动方程吗?但是,如果我有反思怎么办?有更好的方法吗?我应该用矢量吗?但是当光线发散时,强度会降低.难.

提前致谢.

python simulation physics numpy wave

10
推荐指数
1
解决办法
1万
查看次数

是否有一个JavaScript物理库可以使用div等HTML元素而不是画布?

玩家堆栈

我正在为游戏制作一个简单的堆栈,玩家可以移动编号的棋子,以跟踪他们与完成收集胜利手段的距离.

目前我使用jQuery UI的可拖动和可拖放.它很适合轻松启动,但一次只能移动一件:http://cssdeck.com/labs/cowmmudd/4.

  • 我想将移动的部件外包给一个真正的JavaScript物理库,而不是使用jQuery UI.(因此当一个人一直移动上排的蓝色4时,它会强制该行上的所有棋子.)
  • 我想继续使用普通的HTML元素来表示我的作品,因为它们更容易风格和推理.(我已经看过所有的Javascript物理库,canvas但是我想要像谷歌那样实现相同的目标:http://mrdoob.com/projects/chromeexperiments/google-gravity/)

有人可以使用他们所知道的最好的JavaScript物理库提供控制普通,非画布HTML元素的放置和碰撞的简约示例吗?

javascript html5 physics game-physics

10
推荐指数
1
解决办法
1961
查看次数

将可调整大小的圆圈放在彼此附近

我正在进行这个基于浏览器的实验,我给出了N个特定的圆圈(假设它们中有一个独特的图片),需要将它们放在一起,尽可能留下它们之间的空间.它不必排成一个圆圈,但它们应该"聚集"在一起.

圆圈尺寸可自定义,用户可以通过拖动javascript滑块更改尺寸,更改某些圆圈的尺寸(例如,在滑块的10%中,圆圈4的半径为20px,圆圈为2 10px,圆圈5保持不变等...).正如您可能已经猜到的那样,我将尝试在移动滑块时平滑地"转换"调整大小 - 重新定位.

到目前为止我尝试过的方法:不是手动尝试定位它们,而是尝试使用物理引擎 -

我的方法示例

想法:

  1. 在屏幕中央放置一些引力
  2. 使用物理引擎来处理球碰撞
  3. 在"拖动时间"滑块事件期间,我只需设置不同的球尺寸,让发动机负责其余部分

对于这个任务,我使用了"box2Dweb".我把一个引力拉到了屏幕的中心,然而,它花了很长时间才将球放在中心并且它们漂浮在周围.然后我在中间放了一小块静态球,这样他们就可以击中它然后停下来.它看起来像这样:

box2d审判

结果有点好,但是圈子在静止之前仍然移动了一段时间.即使在玩了诸如球摩擦和不同的引力之类的变量之后,整个事物只是漂浮在周围并且感觉非常"摇摆不定",而我希望球只在我拖动时间滑块(当它们改变尺寸时)移动.另外,box2d不允许更改对象的大小,我将不得不破解我的方法来解决方法.

因此,box2d方法让我意识到,留下一个物理引擎来处理这个问题并不是最好的解决方案.或许我必须包括一些我没有想到的其他力量.我在StackOverflow上发现了类似的问题.然而,非常重要的区别在于它只是"同时"生成一些非特定的圆圈,并且不允许额外的特定球尺寸和位置操纵.

我现在真的被困住了,有没有人有任何想法如何处理这个问题?

更新:已经差不多一年了,我完全忘了这个帖子.我最终做的是坚持物理模型并在几乎空闲的条件下重置力/停止.结果可以在http://stateofwealth.net/看到 你看到的三角形在这些圆圈内.其余的行通过"delaunay三角剖分算法"连接

javascript physics positioning box2d

10
推荐指数
2
解决办法
1587
查看次数

如何修复碰撞响应中的圆和矩形重叠?

由于在数字世界中几乎不会发生真正的碰撞,因此我们总会遇到"碰撞"圆与矩形重叠的情况.

如何在不与重叠的矩形完美碰撞的情况下放回圆圈?

假设矩形停止(零速度)并且轴对齐.

我会用后验方法(二维)解决这个问题.

总之,我必须解决t的这个等式:

在此输入图像描述

哪里:

  • Ť 是一个回答问题的数字:碰撞发生了多少帧之前?

  • [R 是圆的半径.

  • (x,y) 是圆的中心

  • (vx,vy) 是它的速度.

  • 在)B(t)的 是返回圆和矩形碰撞的点的x和y坐标的函数(当圆圈处于时 (x  -  t*vx,y  -  t*vy) 位置,即处于与矩形完美碰撞的位置).

最近我解决了圆圈之间碰撞的类似问题,但现在我不知道函数A和B的定律.

java physics collision-detection collision game-physics

10
推荐指数
1
解决办法
1万
查看次数

SpriteKit - 设置比例和物理

在场景中"缩小"的正确方法是什么?

我有一个对象,我施加冲动在屏幕上触发它.例如,它将在大约100 px的范围内射击.这可以按预期工作 - 增加飞行的力量,增加飞行的密度等.

我的问题是缩放,我知道缩小场景的唯一方法是setScale,并按预期缩小我的所有节点.

但是,然后飞行相同数量的物体(刚刚缩小)而不是飞行距离的两倍以上.

当我在比例之前和之后记录对象的质量/密度等时,它们是相同的,如预期的那样.

那么为什么它的飞行量不一样呢?尝试改变冲动以匹配比例,但它不起作用,是的它飞行距离较少 - 但它不是一个与缩放的一个.

棘手的问题......

谢谢你的想法.

physics sprite-kit

10
推荐指数
2
解决办法
8199
查看次数

在Yampa模拟弹簧/阻尼系统

我正在尝试使用Yampa进行一些基本的系统仿真,就像我在Simulink中所做的那样.在这种情况下,我想模拟这个simulink教程介绍的弹簧和阻尼系统.我写了以下信号函数来代表系统:

system = time >>> force >>> displacement

force = constant (m * g)

displacement = feedback (-) (velocity >>> integral) (gain $ k / m) 0
velocity     = feedback (-) integral                (gain $ c / m) 0
Run Code Online (Sandbox Code Playgroud)

feedback函数创建一个基本的反馈回路,并像这样实现的:

feedback op a b b0 = loopPre b0 inner
    where inner = arr (uncurry op) >>> a >>> (identity &&& b)
Run Code Online (Sandbox Code Playgroud)

哦,并且:

gain x = arr (*x)
Run Code Online (Sandbox Code Playgroud)

有了明显的正常数,我得到了一个非常不稳定的系统:

位移/时间图

在我构建反馈循环或应用集成的方式中是否存在明显错误?

haskell physics frp yampa

10
推荐指数
1
解决办法
600
查看次数

如何将流体模拟集成到Rigid Body phisix引擎中?

1)有没有证据表明混合刚体phisix和流体(比如SPH)的模拟可以为现实世界提供建模?
2)这种混合的框架如何工作?

假设我们在一个箱子里面有一个woden秋千,里面有两种不同的液体(油和水)和一个柔软的身体球.开始条件如下: 在此输入图像描述

我们怎么能模拟这种情况呢?用什么工具?

我现在如何看待它(如果我错了请高高在上)

  1. 我们所有的身体和液体在州(*)
  2. 诸如Bullet之类的现代发动机支持软体和刚体 - 因此我们可以*在RB\SB phisix引擎中加载()并制作框架.
  3. 获取所有顶点并比较前一帧的位置.走出某种形式的矢量力场.
  4. *在流体发动机的tate()中表示我们的rb/sb,作为来自力场的脉冲的粒子
  5. load(*)使用RB和SB作为粒子,其密度对应于它们制作的材料,并且脉冲对应于先前计算的矢量场
  6. 在流体引擎中制作一个框架
  7. 更新关于粒子运动的rb/sb位置 - 获取新状态(**)

这至少在理论上可以近乎实时地用gpu上的当前流体3 +子弹3来计算......对于简单的情况......但是我想知道这使得系统不真实多少?

algorithm modeling physics bulletphysics fluid-dynamics

10
推荐指数
1
解决办法
848
查看次数

Sprite Kit停止Impulse

我想CGFloat在屏幕点击时每次增加一次.浮点数具有设定的最大值和最小值.我试图通过这个建议:StackOverflow

但是,这只会在触摸后增加CGFloat,或达到最大值.我想触摸期间增加CGFloat ,这意味着你触摸的时间越长,Jump/CGFloat越高.

问题可能在于冲动,在应用之后你无法改变它.这意味着,在'玩家'获得20的冲动,并且屏幕被更长时间触摸后,浮动可能会增加,但冲动不会.

如果查看我当前的代码,触摸屏幕时脉冲设置为最大值,但如果释放,则应删除该操作.但是,它不起作用,冲动不会停止.

我知道你可以在按下之后将身体的速度设置为一个值,如果按下已经结束速度回到0,那么它会停止它'跳',但是看起来并不是很平滑有冲动.

有人有解决方案吗?

struct Constants {

static let minimumJumpForce:CGFloat = 20.0
static let maximumJumpForce:CGFloat = 60.0
}

class GameScene: SKScene, SKPhysicsContactDelegate {

var force: CGFloat = 20.0

func longPressed(longPress: UIGestureRecognizer) {

    if (longPress.state == UIGestureRecognizerState.Began) {

        println("Began")

        self.pressed = true

        let HigherJump = SKAction.runBlock({Player.physicsBody?.applyImpulse(CGVectorMake(0, Constants.maximumJumpForce))})

        self.runAction(HigherJump , withKey:"HighJump")

    }else if (longPress.state == UIGestureRecognizerState.Ended) {

        println("Ended")

        self.pressed = false

        self.removeActionForKey("HighJump")

    }

}

override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) { …
Run Code Online (Sandbox Code Playgroud)

physics ios sprite-kit swift

10
推荐指数
1
解决办法
472
查看次数