如何确保粒子始终在中心对齐

时间:2014-09-12 02:35:19

标签: c++ opengl sfml

我无法确定如何确保在正方形中对齐的粒子始终位于屏幕中间,无论方块的大小如何。该方块使用:

创建
for(int i=0; i<(int)sqrt(d_MAXPARTICLES); i++) {
    for(int j=0; j<(int)sqrt(d_MAXPARTICLES); j++) {
        Particle particle;
        glm::vec2 d2Pos = glm::vec2(j*0.06, i*0.06) + glm::vec2(-17.0f,-17.0f);
        particle.pos = glm::vec3(d2Pos.x,d2Pos.y,-70);

        particle.life = 1000.0f;
        particle.cameradistance = -1.0f;

        particle.r = d_R;
        particle.g = d_G;
        particle.b = d_B;
        particle.a = d_A;

        particle.size = d_SIZE;
        d_particles_container.push_back(particle);
    }
}

最重要的部分是glm::vec2(-17.0f, -17.0f),它正确地将正方形定位在屏幕的中心。这看起来像:

enter image description here

问题是我的程序支持任意数量的粒子,所以只指定

enter image description here

现在我的广场偏离中心,但如何更改glm::vec2(-17.0f,-17.0f)以解释不同的粒子?

1 个答案:

答案 0 :(得分:1)

如果你想要一个固定的位置,不要让位置依赖于“i”和“j”指数。

    glm::vec2 d2Pos = glm::vec2(centerOfScreenX,centerOfScreenY); //much better

但是如何计算centerOfSCreen?这取决于您使用的是2D还是3D相机。

  • 如果使用固定的2D相机,则中心为(宽度/ 2,高度/ 2)。
  • 如果您使用移动的3D相机,则需要从屏幕中心发射光线并get any point on the ray(因此您只需使用X,Y然后根据需要设置Z)

编辑:

现在问题更清楚了答案:

    int maxParticles = (int)sqrt(d_MAXPARTICLES);
    factorx = (i-(float)maxParticles/2.0f)/(float)maxParticles;
    factory = (j-(float)maxParticles/2.0f)/(float)maxParticles;
    glm::vec2 particleLocaleDelta = glm::vec2(extentX*factorx,extentY*factory)
    glm::vec2 d2Pos = glm::vec2(centerOfScreenX,centerOfScreenY)
    d2Pos += particleLocaleDelta;

,其中

extentX,extentY

是“大正方形”的维度,因子是“i”和“j”的当前比例。代码未优化。只是想到工作(假设你有一台2D相机,其世界单位对应于像素单位)。