📄 cboid.h
字号:
/* Copyright (C) Steven Woodcock, 2000. * All rights reserved worldwide. * * This software is provided "as is" without express or implied * warranties. You may freely copy and compile this source into * applications you distribute provided that the copyright text * below is included in the resulting source code, for example: * "Portions Copyright (C) Steven Woodcock, 2000" *///*********************************************************************// Name: CBoid.h// Purpose: Class definitions and method prototypes for individual// boids (flock members).//*********************************************************************#ifndef _CBOID_H#define _CBOID_H//// includes//#include "defaults.h"#include "mtxlib.h"#include "util.h"#include "vector.h"//// class definition//class CBoid { public: /////////////////// // static variables /////////////////// // visible friends list (work space reused by each boid) static CBoid * VisibleFriendsList[Max_Friends_Visible]; /////////////////////////////// // constructors and destructors /////////////////////////////// // Constructor #1. // Creates an individual boid with randomized position, // velocity, and orientation. CBoid (short id_v); // Constructor #2. // Creates an individual boid with specific position, // velocity, and orientation. CBoid (short id_v, vector * pos_v, vector * vel_v, vector * ang_v); // Destructor ~CBoid (void); ////////////////////////// // public flocking methods ////////////////////////// // FlockIt. // Used for frame-by-frame updates; no time // deltas on positions. void FlockIt (int flock_id, CBoid *first_boid); ////////////////////////// // miscellaneous functions ////////////////////////// // AddToVisibleList. // This visibility list is regenerated for each member each update cycle, // and acts much like a push-down queue; the latest member added to the // list becomes the first one when the list is sequentially accessed. // Mostly I did this for speed reasons, as this allows for fast inserts // (and we don't delete from this list, we just rebuild it each update cycle). void AddToVisibleList (CBoid *ptr); // ClearVisibleList. // Clears the visibility list. void ClearVisibleList (void); // GetOrient. // Returns the orientation of the boid in question. vector * GetOrient (void); // GetPos. // Returns the position of the boid in question. vector * GetPos (void); // GetNext. // Returns the "next" pointer of the invoking member. CBoid * GetNext(void); // LinkOut. // Removes a member from a list. void LinkOut (void); // PrintData. // Dumps all data describing a given member. void PrintData (void); // SetNext. // Set the "next" pointer of an individual member. void SetNext (CBoid *ptr); // SetPrev. // Set the "prev" pointer of an individual member. void SetPrev (CBoid *ptr); private: /////////////// // data members /////////////// // supplied with constructor(s) short m_id; // member individual ID float m_perception_range; // how far member can see vector m_pos; // position of member (in meters) vector m_vel; // velocity of member (meters/sec) vector m_ang; // orientation of member // (right-handed coordinate system) // computed float m_speed; // overall speed of member short m_num_flockmates_seen; // # of flockmates this member sees short m_num_enemies_seen; // # of enemies this member sees CBoid *m_nearest_flockmate; // pointer to nearest flockmate (if any) CBoid *m_nearest_enemy; // pointer to nearest enemy (if any) float m_dist_to_nearest_flockmate; // distance to nearest flockmate // (if any), in meters float m_dist_to_nearest_enemy; // distance to nearest enemy // (if any), in meters vector m_oldpos; // last position vector m_oldvel; // last velocity CBoid *m_next; // pointer to next flockmate CBoid *m_prev; // pointer to previous flockmate /////////////////// // flocking methods /////////////////// // Cruising. // Generates a vector indicating how a flock boid would // like to move, if it were all up to him and he was under // no other influences of any kind. vector CBoid::Cruising (void); // FleeEnemies. // Generates a vector for a flock boid to avoid the // nearest enemy (boid of a different flock) it sees. vector CBoid::FleeEnemies (void); // KeepDistance. // Generates a vector for a flock boid to maintain his // desired separation distance from the nearest flockmate he sees. vector CBoid::KeepDistance (void); // MatchHeading. // Generates a vector for a flock boid to try // to match the heading of its nearest flockmate. vector CBoid::MatchHeading (void); // SeeEnemies. // Determines which enemy flock boids a given flock boid can see. int CBoid::SeeEnemies (int flock_id); // SeeFriends. // Determines which flockmates a given flock boid can see. int CBoid::SeeFriends (CBoid *first_boid); // SteerToCenter. // Generates a vector to guide a flock boid towards // the "center of mass" of the flockmates he can see. vector CBoid::SteerToCenter (void); // WorldBound. // Implements a world boundary so that flocks don't fly // infinitely far away from the camera, instead remaining // in a nice viewable area. It does this by wrapping flock // boids around to the other side of the world, so (for example) // they move out the right and return on the left. void CBoid::WorldBound (void); ////////////////////////// // miscellaneous functions ////////////////////////// // AccumulateChanges. // Adds vector values in changes into the accumumlator vector. // Returns magnitude of accumulator vector after adding changes. float CBoid::AccumulateChanges (vector &accumulator, vector changes); // CanISee. // Determine whether a given invoking boid can see the boid in question. // Returns the distance to the boid. float CBoid::CanISee (CBoid *ptr); // ComputeRPY. // Computes the roll/pitch/yaw of the flock boid based on its // latest velocity vector changes. Roll/pitch/yaw are stored in // the "ang" data member as follows: // pitch is about the x axis // yaw is about the y axis // roll is about the z axis // All calculations assume a right-handed coordinate system: // +x = through the left side of the object // +y = up // +z = through the nose of the model void CBoid::ComputeRPY (void);};#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -