Questions tagged «physics»

与物体在空间和时间上的运动有关。包括诸如加速度(推力和重力),质量,碰撞响应,摩擦等概念。

3
我可以从A跳到B吗?
我正在为侧滑车制作一些基本的AI,并且我需要知道AI单元是否可以仅通过跳跃就可以从A点到达B点。 我的角色的飞行轨迹有点用处不大,因为他们可以在空中施加力量(例如在Jazz Jackrabbit 2中),因此与经典弹丸的轨迹不同: 投掷或发射的弹丸将采取(...)没有推进力的路径。 ……我想我的问题更多是关于带有推进力的弹丸(例如火箭)。 为了说明这一点,这是我跳并不断按下“左键”时飞行曲线的样子(在左端看起来有所不同,这是我在空中进行一些操作的地方): 飞行期间施加的力始终平行于X轴,因此,如果我按住“左”,则为F =(-f,0);如果我按住“右” ,则为F =(f,0)。 他的动作非常像跳台滑雪者: 因此,它与经典的抛物线轨迹有很大不同(来源:Wikipedia): 更困难的是,我正在模拟简单的空气阻力,因此我的角色只能加速到某个最大速度值。 这是通过在相反的方向施加较小的力来完成的: b2Vec2 vel = body->GetLinearVelocity(); float speed = vel.Normalize(); //normalizes vector and returns length body->ApplyForce( AIR_RESISTANCE_MULT * speed * speed * -vel, body->GetWorldCenter() ); AIR_RESISTANCE_MULT是一个常数,在我的情况下等于0.1。 假设我的角色是一个非常小的点。 而且我没有考虑障碍,所以我的问题是这样的... 在给定初始速度V的情况下,如何确定(至少可靠地猜测)我在跳跃时应用于角色的脉冲J =(0,-j),重力G =(0,g),力F =(+ -f ,0)如果我们真的决定考虑空气阻力 (这是可选的) ,那么在飞行和AIR_RESISTANCE_MULT期间会持续应用(这是可选的),是否某个点位于我的角色将采用的路径绘制的曲线下方? 我实际上不知道从哪里开始计算,实际上,我不一定对确切的答案感兴趣。良好的破解/逼真度将非常棒,因为AI绝对不需要完美运行。 …

1
一个简单的飞行模拟器
在具有逼真的深红色水平的3D飞行模拟器中(例如,在街机水平而不是现实水平),您如何确定每个游戏时钟滴答声中飞机的运动? (深红色的天空是一个类似街机的飞行模拟器:http: //youtu.be/OWmYt0LZDnU?t=3m) 我假定游戏以固定的步伐前进,每一步中,每个移动的对象以恒定的速度从当前位置一直移动到下一位置。 您需要什么基本参数来确定质量,速度,油门等。另外,您将如何结合它们?

1
多人平台游戏-服务器上的单个客户端通常是否需要服务器更正?
我目前正在开发一个相当简单的多人平台游戏。我阅读了很多有关隐藏延迟的技术的文章,但是仍然无法理解某些概念。我觉得这个话题非常有趣,喜欢自己尝试一些想法,但我认为询问gamedev stackexchange对于我的问题会更有效。我将尽力描述我的当前状况以及在此过程中出现了什么问题。 现在,我只想让一个播放器与服务器同步。从理论上讲,我假设一个具有客户端预测功能的玩家不需要服务器修正,因为没有外部因素会影响他的动作。因此,我的原型目前只有一个播放器与服务器同步,而没有发送服务器更正。 如果您熟悉游戏网络,我认为您可能会跳过上下文部分,尽管在此过程中我也可能做错了什么。 客户端循环(每帧一次,每〜16.67ms一次) 简化的客户端循环如下所示: 检查本地输入(WASD)并将其打包为操作(例如Type=MoveLeft, Time=132.0902, ID=15)。我们保留打包的操作,以便最终在以后发送它们。此外,我们将所需的动作直接应用于游戏的本地物理模拟。例如,如果我们有一个MoveLeft动作,我们会向玩家的速度向左施加一个力。 检查发送动作。为了防止滥用客户端的带宽,请仅按特定间隔(例如30ms)发送打包的操作。 应用服务器修改。在某个时候,这将处理服务器接收到的增量和更正,并将其应用于游戏的本地模拟。对于此特定问题,不使用。 更新本地物理。在主播放器上运行物理循环。基本上,这是客户端对玩家运动的预测。这会增加玩家的速度引力,将玩家的速度应用到他的位置,修复沿途的碰撞等。我应该指定物理模拟始终以固定的增量秒执行(根据实际增量秒多次调用) 。 我跳过了有关物理学和其他部分的一些特定详细信息,因为我认为这些不是问题所必需的,但是请随时让我知道它们是否与问题相关。 服务器循环(每15ms) 简化的服务器循环如下所示: 处理动作。检查从客户端收到的操作包,并将其应用于服务器物理仿真。例如,我们可以收到5个MoveLeft动作,然后将力施加到速度5次。重要的是要注意,整个动作包是在一个“框架”上执行的,与客户端在动作发生后立即应用它相反。 更新游戏逻辑。我们会更新游戏物理性,移动玩家并修复碰撞等。我们还会打包以后碰巧发送给玩家的所有重要事件(例如,玩家的健康状况下降,玩家死亡等)。 发送更正。如果他们最近改变了,我们会定期(例如,每35毫秒发送一次)将差值发送给其他玩家(例如,玩家的位置,健康状况等)。该部分目前尚未实现,因为我希望单个播放器的模拟在客户端和服务器上给出相同的结果而无需更正,以确保客户端的预测工作正常。 问题 当前的系统在简单的情况下仍然可以正常工作,而令我惊讶的是它在简单的水平移动下给出了非常相似的结果(我相信,这种误差是由于浮点精度误差引起的): 请忽略原型图形。白色矩形=播放器,红色矩形=障碍物,蓝色=背景 但是,在进行时间敏感的动作(例如跳跃和移动到孤立的障碍物附近)之后,出现同步错误: 从理论上讲,我希望两者总是能得到相同的结果,因为没有任何外部因素影响客户的立场。不过,在实践中,我认为我理解问题所在。 由于围绕这样的障碍物跳跃非常取决于玩家的时机,因此将速度应用于位置时的微小变化将对结果产生影响(例如,客户可以及时移开以避免与障碍物,而服务器会在稍后接收到整个动作包时执行该操作,并停留在障碍物上一小段时间,从而更改最终结果)。客户端和服务器处理方式之间的区别主要在于,客户端在发生所有操作时都会执行所有操作,而服务器在接收到它们时会批量执行所有操作。 问题 如此长的语境最终引发了我的问题(感谢您阅读到目前为止):即使只有一个播放器与服务器同步,要求服务器更正是否正常,还是应该在某些对时间敏感的情况下使用某些技术来避免不同步? ? 我已经想到了某些可能的解决方案,其中一些我不太满意: 实施服务器校正。只需假设这是正常行为并纠正错误即可。无论如何,我都想实现它,但是我只是想确保到目前为止所做的事情是可以接受的。 使用提供的客户端时间来应用所需的操作。我想这与滞后补偿类似,需要“及时返回”并检查运动。有点像应用服务器更正,回到过去,然后重新应用下一个操作。我真的不喜欢这个主意。它看起来很复杂,资源昂贵,并且需要信任客户的给定时间(尽管我确实打算真正检查时间是否相对合法)。 向GameDevelopment StackExchange提出一个很棒的新想法,它将解决我的所有问题。 我才刚刚进入游戏网络世界,所以请随时纠正/批评/侮辱上述任何概念,或者提供一些想法/资源,这些资源可以帮助我在“网络奇妙世界”中发展。如果可以在其他地方找到答案,请原谅我,但我失败了。 非常感谢您的宝贵时间。

1
如何模拟box2d中的羽毛掉落?
我正在使用具有Box2d扩展名的AndEngine,但是一般的回答或概念性想法也将受到赞赏。 我希望在2D侧视图世界中有类似羽毛的对象,因此希望成为物理模拟的一部分。我正在使用线性阻尼使“羽毛”缓慢下降。这可能不是一个好主意,也许我应该在每次更新中都施加一些力,但是尽管如此,它仍然有效,并且使对象看起来“轻盈”,并且感觉好像空气中有阻力。 现在如何使物体看起来像羽毛一样从空中掉下来? 具体来说,我正在寻找两种类型的物体:低密度的长物体,应以缓慢的摆动向下移动,以及会随机改变轨迹的方形物体。如果这可以是一种模拟,并且长度可以作为参数,那就太好了-对象越长,摆动就越大。现在,我想在卡通世界中模拟羽毛,树叶和雪花。
10 box2d  physics 

1
获取2D“像素”云跟随鼠标
我正在开发一个2D游戏,试图获得由数百个微小的立方体或光盘组成的“云”,以跟随我的鼠标光标而彼此不重叠。 但是,随着光盘数量的增加,使用物理引擎会导致性能变慢,并且碰撞检测通常比较困难。 有没有一种简便的方法可以针对这种情况优化引擎?如果没有,那么我会关闭引擎并编写自己的东西会更好吗?(在这里抓着稻草,但是:)是否有很好的资源或示例说明如何做到这一点?
10 2d  physics  unity 

1
根据前轮方向和速度计算自行车方向
我有一个简单的自上而下的自行车游戏,我正在尝试增加转向功能。我想知道如何使用前轮的方向来确定自行车的方向和速度。 void Update () { //Get input from user Vertical: 0 to 1, Horizontal -1 to 1 float forwardInput = Input.GetAxis("Vertical"); float sidewaysInput = Input.GetAxis("Horizontal") * m_steeringAmount; // Turn front wheel m_frontWheelTransform.localEulerAngles = new Vector3(0, sidewaysInput, 90); // get speed and drag float speed = m_velocity.magnitude; Vector3 forwardDrag = -m_forwardDragConstant …
10 physics  car 

3
惯性张量的计算
我承认,这是一个复杂而冗长的问题,我还不太了解,所以我将尽力解释。 简短版:是否有通用的c ++ / physx公式可根据对象形状计算惯性张量? 长版: 对于我们的物理学,我们需要指定x,y和z惯性张量。当前,我们的方法几乎只是基于质量的比率。因此,如果一个对象在X轴上较长,而在Y和Z上较薄,并且质量为10000,则将Z和Y设置为7000,将X设置为3000。(这不确切,只是给出一个想法) 这比较好用,但是我们最大的问题是当某处存在关节不稳定性时,我们必须不断猜测张量,直到找出最合适的。如果我们进行非常大的物理模拟,而20个以上的关节中有一个关节使所有其他关节失去稳定性,则这将变得非常耗时。 我正在研究的是一个函数,它将采用对象的边界框并希望计算出相对准确的张量。我已经从http://en.wikipedia.org/wiki/List_of_moment_of_inertia_tensors进行了一些数学运算,并制作了一个函数,该函数基本上可以像下面的类似旋转一样工作。 或者,如果旋转结束,则如下所示: 因此,这似乎给了我类似于我们一直使用的方式的结果,但是我不想切换到这种方式而不确保它能正常使用。以下是基于具有立方体和中心枢轴的第一个图像的我的函数的代码。 NxVec3 CalculateInertiaTensor( VisBoundingBox_cl boundingBox, float m ) { float width = boundingBox.GetSizeX(); float height = boundingBox.GetSizeZ(); float depth = boundingBox.GetSizeY(); float xTensor = 0.083f * m*(height*height + depth*depth); float yTensor = 0.083f * m*(width*width + depth*depth); float zTensor = …

1
从深度图创建“磁性变形器”的最佳过滤器是什么?
在我的项目中,我正在创建一个用于变形高度详细的网格(衣服)以使其“适合”凸形网格的系统。为此,我使用商品的深度图和“船体”来确定在世界空间的哪个点发生偏离和程度。 简单地将所有被遮挡的顶点转换为“船体”定义的深度是相当有效的,并且具有良好的性能,但是它存在无法保留网格特征的问题,并且需要进行大量剔除才能避免假阳性。 相反,我想从深度偏差图中生成一组简单的“变形器”,这些变形器将(向外)“变形”的网格的所有顶点向外(在世界空间中)推入。这样,可以保留网格的所有特征,并且不需要复杂的启发式方法即可剔除不适当的顶点。 我不确定如何生成此变形器集。我正在想像一种算法,尝试将球面与某个范围内的连续偏差的每个斑块进行匹配,但不知道从哪里开始。 谁能建议一个合适的滤波器或算法来生成变形器?还是换一种方式“压缩”深度图? (*推动,因为它适合凸的“凸起”类人动物,所以变换很可能是从表面的POV“球形”开始的。) 编辑:这是正确建议的图像/图表,它说明了我正在尝试实现的目标。 另外,我应该说,自从发布此问题以来,我在这个问题上做了很多工作,尽管我从未解决过如何获得变形器的问题,但我最终还是决定将深度图不适用于: 如果变形网格是不完整的,有可能获得被映射纹素的意思是对的凸网的另一边(因为它们没有被掩盖那些靠近摄影机放在正确的一边)。 效率不如我希望的那样高,因为每个变形都需要6个贴图。 并不是说这些不是无法解决的,而是另一种解决方案,它涉及在GPU上运行的内核中进行碰撞测试,从而可以得到更高质量的结果,并且虽然可能没有那么快,但结果却简单得多。 我仍然认为这个问题很有趣,并且会对任何答案都感兴趣,因为我确信在某些情况下它会是更可取的。

2
连续物理引擎的碰撞检测技术
我正在使用一个纯粹的连续物理引擎,因此我需要选择用于宽相和窄相碰撞检测的算法。“完全连续”表示我从不进行交叉测试,而是想找到方法在每次碰撞发生之前将其捕获,然后将其放入由TOI排序的“计划的碰撞”堆栈中。 宽相 我能想到的唯一连续的宽相方法是将每个物体围成一个圆圈,并测试每个圆圈是否会相互重叠。但是,这似乎效率极低,并且没有任何剔除。 我不知道对于今天的离散碰撞剔除方法(例如四叉树),可能存在什么连续的类似物。我应该如何防止不适当且毫无意义的广泛测试,例如分立引擎?我还希望能够看到超过1帧的碰撞。 狭窄阶段 我已经设法使狭窄的SAT适应连续检查而不是离散检查,但是我敢肯定,您可能遇到过的论文或网站中还有其他更好的算法。 您建议我使用哪种快速或准确的算法,每种算法的优点/缺点是什么? 最后说明: 我说的是技术而不是算法,因为我尚未决定如何存储可能是凹形,凸形,圆形甚至有孔的不同多边形。我计划根据算法的要求对此做出决定(例如,如果我选择将多边形分解为三角形或凸形的算法,我将以这种形式简单地存储多边形数据)。

1
变形表面
我正在尝试完成水平曲面的变形物理行为,但到目前为止,尚不知道如何从实现开始。 无论表面的形状(平面,立方体,球体……)如何,我都希望在游戏实体(玩家,敌人,物体……)的位置上有小凹痕。 解释起来有点复杂,所以我说明了我在说什么,这是一个带有球体的示例: 因此,这些表面应该能够使其自身稍微变形(看起来像是真正柔软的床或沙发)。我的曲面可能需要很高的顶点数才能获得平滑的变形,但是我的大问题是计算该变形的数学方法。 我正在用OpenGL用C / C ++进行编程,但是在正确方向上的任何建议都可以。


5
如何模拟碎玻璃?
我需要用扔石头通过玻璃窗进行模拟。我该怎么做? 我的意思是,我当时正在考虑在3D Studio Max 2012中制作石头和玻璃的3D模型,将玻璃破碎,然后将两者导出为.x模型。然后在XNA中制作动画-编写我自己的物理引擎。有可能吗?撞击后有可能破坏XNA中的玻璃吗?还是应该在3DS Max中这样做?“破坏玻璃”是指将一些以前破碎的玻璃钻头彼此断开,因为取决于石头的开始速度和重量以及玻璃的电阻(硬度?)(所有用户定义),这些钻头将与玻璃断开连接。彼此以不同的方式。
10 xna  physics  xna-4.0  3dsmax 


3
随机图生成-散布/聚类随机节点的策略
我正在太空中做一个简单的4X策略游戏,其中每个节点都是一个兴趣点(行星,小行星等)。 要随机生成地图,请按照以下步骤操作 确定地图每个节点的类型(例如,可能有5个类似地球的行星,10个贫瘠的行星等) 将每种类型的节点放置在地图上。 对于第2步,我希望每种节点类型的分布均匀。因此,例如,我将从放置所有类似地球的行星开始。如果我简单地做一个rand(map.width,map.height)来确定位置,我可能最终会把所有类地球的行星聚在一起,这将使从该区域开始的玩家受益。 是否有任何方法(例如使用不同的图形函数或噪声函数)可以生成彼此分散的(x,y)坐标序列。同样,有什么方法可以生成彼此接近的坐标?


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.