对于如何计算两个刚体之间角动量传递的相对容易实现的方程,有没有人有任何好的参考?
我一直在寻找这种事情,我没有找到任何特别易于理解的问题解释.
确切地说,问题是这样的; 两个刚体在无摩擦(井,近)表面上移动; 把它想象成空气曲棍球.两个刚体接触,然后移开.现在,在不考虑角动量的情况下,方程式相对简单; 问题变成了,身体之间的角动量传递会发生什么?
作为一个例子,假设两个物体没有任何角动量; 他们没有旋转.当它们以倾斜角度相互作用时(行程矢量不与它们的质心线对齐),显然它们的一定量的动量会转换成角动量(即它们各自得到一定量的旋转),但是如何很多,这样的等式是什么?
这可以通过使用多体刚性系统来计算,但我希望得到更加优化的计算,所以我可以实时计算这些东西.有没有人对方程式有任何想法,或指向包含在项目中的这些计算的开源实现?确切地说,我需要将其作为一个相当优化的计算,因为需要在模拟的单个"滴答"内模拟相互作用的数量.
编辑:好的,看起来没有关于这个主题的很多准确信息.而且我发现"程序员物理学"类型的书籍有点太......愚蠢到真正得到; 我不想要算法的代码实现; 我想弄清楚(或者至少已经勾勒出我的算法)算法.只有这样才能根据我的需要对其进行适当的优化.有没有人对这类话题有任何数学参考?
language-agnostic equation physics angular-momentum rigid-bodies
我试图弄清楚如何getRotationMatrix()和getOrientation()正确地工作.
到目前为止,我已经知道在getRotationMatrix()功能上它与磁矢量交叉产生重力矢量,以获得指向东方的新矢量.然后,它再次使用重力矢量交叉产生东向量,以使向量指向磁北.根据这篇文章说,现在我们有三个正交向量,我们可以形成一个旋转矩阵.
这是我的第一个问题:为什么我们应该再次使用重力矢量来交叉产生东向量以获得指向磁北的向量?原始磁矢量是不是指向磁北?新矢量和原始磁矢量有什么区别?
说到getOrientation()这里,这是我的第二个问题:方位角,滚动和音高如何出现?是否有任何方程式或公式可供解释?
你可以去这个网站 看看代码
非常感谢您的关注.非常感谢!
我正在设计一个塔防游戏,为此我使用A*寻路算法从我的产卵区到达我的目的地.
这里的问题是所有单元堆叠,看起来不太好看.有没有办法可以让他们以某种方式组成团体,如果没有足够的空间,可以传播更多?
该算法可以使所有单元一次移动一个图块.
什么是用于创建(视觉上吸引人的)3D物理模拟/可视化的python程序的好库?
我看过Vpython,但我看到的模拟看起来很难看,我希望它们具有视觉吸引力.它看起来像一个旧图书馆.对于3D编程,我已经看到了使用Panda3D和python-ogre的建议,但我不确定它是否真的适合精确模拟.另外,我更喜欢一个与其他库很好地结合的库(例如pygame与其他库没有很好的结合).
我对实现快速多极子方法以有效模拟排斥粒子系统感兴趣。
我已经找到了大量讨论FMM的参考资料,但对于想要完全理解该算法的非数学家来说,这些参考资料似乎都不是很容易解决。
您是否可以推荐一个基础参考,该参考可以清楚地说明该过程背后的数学原理,并包括例示正确实现方式的伪代码?
我试图计算发射射弹以达到特定坐标所需的角度.
我的射弹位于一个随机坐标,我的目标坐标位于静态坐标.
我最终在维基百科上运行以下等式来计算从(0,0)到(x,y)的坐标所需的角度:

我已经尝试了解这个和其他公式,并尝试了以下实现(我使用的是c#和XNA).
double y = source.Y - target.Y;
double x = Vector2.Distance(source, target);
double v = 1440; //velocity
double g = 25; //gravity
double sqrt = (v*v*v*v) - (g*(g*(x*x) + 2*y*(v*v)));
sqrt = Math.Sqrt(sqrt);
double angleInRadians = Math.Atan(((v*v) + sqrt)/(g*x));
Run Code Online (Sandbox Code Playgroud)
我还尝试了以下内容,这导致了相同的角度,其中v和g的值保持不变.
double targetX = target.X - source.X;
double targetY = -(target.Y - source.Y);
double r1 = Math.Sqrt((v*v*v*v) - g*(g*(target.X*target.X) + ((2*target.Y)*(v*v))));
double a1 = ((v*v) + r1)/(g*target.X);
angleInRadians = -Math.Atan(a1);
if (targetX < 0)
{
angleInRadians -= 180/180*Math.PI; …Run Code Online (Sandbox Code Playgroud) 我有一个程序,圆圈可以互相反弹.我按照这里的指示旋转矢量并根据碰撞角度缩放幅度:http://www.vobarian.com/collisions/2dcollisions2.pdf
我在python中编写了这段代码(0索引表示x坐标):
norm_vect = [(object2.pos[0] - object1.pos[0]), (object2.pos[1] - object1.pos[1])]
unit = sqrt((norm_vect[0]**2) + (norm_vect[1]**2))
unit_vect = [float(norm_vect[0]) / unit, float(norm_vect[1]) /unit]
tan_vect = [-unit_vect[1], unit_vect[0]]
vel1 = object1.vel
vel2 = object2.vel
vel1_norm = vel1[0] * unit_vect[0] + vel1[1] * unit_vect[1]
vel1_tan = vel1[0] * tan_vect[0] + vel1[1] * tan_vect[1]
vel2_norm = vel2[0] * unit_vect[0] + vel2[1] * unit_vect[1]
vel2_tan = vel2[0] * tan_vect[0] + vel2[1] * tan_vect[1]
new_vel1_norm = (vel1_norm * (object1.mass - object2.mass) + 2 …Run Code Online (Sandbox Code Playgroud) 如何获得SCNPhyisicsBody的当前速度?
velocity属性总是返回(0.0,0.0,0.0),而我的SCNNode的prensetationNode的physicsBody也是nil.
我正在尝试使用C在opengl中建立太阳系的模拟.我似乎无法弄清楚如何编写用于计算另一个行星施加在行星上的力的方向的代码.这就是我到目前为止:
void attraction(planet self, planet other, float *direction)
{
float d = vecDistance(self.p, other.p);
//calc the force of attraction
float f = G * ((self.mass * other.mass) / (pow(d, 2)));
//calc the direction of the force
float vectorDist[3];
vecSub(self.p, other.p, vectorDist);
direction[0] = f*vectorDist[0] / d;
direction[1] = f*vectorDist[1] / d;
direction[2] = f*vectorDist[2] / d;
}
float vecDistance( float *pV1, float *pV2 )
{
float fLen=0.0f;
if(pV1 && pV2)
{
float av[3];
vecSub(pV2, pV1, av);
fLen=vecLength(av);
}
return fLen; …Run Code Online (Sandbox Code Playgroud) 出于好奇,我用3种方式实现了vector3实用程序:array(带有typedef),类和结构
这是数组实现:
typedef float newVector3[3];
namespace vec3{
void add(const newVector3& first, const newVector3& second, newVector3& out_newVector3);
void subtract(const newVector3& first, const newVector3& second, newVector3& out_newVector3);
void dot(const newVector3& first, const newVector3& second, float& out_result);
void cross(const newVector3& first, const newVector3& second, newVector3& out_newVector3);
}
// implementations, nothing fancy...really
void add(const newVector3& first, const newVector3& second, newVector3& out_newVector3)
{
out_newVector3[0] = first[0] + second[0];
out_newVector3[1] = first[1] + second[1];
out_newVector3[2] = first[2] + second[2];
}
void subtract(const newVector3& first, const newVector3& …Run Code Online (Sandbox Code Playgroud) physics ×10
algorithm ×2
c# ×2
math ×2
python ×2
xna ×2
3d ×1
android ×1
bounce ×1
c ×1
c++ ×1
debugging ×1
equation ×1
fastmm ×1
game-physics ×1
objective-c ×1
optimization ×1
orientation ×1
path-finding ×1
performance ×1
reference ×1
rigid-bodies ×1
scenekit ×1
simulation ×1
swift ×1
trigonometry ×1
utility ×1
xcode ×1