Articles of 弹丸物理学

一个旋转的球的轨迹

在旋转时如何预先计算踢球的轨迹? 我正在应用纺纱使用简化的马格努斯效应每帧像这样,它的工作原理: acceleration += swerve × velocity 我的问题是:下面的计算物体轨迹的方程可以扩展到包括球旋转吗? position = start + 0.5*acceleration*time^2 + velocity*time; 我正在使用欧拉整合和球移动罚款。 我只想知道如何预测球的运动path。

SKSpriteNode和SKShapeNode之间的冲突

我试图创建一个对象之间的碰撞。 一个是SKSpriteNode,另一个是SKShapenode。 我迄今为止的联系方式是: func didBeginContact(contact:SKPhysicsContact){let firstBody:SKPhysicsBody = contact.bodyA let SecondBody:SKPhysicsBody = contact.bodyB if ((firstBody.categoryBitMask == PhysicsCatagory.Orange) && (SecondBody.categoryBitMask == PhysicsCatagory.Red)) || (firstBody.categoryBitMask == PhysicsCatagory.Red) && (SecondBody.categoryBitMask == PhysicsCatagory.Orange) { CollisionWithRed(firstBody.node as! SKSpriteNode, Red: SecondBody.node as! SKShapeNode) } } func CollisionWithRed (Orange: SKSpriteNode, Red:SKShapeNode){ Orange.removeAllChildren() Red.removeAllChildren() } 问题是在碰撞后,橙色和红色不会从屏幕上移除,他们仍然在那里。 橙色代码是: func SpawnOranges(){let Orange = SKSpriteNode(imageNamed:“Orange.png”)Orange.size = CGSize(width:80,height:80)let […]

计算轨迹给定持续时间,发射角度和距离的初始速度

我需要我的实体在给定时间内以给定的发射角度从点A到点B. 我已经能够在没有发射角度的限制的情况下计算出初始速度,但是我不知道如何将其纳入方程。 发射后,实体只受重力影响,A点和B点不一定在同一高度。 谢谢!

寻找具有交叉目标位置的固定角度的抛物线弧的初始速度

在我的游戏中,我希望骷髅偶尔在玩家身上挑骨头。 玩家可以在任何地方与骨架相关(在上面或下面,向左或向右),我希望骨骼扔出骨头,使其着陆在玩家身上(或者它的抛物线弧在上升时拦截它们,如果玩家在骨架之上)。 给定一个任意的起始位置,一个任意的目标点和一个任意的发射角度,我怎样才能计算弹道抛射体的初始速度(假设没有空气阻力),使其抛物线轨迹与目标点相交? 我知道在这个网站上有很多类似的问题,但是他们没有一个似乎有这样一套特殊的要求: 计算给定轨迹抛物线的初始速度需要已知/固定的顶点高度。 计算在抛物线弧中击中目标所需的速度,并将物体抛向预定位置? 假定一个已知/固定的旅行时间。 我想要有一个固定的发射角度,初始位置和最终位置,并从那些决定初始速度。 维基百科文章弹道的轨迹接近,但我不知道如何解决速度。 参考 在计算机坐标系中,Y轴从笛卡尔坐标反转。 公认的公式独立于此而操作,但处理起来并不直观。 这意味着重力将是一个正数,而在弹丸上方将导致负位移。 这也意味着你select的固定角度将是习惯性版本所暗示的消极性。 作为最后一点,我在计算Vy之前通过执行这个操作来调整Vx的绝对值: if sign(x_velocity) != sign(delta_vector.x): x_velocity = -1 * x_velocity var y_velocity = x_velocity * tan(angle) 完整的伪代码参考: static func get_velocity_of_arc_intercept(initial_position, target_position, angle): var delta_vector = target_position – initial_position var x_velocity = sqrt((gravity * delta_vector.x * delta_vector.x) / (2 * (delta_vector.y – […]

解决“子弹问题”

我有一个3Dmatrix填充“空白空间”,我把一些对象(对象被表示为一堆占用的空间)。 子弹从坐标(x1,y1,z1)以角度(verticalAngle,horizo​​ntalAngle)发射。 如何find子弹的轨迹线上的第一个坐标,而不是“空白”的市场? 我想我必须遍历该行中的所有坐标,直到find不是空的(或matrix的末尾)。 但是,我如何计算我必须经历的坐标? 当在二维空间发射子弹时,我想这将被计算为 y = cos(angle) * x + startPosition在这里我会增加x(在一个for循环中)得到y和check(x,y)单元格的对象或“空”。 实际上,我必须在for循环中增加y来获得x,以防轨迹线比x轴更接近y轴。 但有人可以帮助我在3D空间中做到这一点? 编辑:那么我发现这个公式: (x,y,z)=(x0,y0,z0)+t(a,b,c)其中(x0,y0,z0)是起点和(a,b,c )的方向因素,所以我想我可以在循环中增加t来获得坐标。

二维射线盒相交的技术是什么适用于旧的控制台硬件?

我正在做世嘉Genesis自制游戏(它有一个7mhz 68000 CPU)。 我正在寻找一种方法来查找粒子精灵和背景图块之间的交集。 粒子被表示为具有运动vector的点。 背景拼贴是8 x 8像素,(X,Y)位置始终位于8的倍数处。 所以,真的,我需要find一个射线盒碰撞的交点; 我需要找出沿着瓦片边缘的射线/粒子击中的地方。 我有这两个硬约束: 我正在处理像素位置(整数)。 浮点太昂贵了。 它不一定非常精确,只要足够接近。 乘法,分割,点积等等非常昂贵,应该避免。 所以我正在寻找一个适合这些约束的高效algorithm。 有任何想法吗? 我用C写它,所以这会工作,但汇编也应该是好的。

要使一辆汽车从坡道上跳下来需要速度

我需要让一辆车从一个坡道跳到另一个坡道,我需要使用AI来完成这个任务,所以我认为在坡道附近为我的车设定一个固定的速度就足以让它正确跳转。 如果我手动input速度,它会正常工作,但是我希望我的游戏计算它,因为斜坡将由用户的input生成。 不幸的是我的物理知识缺乏,所以我需要你的帮助。 下图总结了这个问题。 基本上,我需要计算的是在第一个斜坡的最高点,车辆必须具有的速度(以m / s为单位),因为所有的红色数据都是用户的input。 我对使用x=L, y=h-launchRampHeight的弹丸射程有一些粗略的想法,但是结果并不像我预期的那样,所以放弃了。 你有什么提示吗? 请注意,两个坡道长度相同(50米)。 编辑: 基于@mklingen这里是我正在使用的C#代码(其中Distance = L ) var speed = (Mathf.Sqrt(g)*Mathf.Sqrt(Distance)*Mathf.Sqrt((1/Mathf.Sin(Theta)))* Mathf.Sqrt((1/Mathf.Cos(Theta))))/Mathf.Sqrt(2); 发生了什么,虽然很奇怪。 例如,在theta = 19, L = 196, h = 46我的代码返回80.54646 ,如果我将它input到汽车中,这似乎可行。 然而,在WolframAlpha中运行expression式会导致55.8这是错误的。 看起来代码是正确的,但theta = 35, L = 261, h = 39我的代码返回NaN而WolframAlpha显示52.17跳转发生。 所以,总结一下,我有两种不同的情况,其中我的结果与WolframAlpha的不一样,没有一个是正确的。 这是怎么回事?

如何从距离和时间确定轨迹,没有初始速度?

我正在试图发展一个迫击炮,需要把它射向目标敌人。 射击将有一个预定的恒定飞行时间(2.5秒),并且在那之后敌人应该在那里(如果敌人的动作是恒定的)。 我正在努力弄清楚正确的方程,从预测位置的距离和所花费的时间(2.5秒)获得初始速度(以及所需的火焰角度)。

计算/预测一种方式

我只是从物理学开始,所以我并不总是知道自己在做什么。 这是一个2D项目,但我使用像SphereCollider等3D物理对象。 我拥有的: 漂浮在空间中并通过重力相互影响的物体: protected virtual IEnumerator OnTriggerStay(Collider other) { yield return new WaitForFixedUpdate(); if(other.attachedRigidbody) { Vector3 offsetVector = this.transform.position – other.transform.position; float distance = offsetVector.magnitude; float gravityForce = (other.rigidbody.mass * mass) / Mathf.Pow(distance, 2); // Clamp gravity. if(gravityForce > 1.0F) { gravityForce = 1.0F; } other.attachedRigidbody.constantForce.force = offsetVector.normalized * gravityForce; } } 有可控制的物体,玩家可以在该物体上点击并拖动一条线离开物体,以便在相反的方向上给它一个力(射击)。 我想实现的是: […]

子弹和射弹在基于组件的实体系统中

目前我为射手写的一款游戏引擎似乎正常工作。 目前射弹很稀less,行进速度很慢,并且在networking上同步,它们是作为实体产生的。 但是在将来,我将拥有能够产生大量快速发射物的武器。 所以在这里,我想知道如果生成一个专门的投射系统是一个更好的主意。 我目前想要生成射弹池来管理短寿命射弹的同步,而不限制射弹数量。 物理和碰撞由物理引擎管理,我可以在其中注册任何types的对象(服务器和客户端)。 有没有更好的方法来解决这个问题?