Box2d 中刚体的定义是
一块物质非常强大,以至于块上任何两个物质之间的距离是完全恒定的.
这正是我不想要的,因为我想制作2D(最终可能是3D),弹性,可变形,易碎,甚至是粘稠的物体.
我希望离开这个社区的是资源,它教会我如何弯曲,破坏和互动对象.我不关心这些物体的分子或化学性质,当我试图寻找如何计算一块木头,金属,橡胶,粘性物质,液体,有机物质等时,我常常发现这一切.在施加力之后可能看起来像.
此外,我是一个非常直观的人,因此图表等对我来说非常有帮助.
================================================== ==============================
忽略这些问题,它们已经过时了,我只是为了上下文的目的而将它们保留在这里
这里有没有简单的2D软体物理引擎?
最好是免费还是开源?
如果不花费数年时间就可以自己创作吗?
3.我可以使用像bullet和box2d这样的现有引擎作为开始并简单地转换他们的代码,或者考虑到我1年的编程经验和子弹是3D,这会导致更多的问题吗?
4.最后,如果我要转换另一个库,那么它是最好的改变box2D已经是2d代码,Bullet已经是软代码,还是混合了两个源代码?
谢谢!
我正在使用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) 我已经(有点盲目地)在物理刚体模拟中使用四元数进行旋转有一段时间了,但最近开始对四元数旋转通常是如何定义的以及我是如何定义的(基于游戏开发者的物理书)感到困惑。
在书中,您有一个角速度 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 * 四元数 * 矢量 * 标量在概念上是什么,以及将这个结果四元数添加到我的方向是什么,考虑到你通常乘法而不是加法来旋转。
对于如何计算两个刚体之间角动量传递的相对容易实现的方程,有没有人有任何好的参考?
我一直在寻找这种事情,我没有找到任何特别易于理解的问题解释.
确切地说,问题是这样的; 两个刚体在无摩擦(井,近)表面上移动; 把它想象成空气曲棍球.两个刚体接触,然后移开.现在,在不考虑角动量的情况下,方程式相对简单; 问题变成了,身体之间的角动量传递会发生什么?
作为一个例子,假设两个物体没有任何角动量; 他们没有旋转.当它们以倾斜角度相互作用时(行程矢量不与它们的质心线对齐),显然它们的一定量的动量会转换成角动量(即它们各自得到一定量的旋转),但是如何很多,这样的等式是什么?
这可以通过使用多体刚性系统来计算,但我希望得到更加优化的计算,所以我可以实时计算这些东西.有没有人对方程式有任何想法,或指向包含在项目中的这些计算的开源实现?确切地说,我需要将其作为一个相当优化的计算,因为需要在模拟的单个"滴答"内模拟相互作用的数量.
编辑:好的,看起来没有关于这个主题的很多准确信息.而且我发现"程序员物理学"类型的书籍有点太......愚蠢到真正得到; 我不想要算法的代码实现; 我想弄清楚(或者至少已经勾勒出我的算法)算法.只有这样才能根据我的需要对其进行适当的优化.有没有人对这类话题有任何数学参考?
language-agnostic equation physics angular-momentum rigid-bodies
为了在刚体模拟中使用,我想计算质量和惯性张量(惯性矩),给定一个三角形网格表示(不一定是凸起的)对象的边界,并假设内部的密度恒定.
我目前正在研究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) 我正在尝试模拟具有内部重力的船舶/空间站。
为了实现这一点,我将玩家和飞船的所有内容都设为飞船的子级。飞船本身有对撞机,但没有刚体组件。这个想法是随着船的移动,它的所有内容也会移动。到目前为止非常简单。
为了模拟飞船中的重力,玩家控制器和所有刚体都关闭了默认重力。代替标准,每一帧都沿着母船的负向上向量施加一个力。
这种工作,但有一个主要问题我必须在这件事稳固之前解决。所有刚体都非常缓慢地在船内部滑动。
我知道这可能是由于地板的更新位置加上重力导致某种剪切力。物体总是逆着船的旋转而滑动。
我已经尝试过将物理材料的所有物理属性拖到质量上等等。这些都没有奏效,而且我很确定这是由于地板在移动的基本事实,即使 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)
我还开发了一个版本,其中船跟随刚体的运动。我无法直接进行育儿,因此我必须简单地在每一帧手动设置变换以匹配物理代理。这仍然具有与上述相同的效果,尽管这可能是我最终想要移动船的方式,因为这将更恰当地与飞行机制联系起来。
我有一枚硬币RigidBody
和带有撞机盒的墙壁。为了试用,我将以下代码应用于硬币。
private void OnMouseDown()
{
rigidbody.AddForce(30.0f, 0f, 5.0f, ForceMode.Impulse);
}
Run Code Online (Sandbox Code Playgroud)
但是,有时硬币会穿过墙壁,但是当我将速度从30点提高到50点时,硬币会在第一次点击时穿过墙壁。我搜索了很多东西,但除了DontGoThroughThings脚本对我不起作用或者我真的不知道如何使用它外,什么都没有。
我一直在硬币上添加连续的动态效果,在墙壁上添加连续的碰撞检测功能,但仍然无法正常工作。
我的 2D Unity 游戏中有一个非常奇怪的问题,我能够将其简化为以下核心问题/最小再现测试用例。请按照以下步骤进行重现(Unity 5.1.1f1):
(0,0,0)
。BoxCollider
组件。C#
脚本,Unity将自动添加所需的组件,从而使其成为刚体碰撞器。isKinematic
标志。(2,0,0)
。BoxCollider
组件并添加BoxCollider2D
. 这使得这个立方体成为一个静态碰撞器。isTrigger
标志。预期行为:
玩家立方体向另一个立方体加速,并在接触它后停止移动。
观察到的行为:
玩家立方体向另一个立方体加速,然后继续以恒定速度移动。
其他实现细节:
我最初通过平移所有对象的变换来移动它们,并且根本没有使用刚体,因为我不需要碰撞检测。现在我知道了,所以我想要刚体。我深入研究在线资源,发现我应该使用rigidbody.MovePosition()
而不是transform.Translate()
or transform.position
。我修改了脚本,出现了上面的错误。
返回来transform.position
修复问题,但这不是一个好的解决方案,因为它涉及不良实践,根据我读到的内容,会产生大量的 CPU 负载。
尝试解决失败:
Update()
和Time.deltaTime
没有任何区别。Update()
,而是简单地将 重置timestep
为设置0
时。stop
不用找了。velocity
为0,结果没有变化。这确实有意义,因为Update()
完全跳过了(Debug.Log()
顺便说一句,我还用 a …因此,我正在努力实现如何向 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) rigid-bodies ×10
physics ×5
c# ×4
game-physics ×2
3d ×1
bullet ×1
c++ ×1
equation ×1
math ×1
quaternions ×1
rotation ×1
unityscript ×1