标签: physics

2D平台AABB碰撞问题

http://dl.dropbox.com/u/3724424/Programming/Gifs/game6.gif

我有AABB碰撞解决方案的问题.


我通过首先解析X轴然后解析Y轴来解析AABB交叉点.这样做是为了防止这个错误:http://i.stack.imgur.com/NLg4j.png


当对象进入播放器并且必须水平推动播放器时,当前方法工作​​正常.正如你在.gif中看到的那样,水平尖峰正确地推动了玩家.


但是,当垂直尖峰移动到播放器中时,X轴仍然首先被解析.这使得"使用尖钉作为升力"是不可能的.

当玩家进入垂直尖峰(受重力影响,落入其中)时,他被推到Y轴上,因为X轴上没有重叠开始.


我试过的东西是这个链接第一个答案中描述的方法.然而,尖峰和移动物体通过改变位置而不是速度来移动,并且在调用Update()方法之前我不计算它们的下一个预测位置.不用说这个解决方案也不起作用.:(


我需要以上述两种情况都按预期工作的方式解决AABB碰撞问题.

这是我目前的碰撞源代码:http://pastebin.com/MiCi3nA1

如果有人可以调查一下,我会非常感激,因为这个错误从一开始就一直存在于引擎中,我一直在努力找到一个好的解决方案,但没有任何成功.这让我花了很多时间看着碰撞代码并阻止我进入"有趣的部分"并编写游戏逻辑:(


我尝试实现与XNA AppHub平台演示中相同的碰撞系统(通过复制粘贴大部分内容).然而,"跳跃"错误发生在我的游戏中,而在AppHub演示中却没有.[跳跃的bug:http://i.stack.imgur.com/NLg4j.png ]

要跳转我检查播放器是否为"onGround",然后将-5添加到Velocity.Y.

由于玩家的Velocity.X高于Velocity.Y(参考图中的第四个面板),onGround在不应该的时候设置为true,因此让玩家在半空中跳跃.

我相信这不会发生在AppHub演示中,因为玩家的Velocity.X永远不会高于Velocity.Y,但我可能会弄错.

我先解决了这个问题,首先解析X轴,然后解决Y轴问题.但是,正如我上面所说的那样,它会加剧与尖钉的碰撞.

c# physics 2d collision-detection

6
推荐指数
1
解决办法
1589
查看次数

平台游戏的2D物理引擎 - 乘坐平台

发表于游戏开发:用于平台游戏的2D物理引擎 - 骑在平台上

我有很多关于在平台游戏中使用2D物理引擎的问题,但是我正在努力解决的一个主要问题.我设法将Physics2D.Net引擎集成到Scrolling Game Development Kit 2项目中.我对物理学的表现和现实感到非常满意.但是,我失去了一些东西,我原来的SGDK2物理引擎(更专门针对平台游戏)变得更容易:

  1. 现在骑在平台上非常困难.这是我的主要问题.实施起来并不困难,但很难发挥.假设我甚至设法让玩家进入一个平台(这本身就足够了),一旦平台移动,玩家就会掉线,因为玩家和平台之间没有足够的摩擦力.我是否只需要调整诸如摩擦,惯性,线性速度阻尼之类的东西,以便更容易在平台上骑行,或者在平台上骑行是否有根本困难的"真实"世界?我已经尝试减少施加在平台上的力,使其移动(这样可以让骑手有更多的时间来匹配平台的速度),但那时力不足以让骑手保持高空,平台下沉到地面.我只是用力来移动平台.
  2. 阻止平台旋转的最佳方法是什么?我已经尝试将每个框架上的角度动量和角度位置设置为0,但是这可能会导致很少的抽搐导致平台上的任何东西弹到空中,只要足够长的时间就会脱落.
  3. 沿着地面奔跑:大多数具有真实2D物理的平台游戏如何实现玩家?我的播放器目前是一个正方形,但由于摩擦撞击其中一个角落,它经常会翻滚并弹到空中.我的猜测是玩家应该是一个圆圈并且总是直立.这是标准做法,还是有另一种方式?如果我使用一个圆圈,我希望骑平台会更加困难!玩家将立即滚动.我正在考虑小大星球,它似乎也很好地让玩家保持在地面上.如果我想让它们保持接地,我是否只需要在播放器上放置很多速度阻尼,或类似的东西?
  4. 由于SGDK2是一个基于图块的引擎/ IDE,我编写的代码可以分析地形/图块的所有形状,并将它们转换为具有无限质量的物理体(水平合并它们,但不适当地垂直合并;合并两个方向也是如此)我很难弄清楚,因为我无法弄清楚如何在圆环状的地层中追踪和表示洞.对于平台游戏来说,这是一个很好的方式来实现精灵与之互动的东西来代表坚实的基础吗?我最好把每块瓷砖变成一个物理体(很少有简单的形状,很多物体和瓷砖之间的内部表面),或者像我一样合并它们(更少的物体,但更多的形状更复杂)?
  5. 我很难搞清楚要使用的最佳顶点细分级别和网格间距.据我所知,我真的不明白这些概念和Pysics2D.Net上的文档是稀疏到不存在的.我通常细分到大约6并使用大约相同的网格间距.我的精灵和瓷砖大多是32x32单位(像素),目前都是正方形.

c# physics 2d

6
推荐指数
0
解决办法
1482
查看次数

Android获得标准化加速

我希望获得Android手机的加速度矢量.问题是,加速度计坐标是相对于手机的旋转.我想要的是"绝对"加速度,即无论手机面对哪种方式,都应该返回相同的值.(我想检测一下滑雪的用户是否在不使用GPS的情况下滑下斜坡.我还需要能够区分滑行和上升的缆车.)

我可以通过将加速度计与陀螺仪相结合来获得这些值,但我不知道如何用陀螺仪来抵消加速度计的值.

这是可能的,如果是的话,怎么样?

android physics trigonometry accelerometer gyroscope

6
推荐指数
1
解决办法
6292
查看次数

将RGB转换为光频率

是否有可能从RGB表示中获得颜色的光频率?我找到了相反的过程[1],但我不知道这是否可能.

[1] http://www.fourmilab.ch/documents/specrend/

algorithm rgb physics colors frequency

6
推荐指数
2
解决办法
2万
查看次数

如何用Bullet物理逼真地模拟高尔夫球击球?(包括现场演示)

背景

我正在玩一个迷你高尔夫游戏,使用three.js和弹药物理库的ammo.js转换,但是我在让球实际移动方面遇到了一些麻烦.

(我在penguinspuzzle.appspot.com/minigolf.html上放了一个演示,如果你想看看它在实践中是如何工作的.)

什么是一个很好的算法,以提供迷你高尔夫球的更逼真的运动?

我试过的

在ammo.js中,有摩擦,线性阻尼和旋转阻尼选项.

当球滚动时,摩擦设置似乎没有太大影响.

我正在使用

body.setRestitution(0.8);
body.setFriction(1);
body.setDamping(0.2,0.1); // linear damping, rotational damping
Run Code Online (Sandbox Code Playgroud)

问题

由于线性阻尼值较高,球似乎减速得太快.

价值较低似乎需要很长时间才能最终停止.

当球在空中时,完全应用线性阻尼似乎是不合理的.

分析

我认为问题可能是ammo.js中的线性阻尼导致指数减慢.

我试过了:

  1. 录制高尔夫击球的视频
  2. 测量每个框架中球的位置
  3. 根据时间绘制球的位置和速度

结果如下所示.在我看来,速度曲线更接近于线性而非指数.

有什么建议让算法让ammo.js更加真实吗?

高尔夫分析

javascript algorithm physics bulletphysics ammo.js

6
推荐指数
1
解决办法
2061
查看次数

试图模拟一维波

我正在尝试使用一系列谐波振荡器对一维波进行简化模拟.根据教科书的说法x[i],第i个振荡器位置的微分方程(假设均衡x[i]=0)证明了这个:

m*x[i]''=-k(2*x[i]-x[i-1]-x[i+1])

(导数是时间)所以我试图用以下算法数值计算动力学.这osc[i]是第i个振荡器作为具有属性loc(绝对位置),vel(速度),acc(加速度)和bloc(平衡位置)的对象,dt是时间增量:

for every i:
    osc[i].vel+=dt*osc[i].acc;
    osc[i].loc+=dt*osc[i].vel;
    osc[i].vel*=0.99;    
    osc[i].acc=-k*2*(osc[i].loc-osc[i].bloc);

    if(i!=0){
      osc[i].acc+=+k*(osc[i-1].loc-osc[i-1].bloc);
    }
    if(i!=N-1){
      osc[i].acc+=+k*(osc[i+1].loc-osc[i+1].bloc);
    }
Run Code Online (Sandbox Code Playgroud)

您可以在此处查看算法,只需单击即可向第6个振荡器发出脉冲.你可以看到它不仅不会产生波浪,而且还会产生一个总能量增加的运动(即使我加了阻尼!).我究竟做错了什么?

algorithm physics numerical-methods

6
推荐指数
1
解决办法
553
查看次数

求解微分方程时的高频噪声

我试图根据菲克第二定律模拟一个简单的扩散.

from pylab import *
import numpy as np
gridpoints = 128

def profile(x):
    range = 2.
    straggle = .1576
    dose = 1 
    return dose/(sqrt(2*pi)*straggle)*exp(-(x-range)**2/2/straggle**2)

x = linspace(0,4,gridpoints)
nx = profile(x)
dx = x[1] - x[0] # use np.diff(x) if x is not uniform
dxdx = dx**2

figure(figsize=(12,8))

plot(x,nx)
timestep = 0.5
steps = 21
diffusion_coefficient = 0.002
for i in range(steps):
    coefficients = [-1.785714e-3, 2.539683e-2, -0.2e0, 1.6e0,
                    -2.847222e0,
                    1.6e0, -0.2e0, 2.539683e-2, -1.785714e-3]
    ccf = (np.convolve(nx, coefficients) / …
Run Code Online (Sandbox Code Playgroud)

python physics numpy scientific-computing differential-equations

6
推荐指数
1
解决办法
364
查看次数

使两个物理对象不会发生碰撞,但会检测Unity中的碰撞

我有一个Unity项目,其中有一个由静态对撞机组成的2D游戏世界,可以使几何体与居住它的角色保持一致.该玩家是一个动态对撞机(具有非运动刚体).还有一个敌人角色,也是一个动态对撞机.两个角色都走过地板,像我期望的那样碰到墙壁.

我想要达到的目标是玩家和敌人彼此之间并不牢固,所以他们可以互相移动.我通过将敌人和玩家放在不同的图层上并设置碰撞矩阵来实现这一点,这样这些图层就不会相互碰撞.然而,我现在遇到的问题是我确实想要检测敌人和玩家是否碰到了对方.我为敌人角色添加了一个触发器对撞机,它位于敌人层,这意味着它不会检测到与玩家的碰撞.

我想为敌人制作一个子游戏对象,把它放在玩家的层上,添加一个刚体并触发对撞机并使用它来检测玩家和敌人之间的碰撞,但感觉如此令人费解以至于让我感到疑惑如果没有更优雅的解决方案.

physics 2d unity-game-engine

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

给定任意凸面二维多边形,计算惯性矩

我已经研究了这个问题了几个小时,由于某种原因,我一直无法找到解决方案。

给定一个凸多边形,该多边形定义为围绕多边形质心按顺时针顺序排列的点数组,如何计算多边形的惯性矩?

我已经能够找到各种形状的方程,例如矩形或圆形,但是找不到任意的凸多边形。

例如,以质量m,高度h和宽度w绕其质心旋转的矩形的惯性矩计算如下:

矩形的惯性矩

我正在寻找类似的公式/算法,但要寻找凸多边形。

physics game-physics

6
推荐指数
2
解决办法
898
查看次数

Unity3d台球/泳池瞄准问题

我正在尝试计算撞到撞球的角度并预测去向何方。我以为目标球应该在法线方向上移动。但是它的方向却完全不同。

RaycastHit2D hit = Physics2D.CircleCast(cue.position, _radius, dir, 100f, ~(ignoreLayer));
if (hit.collider != null)
{
    Debug.DrawRay(hit.collider.transform.position, -1f * hit.normal, 
    Color.green, Time.fixedDeltaTime);
}
Run Code Online (Sandbox Code Playgroud)

结果如下:

在此处输入图片说明

设定速度

rb.velocity = dir * force;
Run Code Online (Sandbox Code Playgroud)

结果:

在此处输入图片说明

如何找到确切的移动方向,谢谢

编辑:

我已经尝试过双半径铸造仅在一半时有效..仅当射线在内圆内时

physics billiards unity-game-engine game-physics raycasting

6
推荐指数
1
解决办法
295
查看次数