我正在处理一个课堂问题,要求我在3D空间中模拟太阳系内行星/卫星/小行星的运动。学期初我们从矢量、质量和力开始,所以我仍在努力掌握它。
*我的问题在第4步和第5步中有详细说明。如果我一路上有什么错误,请告诉我。任何意见和指导将不胜感激。
空间中的每个物体都具有以下特征:
我必须使用牛顿万有引力定律:
F = G * mass1 * mass2 / distance^2
给定时间t,更新空间中每个物体的位置和速度。那么,如果t是10秒,那么在给定时间,这些物体在空间中的位置是什么?
我被告知在整个t中把加速度视为常数。为了简单起见,不要担心物体碰撞,物体可能非常小。空间中给定的物体可能从1到100。
到目前为止,我不确定我做得对不对,但我目前正在采取以下步骤:
第二步:我在计算加速度:
a = Net Force / Mass
第3步:接下来我计算最终速度:
V=u a*t
u=初速
第四步:计算物体的最终位置:
s = s0 + u*t + 1/2*a*t^2
s0=初始位置,u=初始速度
步骤5:对其余对象重复该过程
我的问题在第4步和第5步。我的位置和速度是矢量。但是加速度是标量,所以我知道我不能把它加到矢量上。那么我在这里该怎么办?我是否对每个矢量分量进行计算,然后将所有分量放回新的最终速度和最终位置矢量中?我非常感谢您的帮助和任何输入。
如果教授告诉你在整个时间步骤中将加速度视为常数,那么就这样做,并将其视为不随时间变化的向量。
你的加速度可以是
vec3 acc = vec3( accVal, accVal, accVal );
这将给你一个在所有三个轴上都是恒定的加速度。
首先看这个QA:
你的步骤对于动态n体轨道力学来说是完全错误的!!!
因为你的身体是沿着曲线运动的。你需要使用牛顿·达朗贝尔积分迭代积分,而不是随着方向和力的变化一次计算整个东西,否则你的轨道会扭曲,甚至旋转或偏离太阳,甚至及时逃脱。也有为此保存能量的积分方法...
此外,在任何计算更改身体的位置之前,您必须计算所有物体的所有力,否则您将实现错误的方向,因为一些已经计算的物体处于新位置,而其他物体尚未处于新位置。这通常会给近地天体(如卫星和/或飞越)带来问题。。。
我使用这种逻辑:
>
struct _body
{
double mass;
dvec3 pos; // position
dvec3 vel; // velocity
dvec3 acc; // acceleration
} body[n];
还要为此使用至少64位双
浮点数。如果您有更多,那就更好了,因为即使是64位浮点数也已达到此类计算的极限。
为每个物体计算加速度
简单地总结每个物体的所有加速度
for (i=0;i<n;i++) body[i].acc = dvec3(0,0,0);
for (i=0;i<n;i++)
for (j=i+1;j<n;j++)
{
dvec3 d = body[i].pos - body[j].pos;
dvec3 F = G * body[i].mass * body[j].mass * d / pow(length(d),3);
body[i].acc -= F/body[i].mass; // the same force is aplied to both bodies
body[j].acc += F/body[j].mass; // just in reverse direction
}
d/pow(长度(d),3)
将为您提供方向为d的向量和大小为1/d^2的向量。其中,长度(d)=sqrt(d.x*d.x d.y*d.y d.z*d.z)该项将标量方程转换为向量方程。。。
您还可以为大小添加一些健全检查,以便在身体碰撞时避免除以太小或零值。。。
现在为每个实体应用更改
for (i=0;i<n;i++)
{
// Newton D'ALembert integration
body[i].vel += body[i].acc*dt; // this is instead of V = u + a*t
body[i].pos += body[i].vel*dt; // this is instead of s = s0 + u*t + 1/2*a*t^2
}
其中,dt是您的迭代时间步长,例如0.1秒(或计时器间隔或经过的或模拟的时间步长),迭代时间步长极大地影响精度,因此如果您需要更高的精度,我建议使用上面链接答案中的精度增强技巧,它可以在不显著降低dt的情况下极大地改善情况。
另请注意,步骤#2和#3在单独的循环中是至关重要的,不要将它们合并在一起!!!
转到#2
因此,在模拟过程中,您可以使用计时器或带有一些睡眠(dt)的线程或模拟引擎用于计时的任何机制重复步骤#2、#3。
矢量或者说向量,可以通过2~4个分量表示一个向量,比如通过vec3(1,0,0)表示三维空间中一个沿着x轴正方向的三维方向向量,如果你有高中数学的基础,应该对向量有一定的了解,对于三维坐标的相关几何运算也有一定的概念。 关键字 数据类型 vec2 二维向量,具有xy两个分量,分量是浮点数 vec3 三维向量 ,具有xyz三个分量,分量是浮点数 vec4 四维向量 ,具有xyzw四个分量,分量是浮点
Vector是由连续整数索引的值的集合。 使用Clojure中的矢量方法创建矢量。 例子 (Example) 以下是在Clojure中创建矢量的示例。 (ns clojure.examples.example (:require [clojure.set :as set]) (:gen-class)) (defn example [] (println (vector 1 2 3
结构体定义、常量和构造函数 定义: typedef struct cpVect{ cpFloat x, y; } cpVect 零向量常量: static const cpVect cpvzero = {0.0f,0.0f}; 创建新结构体所用的便捷的构造函数: cpVect cpv(const cpFloat x, const cpFloat y)
高德POI抓取 功能介绍 POI全称为Point of Interest,即兴趣点。在LSV的扩展插件中可以使用“高德POI抓取”功能来提取所选或者所绘制区域内中的所有包含自定义关键词的POI信息。 具体操作 在下载菜单中找到“高德POI抓取”功能,点击进入。 在绘制或选择所需提取POI的面后开始对关键词、POI类型进行设置,并且输入使用的高德KEY(详细
我试着用升压::变体 但我收到错误:错误:从'std::向量'转换为非标量类型'std::向量 编辑: 我在。h文件 现在我有以下错误: /softs/boost/1 . 53 . 0/64/gcc/4 . 5 . 1/include/boost/detail/reference _ content . HPP:在成员函数' void boost::detail::variant::assign
矢量是由最基本的几何元素(例如直线和曲线)定义出的形状。与位图图像不同,基于矢量的图形格式例如PDF是非常灵活的,因为它们可以被缩放到任何大小,而不损失任何精确度。矢量图形是由一个点连接另一个点的直线和曲线组合而成的。一系列互相链接的直线和曲线组成一个单一的矢量路径。 矢量绘图 Sketch有三种方法可以添加一个矢量形状: 矢量(Vector)工具:从头开始,通过添加直线和曲线点来绘制矢量图; 铅