- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有2个刚体(a
和b
)和1个固定关节约束(带有相对转换rela
)。
我的目标是实现:
1号。 b.transform = a.transform * rela
2号。质心(a
+ b
)不变。
No.3。(第三牛顿法则)整个系统的速度(a
+ b
)不变。
No.4。(第三牛顿法则)整个系统的角速度(a
+ b
)不变。
,编号5。应该最小化两个对象的移动/旋转以解决该问题。
我希望对两个物体施加冲击/扭矩,以使它们逐渐满足要求。
该视频可以描述我想要的-(youtube link)。
如何解决适用于每个 body 的冲动/扭矩值?
我想要一个大概的主意/算法。
它可以是没有任何代码的描述文本。
例子
这是一个示例问题及其正确的解决方案(即最终的静止状态):-
代码(草稿)
这是我当前的代码段,以防万一:
class Transform {
Vec3 pos;
Matrix33 basis;
};
class RigidBody {
float mass;
Matrix33 inertiaTensor;
Transform transform;
Vec3 velocity;
Vec3 angularVelocity;
};
class FixConstraint {
Transform rela;
RigidBody* a;
RigidBody* b;
};
a
和
b
的
SimdVector3 normal(0,0,0);
for (int i=0;i<3;i++)
{
normal[i] = 1;
new (&m_jac[i]) JacobianEntry(
m_rbA.getCenterOfMassTransform().getBasis().transpose(),
m_rbB.getCenterOfMassTransform().getBasis().transpose(),
m_rbA.getCenterOfMassTransform()*m_pivotInA - m_rbA.getCenterOfMassPosition(),
m_rbB.getCenterOfMassTransform()*m_pivotInB - m_rbB.getCenterOfMassPosition(),
normal,
m_rbA.getInvInertiaDiagLocal(),
m_rbA.getInvMass(),
m_rbB.getInvInertiaDiagLocal(),
m_rbB.getInvMass());
normal[i] = 0;
}
SimdVector3 pivotAInW = m_rbA.getCenterOfMassTransform()*m_pivotInA;
SimdVector3 pivotBInW = m_rbB.getCenterOfMassTransform()*m_pivotInB;
SimdVector3 normal(0,0,0);
for (int i=0;i<3;i++)
{
normal[i] = 1;
SimdScalar jacDiagABInv = 1.f / m_jac[i].getDiagonal();
SimdVector3 rel_pos1 = pivotAInW - m_rbA.getCenterOfMassPosition();
SimdVector3 rel_pos2 = pivotBInW - m_rbB.getCenterOfMassPosition();
//this jacobian entry could be re-used for all iterations
SimdVector3 vel1 = m_rbA.getVelocityInLocalPoint(rel_pos1);
SimdVector3 vel2 = m_rbB.getVelocityInLocalPoint(rel_pos2);
SimdVector3 vel = vel1 - vel2;
SimdScalar rel_vel;
rel_vel = normal.dot(vel);
//positional error (zeroth order error)
SimdScalar depth = -(pivotAInW - pivotBInW).dot(normal); //this is the error projected on the normal
SimdScalar impulse = depth*m_setting.m_tau/timeStep * jacDiagABInv - m_setting.m_damping * rel_vel * jacDiagABInv;
SimdVector3 impulse_vector = normal * impulse;
m_rbA.applyImpulse(impulse_vector, pivotAInW - m_rbA.getCenterOfMassPosition());
m_rbB.applyImpulse(-impulse_vector, pivotBInW - m_rbB.getCenterOfMassPosition());
normal[i] = 0;
}
最佳答案
顾名思义,约束是对两个物体运动的限制。因此,要成功地对约束进行建模,必须完全理解该约束施加在两个物体上的约束,并将这些约束表示为冲量或力方程。基于脉冲的求解器几乎总是在基于力的求解器上使用,因为一阶(速度)方程(以及所涉及的数字)比二阶(加速度)方程更容易计算和处理。因此,我们将着眼于为一般的一维约束(n-D约束可以表示为一个或多个一维约束)建模脉冲。
对一维约束的一阶(速度)约束建模
用脉冲对约束进行建模的第一步是将约束表示为一阶(速度/动量)方程。所讨论的固定约束(此后简称为“约束”)具有简单的位置(零级)约束:约束空间中的线性和角位置必须保持相同(由相对变换rela
指定)。通过考虑以下事实,我们可以将其转换为一阶限制:为了使两个物体的相对位置恒定,它们的相对速度必须为零。因此,约束可以解释为确保约束空间中两个物体的相对线速度和角速度为零。
现在可以将约束建模为必须施加到系统的脉冲,以使相对速度变为零。如果v1
和v2
是系统的初始和最终相对速度,则m
是系统的质量,而j
是为满足约束而施加的脉冲,则
v2 = v1 + j/m (1)
v2 = 0 (2)
rela
。如果
x1
是约束系统位置中的“错误”,则可以使用Baumgarte术语
beta * x1/h
将其“注入(inject)”到脉冲中,其中
h
是时间步长,
beta
是通常在0到1之间的参数。您可以考虑使用
beta
来是您希望求解器解析每一帧的位置误差的分数。
v2 + beta*x1/h = 0
x1
是初始位置错误,但是如果求解器使用隐式积分,则错误实际上是
x2 = x1 + v2*h
。
j
成比例的值(随着时间步长变得无限小,该值与速度
dv = v2 - v1
的导数成比例)。
v2 + beta * x1/h + gamma * j = 0
gamma >= 0
是另一个参数(也称为阻尼系数)。如果为
gamma = 0
,则约束将为无阻尼或刚性的。
v2
并求解
j
的结果方程式
j = -(v1 + beta * x1/h) * (1/(gamma + 1/m))
| equivalent mass |
x1 = B.position - rela.origin
和
v1 = relative velocity of A and B along x1
。但是,由于我们要限制3维的位置(即
x1
是3d向量,而不是标量),因此我们可以分别求解三个轴上每个轴的一维约束。然后可以使用相同的约束对角位置和速度重复此过程。可以遵循相同的过程来推导任何一维约束的冲量。
j
必须以相反的方向应用于两个主体,以使约束系统上的总脉冲为零。当为正时,这种冲动意味着将两个物体推开,而当为负时,则意味着将它们拉在一起。因此,如果约束法线指向从主体A到主体B(按照约定),则
-j * normal
应用于主体A,而
+j * normal
应用于主体B。
n
维空间中的1-D约束,并且不需要针对不同轴进行多次求解迭代。
gamma * (j + j0)
,其中
j0
是在热启动过程中施加的累积脉冲。
Generic6DofConstraint
(所有6个自由度都受限制),而不是
Point2PointConstraint
(这是一个球窝样的接缝)。您可以查看其实现以供引用。 Bullet 1.5约束求解器使用略有不同(且稍为波浪形)的阻尼脉冲方程式(在该方程中,他们将相对速度与阻尼因子相乘,但未将其与等效质量的倒数相加),从而稍微削弱了约束更多的。这取决于您要选择的偏好,但是我认为这里使用的那个更合理,也更容易适应其他自然的软约束(例如,根据 Spring 频率和阻尼比对约束进行参数化,以模拟一个阻尼 Spring )。
关于algorithm - 计算3D固定关节约束中两个物体的脉冲/扭矩,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55491598/
大家好,本文实现了相机碰撞检测,使相机不穿墙壁、物体,并给出了思路和代码,感谢大家~ 关键词:数字孪生、three.js、Web3D、WebGL、相机碰撞、游戏相机 我正在承接Web3D数字孪生项
我有一个大小为 12*30 的字符串的图像。我想创建一个动画,让它给人一种拉伸(stretch)字符串的感觉。我通过缩放图像来做到这一点,但我面临的问题是缩放图像没有发生碰撞。它仅出现在原始图像大小的
我的对象列表是如此初始化: $( function() { var $container = $('div.hikashop_products'); $container.isotop
我听说 swing 默认情况下是双缓冲的。我不想让 Swing 双缓冲。我正在使用双缓冲,我想添加一些 Swing 对象(现在只是添加到 JPanel 中的 JButton,然后再添加到 JFrame
几天来我一直在思考最好的解决方案,但似乎无法找到正确的想法。 我有一 block (物体),我想将它们放入尽可能小的空间中。我最终寻找的是这样的东西 http://i.stack.imgur.com/
我的纹理不仅仅是一个盒子或圆形,我的 body 需要与这个形状相同,所以我想结合多个 body 来达到我想要的形状,这甚至可能吗?或者有更好的方法吗?我正在使用带有 libgdx 框架的 java。
我遇到的情况是,我有很多计算机并且需要有唯一的 ID。 他们会通过 API 请求发送其 uniqueId。该对象看起来像 class ID { long timestamp; int id; }
我正在尝试检测一张卡片,但问题是有时图像不好并且有多个背景,如下所示: 没有很好地定义边缘 ![没有很好地定义边缘][1] 示例背景 ![示例背景][2] 我这样做了: gray = cv2.cvtC
我正在尝试从仅包含一辆车和简单背景的图像中分割汽车,如 但是我从我的实现中得到的是这个 和 分别 但它非常容易处理几乎已经分割的图像,例如。 给出类似 的结果 我使用的代码是 import cv2 i
我正在开发一个项目,在该项目中我从另一个对象/函数中引用一个变量。然而我总是返回 false。我不确定我是否正确调用它。 这是验证函数: app.validation = function(){
数组只是伪装的对象吗?为什么/为什么不呢?他们以什么方式(这样/不是)? 我一直认为 JS 中的数组和对象本质上是相同的,主要是因为访问它们是相同的。 var obj = {'I': 'me'}; v
我正在使用 PlayN 构建一个涉及石头的游戏,用户必须在物理世界中移动(通过重力等)。我希望用户能够使用触摸板直接操纵石头,并通过以下方式给它们一个速度拖拽并扔掷它们。 现在我有一个实现,其中每个石
http://jsfiddle.net/goldrunt/jGL84/42/这是来自这个 JS fiddle 的第 84 行。通过取消注释第 141-146 行,可以对球应用 3 种不同的效果。 'b
我学习Linux平台下的OpenGL。最近,我尝试使用 glutBitmapCharacter() 创建的文本作为 glu 或 glut 提供的一些二次对象的纹理。但是,glutBitmapChara
我正在使用 AndEngine 创建一个带有 box2d 扩展名的游戏。我想实现一个条件,当两个物体碰撞时,它们应该被移除或重生。最初我尝试使用 if(sprite1.collidesWith(spr
我制作了一个小型 3d 引擎。 但我在旋转功能方面遇到了一些问题。它们使物体不时拉伸(stretch)。这是数学: this.rotateX = function(angle) { var c
我在 Canvas 上制作了一个矩形 mask ,我需要 mask 外的任何东西都具有 0.8 的不透明度,因此 mask 外的所有对象都被视为不透明请看一下 fiddle 。 http://jsfi
我是 Direct3D 的新手,我在一个项目中从网络摄像头拍照并在它前面绘制一些 3D 对象。 我能够使用正交投影将网络摄像头图像渲染为背景。 //init matrix D3DXMatri
我是一名优秀的程序员,十分优秀!