#include "ats_LTailBoid.h" #include // 識別子が長すぎるワーニングを無効 #pragma warning (disable : 4786) using namespace ats; using namespace std; LTailBoid::LTailBoid(int max, int max2, int tail_num) : Boid(max,max2, tail_num) { } LTailBoid::~LTailBoid() { } void LTailBoid::Draw() { // 方向を足す Point3D tmp((m_muki.GetNormal() *0.1) + m_center); double color = 1.0; double step = color / m_tail_num; // とりあえず、ラインで描画する // 描画するのは位置から方向(速度は無視) glDisable(GL_LIGHTING); glBegin(GL_LINES); glColor3f(0,0,0); glVertex3d(tmp.X(), tmp.Y(), tmp.Z()); glColor3d(1, 1, 1); glVertex3d(m_center.X(), m_center.Y(), m_center.Z()); vector::iterator itr = m_tail_itr; for(int i=0; i < m_tail_num; i++){ if(++itr == m_tail.end()){ // イテレータを移動 itr = m_tail.begin(); } color -= step; glColor3f(color, color, color); glVertex3d(itr->X(), itr->Y(), itr->Z()); } glEnd(); glEnable(GL_LIGHTING); } void LTailBoid::UpdateTime(double time) { using namespace std; bool crush_flag = false; // そのまま //if(m_parent != 0 && m_near != 0){ // Nearはしょる if(m_parent != 0){ // 次の方向 = 中央への方向 + 現在の方向 + 群れの方向 // 向き = 群への協調 + 自分の慣性 + ニアミスを避ける。 //Point3D go_parent(m_parent->Center() - m_center); //Point3D not_crush(m_center - m_near->m_center); // 中心へ + 群への協調 + 慣性 + 衝突回避 // OK m_muki = ((m_parent->Center()-m_center)*0.03 + m_parent->Muki()*0.03 + m_muki*0.95 + m_near->GetMuki()*0.01); // Nearをはしょってないやつ m_muki = ((m_parent->Center()-m_center)*0.23 + m_parent->Muki()*0.023 + m_muki*1.5);// + m_near->GetMuki()*0.01); // Nearをはしょったやつ //m_muki = ((m_parent->Center()-m_center)*0.05 + m_parent->Muki()*0.08 + m_muki*1.1); m_muki.Normalize() *= m_speed; // ボックスの外側にあって if(m_center.X() > m_box_max || m_center.X() < m_box_min || m_center.Y() > m_box_max || m_center.Y() < m_box_min || m_center.Z() > m_box_max || m_center.Z() < m_box_min) { m_center *= 0.98; // ちょっと中心に寄せてやってから m_muki *= -0.5; // 方向反転 } else { m_muki += (Point(rand()%10-5,rand()%10-5,rand()%10-5)).Normalize()*0.057; //m_muki.Normalize(); } // 前の位置を保存 *m_tail_itr = m_center; if(m_tail_itr == m_tail.begin()){ // イテレータを逆向きに移動 m_tail_itr = m_tail.end(); m_tail_itr--; } else { m_tail_itr--; } m_center += m_muki * 0.03; } }