C和OpenGL中的运动粒子
我希望能够在3D环境中沿直线移动粒子,但我想不出如何根据3D空间中的两点计算出下一个位置 我创建了一个结构,它表示一个粒子,它有一个位置和一个下一个位置?这是否也适合确定下一个移动位置?我知道如何使用以下方法初始设置下一个位置:C和OpenGL中的运动粒子,c,opengl,3d,particles,C,Opengl,3d,Particles,我希望能够在3D环境中沿直线移动粒子,但我想不出如何根据3D空间中的两点计算出下一个位置 我创建了一个结构,它表示一个粒子,它有一个位置和一个下一个位置?这是否也适合确定下一个移动位置?我知道如何使用以下方法初始设置下一个位置: // Set particle's direction to a random direction void setDirection(struct particle *p) { float xnm = (p->location.x * -1) - p-&
// Set particle's direction to a random direction
void setDirection(struct particle *p)
{
float xnm = (p->location.x * -1) - p->velocity;
float xnp = p->location.x + p->velocity;
float ynm = (p->location.y * -1) - p->velocity;
float ynp = p->location.y + p->velocity;
float znm = (p->location.z * -1) - p->velocity;
float znp = p->location.z + p->velocity;
struct point3f nextLocation = { randFloat(xnm, xnp), randFloat(ynm, ynp), randFloat(znm, znp) };
p->nextLocation = nextLocation;
}
我使用的结构是:
// Represents a 3D point
struct point3f
{
float x;
float y;
float z;
};
// Represents a particle
struct particle
{
enum TYPES type;
float radius;
float velocity;
struct point3f location;
struct point3f nextLocation;
struct point3f colour;
};
我是不是走错了路
这是我所有的代码你想要实现向量数学
X{i+1}=X{i}+Vt
。对于分别表示位置和速度的X
s和V
矢量,以及表示时间的t
。我已经用时间参数化了轨道上的距离,因为我是物理学家,但这是很自然的事情。如果要给出轨迹距离(即缩放V
,使V.x*V.x+V.y*V.y+V.z*V.z=1
),则对速度矢量进行规格化
使用上面的struct
可以很自然地访问元素,但进行添加并不方便:数组更适合这样做。像这样:
double X[3];
double V[3];
// initialize
for (int i=0; i<3 ++1){
X[i] = X[i] + V[i]*t;
}
如果要将粒子的位置和速度与粒子相关联(这是非常合理的做法),则需要构造一个支持两个向量的结构
typedef
struct particle_s {
vector position;
vector velocity;
//...
} particle_t;
然后运行一个更新例程,大致如下所示:
void update(particle *p, double dt){
for (int i=0; i<3 ++i){
p->position.a[i] += p->velocity.a[i]*dt;
}
}
void更新(粒子*p,双dt){
对于(inti=0;iposition.a[i]+=p->velocity.a[i]*dt;
}
}
您想要实现向量数学X_{i+1}=X_{i}+Vt
。对于分别表示位置和速度的X
s和V
矢量,以及表示时间的t
矢量。我已经按时间参数化了轨迹上的距离,因为我是物理学家,但这确实是很自然的事情。如果你想给出轨迹距离,请规范化速度矢量(即缩放V
,使V.x*V.x+V.y*V.y+V.z*V.z=1
)
使用上面的struct
可以很自然地访问元素,但添加起来并不方便:数组更适合这样做。如下所示:
double X[3];
double V[3];
// initialize
for (int i=0; i<3 ++1){
X[i] = X[i] + V[i]*t;
}
如果要将粒子的位置和速度与粒子相关联(这是非常合理的做法),则需要构造一个支持两个向量的结构
typedef
struct particle_s {
vector position;
vector velocity;
//...
} particle_t;
然后运行一个更新例程,大致如下所示:
void update(particle *p, double dt){
for (int i=0; i<3 ++i){
p->position.a[i] += p->velocity.a[i]*dt;
}
}
void更新(粒子*p,双dt){
对于(inti=0;iposition.a[i]+=p->velocity.a[i]*dt;
}
}
想想物理学。一个物体有一个位置(x,y,z)和一个运动矢量(a,b,c)。你的物体应该存在于它的位置;它有一个与之相关联的运动矢量来描述它的动量。在物体上没有任何附加力的情况下,假设你的运动矢量描述了一段时间t内的运动,那么你的物体在时间x的位置将是(x+(at),y+(bt),z+(c*t))
简而言之,不要存储当前位置和下一个位置。存储当前位置和对象的动量。只需将动量添加到位置,就可以很容易地“计时”并更新对象的位置。想想物理。对象有一个位置(x,y,z)和一个运动向量(a,b,c)。你的物体应该存在于它的位置;它有一个与之相关联的运动矢量来描述它的动量。在物体上没有任何附加力的情况下,假设你的运动矢量描述了一段时间t内的运动,那么你的物体在时间x的位置将是(x+(at),y+(bt),z+(c*t))
简而言之,不要存储当前位置和下一个位置。存储当前位置和对象的动量。只需将动量添加到位置,就可以很容易地“计时”并更新对象的位置。将速度存储为结构点3f,然后您就可以得到如下结果:
void move(struct particle * p)
{
p->position.x += p->velocity.x;
p->position.y += p->velocity.y;
p->position.z += p->velocity.z;
}
从本质上讲,速度是指你希望位置每秒钟改变多少/滴答声/随便什么。将速度存储为结构点3f,然后你会得到如下结果:
void move(struct particle * p)
{
p->position.x += p->velocity.x;
p->position.y += p->velocity.y;
p->position.z += p->velocity.z;
}
基本上,速度是你希望位置每秒改变多少/滴答声/无论什么。我建议一个粒子应该只有一个位置成员——当前位置。此外,理想情况下,速度本身应该是三个分量的向量。创建一个函数(称之为
移动,置换无论什么)这需要一个粒子
和一个持续时间t
。这将在经过t
时间单位后计算最终位置:
struct point3f move(struct *particle, int time) {
particle->location->x = particle->velocity->x * t;
/* and so on for the other 2 dimensions */
return particle->location;
}
我建议一个粒子应该只有一个位置成员——当前位置。此外,理想情况下,速度应该是一个由3个分量组成的向量。创建一个函数(称之为move
,displace
随便什么)这需要一个粒子
和一个持续时间t
。这将在经过t
时间单位后计算最终位置:
struct point3f move(struct *particle, int time) {
particle->location->x = particle->velocity->x * t;
/* and so on for the other 2 dimensions */
return particle->location;
}
另一个答案有点数学化,其实很简单
你需要一个移动的“速度”,它还有x,y和z坐标
在一个时间段内,若要移动,只需将x速度添加到x位置以获得新的x位置,重复y和z
最重要的是,你可以有一个“加速度”(也就是x,y,z),例如,你的z加速度可以是重力,一个常数
每次你的速度都应该以同样的方式重新计算,称速度x为“vx”,所以vx应该变成vx+ax,重复y和z(再次)
数学已经有一段时间了,但我就是这么记得的,非常直截了当,除非你需要跟踪单位,然后它会变得更有趣(但仍然不错)另一个答案是有点数学化,它实际上非常直截了当
你需要一个你正在移动的“速度”