我是C ++编程的新手,并且试图使所有问题都移到中心,我有两种方法updateboid和cohesion。在凝聚力方面,我试图将归一化的向量返回到updateBoid中,当我这样做时,所有的辫子都向侧面移动而不是朝中心移动。我在这里做一些愚蠢的事情,将不胜感激。
void Scene::updateBoid()
{
for(size_t i=0; i<m_collection.size(); ++i)
{
for(auto &m :m_collection[i])
{
m->acc = cohesion();
m->pos += m->acc * 0.05f ;
}
}
}
Vec3 Scene::cohesion()
{
const float pi = 3.14f;
Vec3 center;
Vec3 test;
for(size_t i=0; i<m_collection.size(); ++i)
{
for(auto _m :m_collection[i]) // all of the boids
{
center += _m->pos;
}
center /= m_collection[i].size(); // doing this gives the center
/// Boids move to the center of their average positions
for(auto &m :m_collection[i])
{
m->dir =center - m->pos; //vector between the two objects
m->dir.normalize();
return m->dir;
}
}
}
cohesion()中的先前代码
m->dir =center - m->pos; //length between the two objects
m->dir.normalize();
m->pos+=m->dir * 0.25f; //speed
这可行,但是希望通过使用另一种方法来更新另一种方法。
答案 0 :(得分:0)
在每次cohesion
调用中,您总是(基本上)返回相同的方向,因此将所有m->acc
设置为相同的值。那是因为您在return
中的cohesion
已经退出了第一个投标。
问题是您尚未决定cohesion
应该做什么。如果应该返回一个物体的目标方向,则必须告诉它要考虑的物体。您也可以直接在m->acc
中更新cohesion
,而只需离开updateBoid
来修改m->pos
(并且仅读取m->acc
-可能是更好的解决方案。
在代码中:
选项1:不返回任何内容。仅修改每个投标。不要只在cohesion
内部调用updateBoid
。
void Scene::updateBoid()
{
for(size_t i=0; i<m_collection.size(); ++i)
{
for(auto &m :m_collection[i])
{
float acc = m->dir;
m->pos += acc * 0.05f;
}
}
}
void Scene::updateCohesion()
{
for(size_t i=0; i<m_collection.size(); ++i)
{
// This must be in here, otherwise it will be slightly wrong later.
Vec3 center;
for(auto _m :m_collection[i]) // all of the boids
{
center += _m->pos;
}
center /= m_collection[i].size(); // doing this gives the center
/// Boids move to the center of their average positions
for(auto &m :m_collection[i])
{
m->dir =center - m->pos; //vector between the two objects
m->dir.normalize();
}
}
}
选项2:返回每个boid的方向。这是低效的,因为您每次都需要重新计算中心。
void Scene::updateBoid()
{
for(size_t i=0; i<m_collection.size(); ++i)
{
for(auto &m :m_collection[i])
{
float acc = cohesionForBoid(m_collection[i], m);
m->pos += acc * 0.05f;
}
}
}
// What are these types? We don't know, that is missing from the question.
Vec3 Scene::cohesionForBoid(??? collection, ??? m)
{
Vec3 center;
for(auto _m : collection) // all of the boids
{
center += _m->pos;
}
center /= collection.size(); // doing this gives the center
Vec3 dir = center - m->pos; //vector between the two objects
dir.normalize();
return dir;
}
答案 1 :(得分:0)
for(auto &m :m_collection[i])
{
m->dir =center - m->pos; //vector between the two objects
m->dir.normalize();
return m->dir; // <- Always return on the first iteration
}
如Max Langhof所指出的,for循环仅执行一次。 我会称其为错误。首先修改您的代码。