- 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/
SQL 和一般开发的新手,我有一个表(COUNTRIES),其中包含字段(INDEX、NAME、POPULATION、AREA) 通常我添加一个客户端(Delphi)计算字段(DENSITY)和 On
我想使用 calc(100%-100px),但在我的 demo 中不起作用由于高度只接受像素,因此如何将此百分比值转换为像素。 最佳答案 以下将为您提供高度: $(window).height();
我正在尝试在 MySQL 中添加列并动态填充其他列。 例如我有一张表“数字”并具有第 1 列、第 2 列、第 3 列,这些总数应填充在第 4 列中 最佳答案 除非我误解了你的问题,否则你不只是在寻找:
我想返回简单计算的结果,但我不确定如何执行此操作。我的表格如下: SELECT COUNT(fb.engineer_id) AS `total_feedback`, SUM(fb.ra
我一直在尝试做这个程序,但我被卡住了,我仍然是一个初学者,任何帮助将不胜感激。我需要程序来做 打印一个 10 X 10 的表格,其中表格中的每个条目都是行号和列号的总和 包含一个累加器,用于计算所有表
这个计算背后一定有一些逻辑。但我无法得到它。普通数学不会导致这种行为。谁能帮我解释一下原因 printf ("float %f\n", 2/7 * 100.0); 结果打印 1.000000 为什么会
我想计算从 0 到 (n)^{1/2} - 1 的数字的 AND每个数字从 0 到 (n)^{1/2} - 1 .我想在 O(n) 中执行此操作时间,不能使用 XOR、OR、AND 运算。 具体来说,
如何在 Excel 中将公式放入自定义数字格式?例如(出于说明目的随机示例), 假设我有以下数据: 输入 输出 在不编辑单元格中的实际数据的情况下,我想显示单元格中的值除以 2,并保留两位小数: 有没
每次我在 Flutter 应用程序中调用计算()时,我都会看到内存泄漏,据我所知,这基本上只是一种生成隔离的便捷方法。我的应用程序内存占用增加并且在 GC 之后永远不会减少。 我已将我的代码简化为仅调
我有数字特征观察 V1通过 V12用于目标变量 Wavelength .我想计算 Vx 之间的 RMSE列。数据格式如下。 每个变量“Vx”以 5 分钟的间隔进行测量。我想计算所有 Vx 变量的观测值
我正在寻找一种使用 C 语言计算文件中未知字符数的简单方法。谢谢你的帮助 最佳答案 POSIX 方式(可能是您想要的方式): off_t get_file_length( FILE *file ) {
我正在使用 Postgres,并且我正试图围绕如何在连续日期跨度中得出第一个开始日期的问题进行思考。例如 :- ID | Start Date | End Date =================
我有一个订单表格,我在其中使用 jQuery 计算插件来汇总总数。 此求和工作正常,但生成的“总和”存在问题。总之,我希望用逗号替换任何点。 代码的基础是; function ($this) {
我在使用 double 变量计算简单算术方程时遇到问题。 我有一个具有 double 属性 Value 的组件,我将此属性设置为 100。 然后我做一个简单的减法来检查这个值是否真的是 100: va
我在这里看到了一些关于 CRC 32 计算的其他问题。但没有一个让我满意,因此是这样。 openssl 库是否有任何用于计算 CRC32 的 api 支持?我已经在为 SHA1 使用 openssl,
当我在PHP日期计算中遇到问题时,我感到惊讶。 $add = '- 30 days'; echo date('Y-m-01', strtotime($add)); // result is 2017-
我正在使用 javascript 进行练习,我编写了这个脚本来计算 2 个变量的总和,然后在第三个方程中使用这个总和!关于如何完成这项工作的任何想法都将非常有用! First Number:
我有一个来自EAC的提示单和一个包含完整专辑的FLAC文件。 我正在尝试制作一些python脚本来播放文件,因为我需要能够设置在flac文件中开始的位置。 如何从CueSheet格式MM:SS:FF转
这个问题已经有答案了: Adding two numbers concatenates them instead of calculating the sum (24 个回答) 已关闭去年。 我有一个
4000 我需要上面字段 name="quantity" 和 id="price" 中的值,并使用 javascript 函数进行计算,并将其显示在字段 id= 中仅当我单击计算按钮时才显示“总
我是一名优秀的程序员,十分优秀!