标签: rigid-bodies

如何制作2D软体物理引擎?

Box2d 中刚体的定义是

一块物质非常强大,以至于块上任何两个物质之间的距离是完全恒定的.

这正是我不想要的,因为我想制作2D(最终可能是3D),弹性,可变形,易碎,甚至是粘稠的物体.

我希望离开这个社区的是资源,它教会我如何弯曲,破坏和互动对象.我不关心这些物体的分子或化学性质,当我试图寻找如何计算一块木头,金属,橡胶,粘性物质,液体,有机物质等时,我常常发现这一切.在施加力之后可能看起来像.

此外,我是一个非常直观的人,因此图表等对我来说非常有帮助.

================================================== ==============================

忽略这些问题,它们已经过时了,我只是为了上下文的目的而将它们保留在这里

这里有没有简单的2D软体物理引擎?
最好是免费还是开源?

如果不花费数年时间就可以自己创作吗?

3.我可以使用像bullet和box2d这样的现有引擎作为开始并简单地转换他们的代码,或者考虑到我1年的编程经验和子弹是3D,这会导致更多的问题吗?

4.最后,如果我要转换另一个库,那么它是最好的改变box2D已经是2d代码,Bullet已经是软代码,还是混合了两个源代码?


谢谢!

physics rigid-bodies game-physics

29
推荐指数
2
解决办法
8674
查看次数

如何让我的物理对象安定下来?

我正在使用BulletSharp,它是子弹库的C#发行版.我已经在一个据称有0.0f的恢复原状的物体中得到了一些弹跳.

我有一个动态气缸(不久将是一个网状物)落在两个静态气缸上.像这样:

起始物体位置

顶部的气缸通常会疯狂地弹跳,通常会弹到一边.

这是我用来设置场景的代码:

        //now figure out bulletsharp stuff...
        CollisionConfiguration collConfig = new DefaultCollisionConfiguration();
        Dispatcher collDispatch = new CollisionDispatcher(collConfig);

        BroadphaseInterface broadphase = new DbvtBroadphase();
        ConstraintSolver sol = new SequentialImpulseConstraintSolver();
        world = new DiscreteDynamicsWorld(collDispatch, broadphase, sol, collConfig);

        world.Gravity = new Vector3(0.0f, -10.0f, 0.0f);

        //log (moving object)
        MotionState still = new DefaultMotionState();
        CylinderShape shape = new CylinderShapeZ(0.5f, 1.0f, 1.0f);
        still.WorldTransform = Matrix.Translation(0.0f, 0.4f, 0.0f);
        RigidBodyConstructionInfo constructInfo = new RigidBodyConstructionInfo(1.0f, still, shape);
        logBody = new RigidBody(constructInfo);
        logBody.SetDamping(0.04f, 0.1f);
        world.AddRigidBody(logBody);

        //rollers (static objects)
        CylinderShape …
Run Code Online (Sandbox Code Playgroud)

c# bullet rigid-bodies bulletphysics

9
推荐指数
1
解决办法
1329
查看次数

将角速度积分为四元数旋转

我已经(有点盲目地)在物理刚体模拟中使用四元数进行旋转有一段时间了,但最近开始对四元数旋转通常是如何定义的以及我是如何定义的(基于游戏开发者的物理书)感到困惑。

在书中,您有一个角速度 angVel 和一个时间步长 dt 以及一个初始方向。

它的步骤如下

方向 += 0.5*方向*angVel * dt

其中四元数向量乘法是通过首先将向量 xyz 转换为四元数 xyz,0 来完成的

这是可行的,但在其他任何地方,程序都是创建一个四元数,它定义了时间积分 angVel,在 dt 上,然后在方向上乘以它。它本质上将 angVel*dt 转换为旋转(非常有意义),然后通过乘法将其应用于原始方向,如下所示,语法更好https://math.stackexchange.com/questions/39553/how-do- i-apply-an-angular-velocity-vector3-to-a-unit-quaternion-orientation

我的问题是上面的 0.5 * 四元数 * 矢量 * 标量在概念上什么,以及这个结果四元数添加到我的方向是什么,考虑到你通常乘法而不是加法来旋转。

rotation rigid-bodies quaternions

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

角动量传递方程

对于如何计算两个刚体之间角动量传递的相对容易实现的方程,有没有人有任何好的参考?

我一直在寻找这种事情,我没有找到任何特别易于理解的问题解释.

确切地说,问题是这样的; 两个刚体在无摩擦(井,近)表面上移动; 把它想象成空气曲棍球.两个刚体接触,然后移开.现在,在不考虑角动量的情况下,方程式相对简单; 问题变成了,身体之间的角动量传递会发生什么?

作为一个例子,假设两个物体没有任何角动量; 他们没有旋转.当它们以倾斜角度相互作用时(行程矢量不与它们的质心线对齐),显然它们的一定量的动量会转换成角动量(即它们各自得到一定量的旋转),但是如何很多,这样的等式是什么?

这可以通过使用多体刚性系统来计算,但我希望得到更加优化的计算,所以我可以实时计算这些东西.有没有人对方程式有任何想法,或指向包含在项目中的这些计算的开源实现?确切地说,我需要将其作为一个相当优化的计算,因为需要在模拟的单个"滴答"内模拟相互作用的数量.

编辑:好的,看起来没有关于这个主题的很多准确信息.而且我发现"程序员物理学"类型的书籍有点太......愚蠢到真正得到; 我不想要算法的代码实现; 我想弄清楚(或者至少已经勾勒出我的算法)算法.只有这样才能根据我的需要对其进行适当的优化.有没有人对这类话题有任何数学参考?

language-agnostic equation physics angular-momentum rigid-bodies

5
推荐指数
0
解决办法
1481
查看次数

如何计算多面体的质量和惯性矩?

为了在刚体模拟中使用,我想计算质量和惯性张量(惯性矩),给定一个三角形网格表示(不一定是凸起的)对象的边界,并假设内部的密度恒定.

math physics rigid-bodies

5
推荐指数
1
解决办法
4793
查看次数

刚体仿真摩擦力

我目前正在研究3D刚体仿真程序.我目前设法让刚体与地板碰撞并使用冲动正确弹跳.然而,我的问题是,一旦它们反弹,它们会不断加速,尽管使用摩擦矢量试图减慢它们.

当你到达地面时,这是代码

Rvector fDirection(m_Bodies[i].Vel.x,0.0,m_Bodies[i].Vel.z);
Rvector relativeVelocities = m_Bodies[i].Vel - floorVelocity;
fDirection.normalize();


Real impulse = -(1+e) * (Rvector::dotProduct(relativeVelocities,floorNormal)) 
/ (1/m_Bodies[i].mass + floorMass);
Rvector friction = fDirection*mu*gravity.length()*m_Bodies[i].mass;

Rvector collision_forces = Rvector(0,1,0)*impulse;
collision_forces += friction ;

m_Bodies[i].Vel += (collision_forces/m_Bodies[i].mass);
Run Code Online (Sandbox Code Playgroud)

谢谢

编辑:这是集成代码.

void RigidBodySimulation::eulerIntegration(float dTime)
{
    Rvector newVel;
    Rvector newPos;
    Rvector zero(0.0, 0.0, 0.0);
    Real one_over_mass;
    Rvector accel;
    for( unsigned int i = 0 ; i < m_Bodies.size(); i++)
    {   
        one_over_mass = 1/m_Bodies[i].mass;
        newVel = m_Bodies[i].Vel + m_Bodies[i].force*one_over_mass*dTime;
        newPos = m_Bodies[i].Pos + m_Bodies[i].Vel*dTime;
        accel …
Run Code Online (Sandbox Code Playgroud)

c++ 3d physics rigid-bodies

5
推荐指数
1
解决办法
2897
查看次数

统一。试图伪造内部船舶重力。旋转物体的刚体孩子不断滑动

我正在尝试模拟具有内部重力的船舶/空间站。

为了实现这一点,我将玩家和飞船的所有内容都设为飞船的子级。飞船本身有对撞机,但没有刚体组件。这个想法是随着船的移动,它的所有内容也会移动。到目前为止非常简单。

为了模拟飞船中的重力,玩家控制器和所有刚体都关闭了默认重力。代替标准,每一帧都沿着母船的负向上向量施加一个力。

这种工作,但有一个主要问题我必须在这件事稳固之前解决。所有刚体都非常缓慢地在船内部滑动。

我知道这可能是由于地板的更新位置加上重力导致某种剪切力。物体总是逆着船的旋转而滑动。

我已经尝试过将物理材料的所有物理属性拖到质量上等等。这些都没有奏效,而且我很确定这是由于地板在移动的基本事实,即使 RB是地板所属对象的子项。

任何人都有解决方案,而不是某种胶带?我可以尝试使一切都成为动态的,并且仅在发生某些外部碰撞或其他事情时才“唤醒”,但这可能会变得非常麻烦。我需要它以尽可能多的通用方式工作。

一些代码:

在船上

void Update () 
{
    transform.Rotate(new Vector3(Time.deltaTime * 0.125f,Time.deltaTime*0.5f,0));
}

void FixedUpdate()
{
Vector3 tempVec;

foreach(Rigidbody rb in rigidBodies)
    {
        //Gravity!!

        tempVec = transform.up * -9.81f * rb.mass * Time.deltaTime;         
        rb.AddForce(tempVec, ForceMode.Acceleration);
    }

}
Run Code Online (Sandbox Code Playgroud)

我还开发了一个版本,其中船跟随刚体的运动。我无法直接进行育儿,因此我必须简单地在每一帧手动设置变换以匹配物理代理。这仍然具有与上述相同的效果,尽管这可能是我最终想要移动船的方式,因为这将更恰当地与飞行机制联系起来。

c# physics rigid-bodies unity-game-engine

5
推荐指数
1
解决办法
1706
查看次数

如何防止RigidBody通过其他对撞机

我有一枚硬币RigidBody和带有撞机盒的墙壁。为了试用,我将以下代码应用于硬币。

private void OnMouseDown() 
{
    rigidbody.AddForce(30.0f, 0f, 5.0f, ForceMode.Impulse);
}
Run Code Online (Sandbox Code Playgroud)

但是,有时硬币会穿过墙壁,但是当我将速度从30点提高到50点时,硬币会在第一次点击时穿过墙壁。我搜索了很多东西,但除了DontGoThroughThings脚本对我不起作用或者我真的不知道如何使用它外,什么都没有。

我一直在硬币上添加连续的动态效果,在墙壁上添加连续的碰撞检测功能,但仍然无法正常工作。

rigid-bodies unity-game-engine game-physics unityscript

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

运动刚体自行移动

我的 2D Unity 游戏中有一个非常奇怪的问题,我能够将其简化为以下核心问题/最小再现测试用例。请按照以下步骤进行重现(Unity 5.1.1f1):

  • 在位置 创建一个玩家对象(立方体)(0,0,0)
  • 删除BoxCollider组件。
  • 附加以下C#脚本,Unity将自动添加所需的组件,从而使其成为刚体碰撞器。
  • 设置isKinematic标志。
  • 将另一个立方体添加到场景中的 location 处(2,0,0)
  • 删除BoxCollider组件并添加BoxCollider2D. 这使得这个立方体成为一个静态碰撞器。
  • 设置isTrigger标志。
  • 运行场景。

预期行为:
玩家立方体向另一个立方体加速,并在接触它后停止移动。

观察到的行为:
玩家立方体向另一个立方体加速,然后继续以恒定速度移动。

其他实现细节:
我最初通过平移所有对象的变换来移动它们,并且根本没有使用刚体,因为我不需要碰撞检测。现在我知道了,所以我想要刚体。我深入研究在线资源,发现我应该使用rigidbody.MovePosition()而不是transform.Translate()or transform.position。我修改了脚本,出现了上面的错误。
返回来transform.position修复问题,但这不是一个好的解决方案,因为它涉及不良实践,根据我读到的内容,会产生大量的 CPU 负载。

尝试解决失败:

  • 切换到Update()Time.deltaTime没有任何区别。
  • 我尝试不返回Update(),而是简单地将 重置timestep为设置0时。stop不用找了。
  • 摆弄检查器并执行诸如冻结刚体上的位置或将玩家对象设置为触发器之类的操作根本没有效果。在游戏运行时(碰撞后)更改 Rigidbody 组件上的任何内容都会使立方体立即停止。任何东西,甚至将其质量设置为 0。
  • 我也尝试设置velocity为0,结果没有变化。这确实有意义,因为Update()完全跳过了(Debug.Log()顺便说一句,我还用 a …

c# collision-detection rigid-bodies unity-game-engine

5
推荐指数
1
解决办法
4212
查看次数

向对象添加相对于其局部轴的速度

因此,我正在努力实现如何向 rb 对象添加相对于其旋转的速度。这是我的脚本:

 using System.Collections;
 using System.Collections.Generic;
 using UnityEngine;
 using Cinemachine;
 
 [RequireComponent(typeof(Rigidbody))]
 public class PlayerController : MonoBehaviour
 {
     private Rigidbody rb;
     public CinemachineFreeLook camFreeLook;
 
     public float speed = 5f;
     private float refVelocity;
     
     void Start()
     {
         rb = GetComponent<Rigidbody>();
         Cursor.visible = false;
     }
     
     void Update()
     {
         float xMovement = Input.GetAxis("Horizontal") * speed;
         float zMovement = Input.GetAxis("Vertical") * speed;
 
         if (Input.GetButton("Horizontal") || Input.GetButton("Vertical"))
         {
             rb.velocity = new Vector3(xMovement, rb.velocity.y, zMovement); // Here is the problem. It moves the player relative to the …
Run Code Online (Sandbox Code Playgroud)

c# rigid-bodies unity-game-engine

5
推荐指数
1
解决办法
2659
查看次数