KTRROTEXGS65联轴器7.8 的简单介绍

本文目录一览:

梦见打麻将赢钱是什么意思?

那正是你的心里活动,证明你很想赢钱,这时候往往就不能去了,赌徒心态,就当这个梦是用来放松的,保持一天好心情,不也挺好的嘛

什么时候组成的系统为弹簧政治?

弹簧是一种非常有用且基本的工具,可以表达各种动力。 在游戏和物理模拟中,我广泛地使用着它们。它们非常适合进行lerps 或 transitions (with under/overshoot).。 它们还是移动刚性体的理想工具-阻尼弹簧在数学上等效于PD控制。

在过去的几年中,我在Studio Gobo编写的弹簧动力学代码有了很大进步。 这篇文章记录了这种进步,希望对其他人有用。

弹簧实现

基础——简单的弹簧实现

这是一个由物理法则直接实现的弹簧系统

class Spring

{

// 弹簧目标

Vector3 m_targetPos;

// 动力状态

Vector3 m_pos, m_vel;

// 参数 - spring constant

float m_kp;

// 参数 - damping constant

float m_kd;

void Update( const float dt )

{

// compute spring and damping forces

Vector3 Fspring = m_kp * (m_targetPos - m_pos);

Vector3 Fdamp = m_kd * -m_vel;

// integrate dynamics

m_pos += m_vel * dt;

m_vel += (Fspring + Fdamp) * dt;

}

};

弹簧具有目标位置,然后将弹力计算为弹簧常数乘以相对于当前位置和目标位置的偏移量(代码第16行)。我们不希望弹簧永远(或根本不)摆动,因此我们通过施加与速度成比例的力来实现阻尼系统(代码第17行)。 最后,在第20和21行更新动态状态(pos和vel)

在继续学习有趣的东西之前,有一些注意事项需要先解决。 首先,代码虽然是向量形式的,但和在浮点数上运行一样容易(类可以在数据类型上进行模板化)。 目标位置是弹簧的输入,可以根据需要在每帧中进行更新。 其次,建模时无需特别清晰明了。 改变速度时,虽然可以将力除以质量再加到速度上,但我觉得这样做并不是很有用,而是依靠其他spring参数来获得所需的效果。

设置目标速度

基本的弹簧代码忽视了一个重要的条件–它假定目标速度为0。如果将弹簧连接到移动的目标,则该位置将始终滞后于目标,因为弹簧将会以0速度到达目标。 另一方面,如果您指定了目标速度和位置,则可以让该点将紧密跟踪目标。 我们可以添加更多代码来实现此功能:

请注意,我们在两个力计算中是非常对称的。 如果物体的位置和速度是已知的,就可以非常平滑地过渡。 如果参考系相对于世界移动,则也需要此参数。 如果弹簧在太空飞船内部,则目标速度应包括太空飞船的速度。

改进参数–用振动频率代替弹簧常数

而弹簧常数m_kp可以根据物理上有意义的参数来表示:无阻尼角频率(Undamped Angular Frequency,UAF)。 该值具有很重要的含义-它是弹簧振动的频率(每秒的跳动次数)。 这是任何人都可以理解的值,并且比任何常量更好。 它的用法如下:

改进参数–标准化阻尼参数

现在我们将注意力转向第二个参数-阻尼常数m_kd。 每次弹簧强度/频率UAF发生变化时,都需要重新平衡阻尼项以维持所需的下冲/过冲(undershoot/overshoot),这对于可用性/工作流程是个坏消息。 幸运的是,可以通过将参数更改为阻尼比(Damping Ratio,DR)轻松解决此问题。 它具有很好的特性——如果值1将会让underdamped的弹簧overshoot,而值 1则会让overdamped的将缓慢到达目标,而临界阻尼值恰好为1,目标将在此处达到极限。 尽可能快地达到目标而不会超过。

现在,设计人员/艺术家/程序员只需确定他们希望弹簧运动有多少overshoot/undershoot,并且可以设置此值。

提高稳定性–集成方案

上面我们已经看到了如何计算弹簧力和阻尼力。 这些力越大,误差将越大。 这往往会使弹簧轨迹的峰值过冲,从而为系统增加能量。 如果弹簧力或阻尼力足够大,则可以完全阻止弹簧收敛并导致模拟爆炸。 减少此错误的一种方法是减少时间步长,从而以更多的计算为代价提供更高的准确性,我们将在下一部分中对此进行探讨。 减少错误的另一种方法是更改集成方案,我们在本节中比较一些不同的方案。

Euler method

到目前为止,更新代码已实现了Euler方法。 它仅使用当前状态将状态及时向前移动,称为显式更新。 它很容易实现,但与分析轨迹(浅灰色)相比,往往会严重地超出可见范围:

在上述情况下,阻尼比很低,能量隐藏在系统中,并且于仿真有所不同。 稍微提高阻尼比可以解决这个问题,但是如果我们将阻尼比设置得足够高,则会遇到更严重的问题-尖峰振荡,导致系统爆炸:

半隐式欧拉

一个简单的改进是切换pos和vel的更新顺序:

m_vel += (Fspring + Fdamp) * dt;

m_pos += m_vel * dt;

正如维基百科上记录的那样,该方案非常好,我们在低阻尼值下的问题消失了(橙色):

不幸的是,该方案在阻尼时仍然容易产生剧烈的振荡:

隐式更新

如上所述,阻尼弹簧与PD控制密切相关,这与论文上的结果一样。 Tan et al引入了稳定的PD控制,对于stiff动力学或较大的时间步长是稳定的[1]。 这个想法是根据下一时间步的状态而不是当前状态来计算力,当前状态是使用一阶泰勒级数预测的。 解决了加速问题后,可以归结为中等数量的附加代码:

对于低阻尼值,我们可以节约一点,而解决方案(绿色)似乎更符合地面实况(灰色)的频率:

而且,在过阻尼的情况下,我们也会表现出良好的行为:

这些集成方案已实现到随附的电子表格中。 它们也在此处的交互式ShaderToy中运行[2]。

提高顽健性–固定或修复时间步

上面的隐式更新阻止了动态爆炸。 但是,它不能保证弹簧的性能得到保留。 可以看到,在模拟的(绿色)和参考方案(灰色)之间存在明显的增量:

这种行为将取决于帧速率,这可能会造成意想不到的后果。 我见过同事在一般的PC或笔记本电脑上运行未经优化的构建,并以中低帧频调整游戏,却发现在目标帧率下的感觉完全不同。 帧速率依赖性的典型症状是,在低帧速率下动态感觉松散和游动。 为了在低帧率和高帧率下都能保持一致,我们可以使弹簧以恒定的固定dt运行。 实际上,以小于最大允许时间步长的dt运行就足够了。

请注意,如果弹簧在物理更新中运行,则可能已经在使用固定的dts。 如果在这种情况下弹簧动力学存在问题,则可以以更高的频率(例如120Hz)运行弹簧动力学。

本节将介绍分步代码,以控制dt /仿真频率。

1.强制每个子步骤最大dt,允许混合dts

这将确保更新dt小于或等于规定的最大值。 它将以最大dt的步长前进,然后在最后一步中处理所有余数。

maxUpdates是可选的安全防护。 我在下面的注释部分中对此进行了一些考虑。

2.在每个子步骤中强制执行最大dt,保持统一的dts

该变量旨在计算小于最大值的统一更新dt。 使用此计算的更新dt模拟每个步骤。

3.强制执行固定dt

这可能是这里概述的三个选项中最强大的,因为dt始终是固定的,并且更新逻辑将是确定性的和一致的(忽略影响浮点确定性的外部因素)。 但是,它也是最复杂的实现

德国rotex90联轴器

Roten 是德国联轴器巨头 KTR 旗下的一个品牌,所以登录KTR 主页就可以找到具体信息了。

如果你只是用到这个零件,而不是要仿造这款联轴器,那对你有用的信息就是联轴器和外部连接的标准了:孔是用ISO 268 的 H7 ,槽键是 DIN 6885。

KTR联轴器生产高品质传动部件和制动器

服务热线

13166059228

13166059228

微信客服

微信客服