- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在构建一个物理引擎,我有某种“伪 verlet”的东西在运行,我想将它升级到“真正的”verlet。所以我找到了一篇文章并开始工作。在我添加了我认为是一个很好的近似值之后,引擎不再工作了。有人可以帮助我了解我做错了什么吗?
我的主要物理体类的更新、施加力和应用脉冲系统:
public void Update(float timestepLength)
{
if (!this._isStatic)
{
Vector2 velocity = Vector2.Subtract(_position, _lastPosition);
Vector2 nextPos = _position + (_position - _lastPosition) + _acceleration * (timestepLength * timestepLength);
_lastPosition = _position;
_position = nextPos;
_acceleration = Vector2.Zero;
}
}
public void ApplyForce(Vector2 accelerationValue)
{
if (!this._isStatic)
_acceleration += (accelerationValue) * _mass;
}
public void ApplyImpulse(Vector2 impulse)
{
if (!this._isStatic)
_acceleration +=-1 * impulse;
}
编辑:我已经修复它并且它像一个魅力一样工作,但我对以下代码有两个问题:
代码如下:
public Vector2 Position
{
get { return _position; }
set { _position = value;}
}
public void Update(float timestepLength)
{
if (!this._isStatic)
{
Vector2 velocity = Vector2.Subtract(_position, _lastPosition);
Vector2 velocityChange = Vector2.Subtract(velocity, Vector2.Subtract(_lastPosition, _twoStepsAgoPosition));
Vector2 nextPos = _position + (_position - _lastPosition) + _acceleration * (timestepLength * timestepLength);
_twoStepsAgoPosition = _lastPosition;
_lastPosition = _position;
_position = nextPos;
_acceleration = Vector2.Multiply(velocityChange, timestepLength);
}
}
public void ApplyForce(Vector2 force)
{
if (!this._isStatic)
_lastPosition -= force;
}
public void ApplyImpulse(Vector2 impulse)
{
if (!this._isStatic)
_acceleration +=-1 * impulse;
}
最佳答案
作为对其他人的引用...您可能引用的 verlet 论文是这样的:advanced character physics由创造 killer 的团队制作,并且是最早拥有基于布娃娃的物理学的团队之一
无论如何...他们使用的原始代码是:
void ParticleSystem::Verlet() {
for(int i=0; i<NUM_PARTICLES; i++) {
Vector3& x = m_x[i];
Vector3 temp = x;
Vector3& oldx = m_oldx[i];
Vector3& a = m_a[i];
x += x-oldx+a*fTimeStep*fTimeStep;
oldx = temp;
}
}
你说得对,你的代码做了类似的事情。
总是让我的模拟失败的一件事是使用了太大的时间步长。此外,通过此 verlet 集成,确保您使用的时间步长在整个游戏中保持不变。 (例如 30 帧/秒(因此时间步长为 1/30))并且不会波动。如果是这样,您应该使用 time corrected verlet integration这说明了这一点
编辑:
问题 2 的答案:要移动您的位置(不改变速度/加速度)只需将位置更新为新位置,然后作为额外步骤将此移动的增量(所以 newPosition-oldPosition)添加到 oldposs,所以这会相应更新。
问题 1 的答案:冲量是在一段时间内施加在物体上的力。所以你的解决方案是不正确的。冲动是在 X 时间步(或帧)上,您使用固定力调用 applyForce 函数。
关于c# - Verlet Integration 正在炸毁我的物理引擎,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1599376/
我使用此处找到的时间校正 Verlet 集成:http://www.gamedev.net/page/resources/_/technical/math-and-physics/a-simple-t
我正在尝试学习 Verlet 集成,主要是因为我很无聊,并且想为我正常的“弹跳球”学习练习增添趣味。 我在 http://sandbox.electricgrey.com:8080/physics/
有一个常用的verlet-integration Johnathan Dummer 在网上的公式,称为 Time-Corrected Verlet。但是我读过几个论坛帖子,人们在某些情况下会得到奇怪或
我正在使用 Haskell 制作 Verlet 积分器来模拟重力。积分器使用对象的前两个位置作为种子,并在此后生成其余位置。 我认为在 Haskell 中实现此目的的一个好方法是使用无限列表。然而,当
我知道这个标题让人大跌眼镜,但它主要是一个副作用问题。我正在编写一个 Android 应用程序,我可以将它与我在物理课上学习的数学一起使用。这是一个 2D 弹跳球应用程序。我正在使用时间校正的 Ver
我想为游戏创建一些 physx,我从小例子开始了解它是如何工作的。在此期间我遇到了一些问题,但我在 90% 内解决了它们。 为了创建我的示例,我研究了一些其他示例并创建了我使用的示例:codeflow
我正在尝试使用 verlet integration用于制作软体球体。 我主要是创建一个网格并通过 Spring 连接每个顶点。我正在使用 three.js 来渲染球体。我相信一切正常,但我不确定如何
我的印象是,如果被建模的系统确实如此,算法应该能够节约能源。我正在模拟太阳系,它应该节约能源。该程序保留了角动量并确实产生了稳定的轨道,但总能量(动能 + 重力势能)围绕某个基线振荡。振荡是显着的。是
我知道 Velocity Verlet 没有 Verlet 的初始化问题并且在其工作中有速度计算,而 Time Corrected Verlet 对于不同的时间步长是正确的但不包括速度计算。我想要像“
下面是我的 Verlet 函数代码,将从我的主脚本中调用。 % verlet.m % uses the verlet step algorithm to integrate the simple ha
我正在构建一个物理引擎,我有某种“伪 verlet”的东西在运行,我想将它升级到“真正的”verlet。所以我找到了一篇文章并开始工作。在我添加了我认为是一个很好的近似值之后,引擎不再工作了。有人可以
我是 Haskell 的新手,作为练习,我一直在尝试实现 Joel Franklin 的《物理计算方法》一书中的一些代码(用 Mathematica 编写)。我编写了以下代码以将 lambda 表达式
我正在尝试为具有周期性或反射性边界条件的二维盒子中的 lennard-jones 流体编写分子动力学模拟。模拟似乎在有反射边界的情况下运行良好,但出于某种原因,周期性盒子中的粒子在几百个积分步骤后开始
我的下面的代码(应该)求解两个物体的运动方程,但结果是粒子运行方式,我无法找到错误在哪里 import numpy as np import matplotlib.pyplot as plt plt.
对于我的建模和仿真类(class)项目,我想模拟一个太阳系。我从一颗恒星(太阳)和一颗行星(地球)开始,但我已经遇到了一些问题。我现在花了一些时间来回顾和学习不同的公式和方法来模拟行星的轨道将如何受到
问题 我实现了 Verlet 速度算法来计算 2 个物体在重力作用下相互作用的轨迹(仅限牛顿引力)。绕轨道运行的小天体质量很小,位于轨道中心的天体质量很大。 理论上,Velocity Verlet 不
我正在尝试通过速度 verlet 模拟地球-太阳系统,但不知何故,太阳不会围绕原点(质量减少的位置)运行,而是漂移。我花了很多时间查看我的算法,但找不到缺陷。 有人知道这里出了什么问题吗? 这是模拟图
我只是在测试游戏中轨道动力学的几种集成方案。我在这里以持续和适应性的步骤参加了 RK4 http://www.physics.buffalo.edu/phy410-505/2011/topic2/ap
我在理解我尝试使用 Three.js 和 yomboprime 的 GPUComputationRenderer 实现的逻辑时遇到了问题。 ( https://github.com/yomboprim
我是一名优秀的程序员,十分优秀!