Procedurally Animated Spider
I needed something interesting for an assignment I had to do and this is what I came up with. It is mostly complete, just a few loose ends need tying up. If anyone wants to use this then let me know and I'll tie up those loose ends
* feet always placed perfectly on terrain or obstacles
* add as many abdomens and legs as you wish(only two limbs per leg)
* can walk up walls
* fast
* create as many spiders as you want
creation:
//-- SPIDER
CSpider* spider = spiderMngr.createSpider();
abdomen = spider->createAbdomen();
abdomen->setPosition(AGKVector(0.0f, 25.0f, 0.0f));
//-- LEGS
//-- legs currently step 3 at a time, based on the order we add them, so we mix them up
//-- for more realistic stepping
//-- we increase length of front and back legs
float legMutiplier = 1.2f;
float lengthUpper = 6.0f;
float lengthLower = 5.0f;
float forwardOffset = 2.5f;
abdomen->createLeg(AGKVector(-0.5, -0.5, 0.3), AGKVector(-7.0f, -1.0f, 7.0f + forwardOffset), lengthUpper * legMutiplier, lengthLower * legMutiplier); //-- left1
abdomen->createLeg(AGKVector(0.5, -0.5, 0.1), AGKVector(7.0f, -1.0f, 3.5f + forwardOffset), lengthUpper, lengthLower); //-- right2
abdomen->createLeg(AGKVector(-0.5, -0.5, 0.1), AGKVector(-7.0f, -1.0f, 3.5f + forwardOffset), lengthUpper, lengthLower); //-- left2
abdomen->createLeg(AGKVector(0.5, -0.5, -0.3), AGKVector(7.0f, -1.0f, -7.0f + forwardOffset), lengthUpper * legMutiplier, lengthLower * legMutiplier); //-- right4
abdomen->createLeg(AGKVector(-0.5, -0.5, -0.1), AGKVector(-7.0f, -1.0f, -3.5f + forwardOffset), lengthUpper, lengthLower); //-- left3
abdomen->createLeg(AGKVector(0.5, -0.5, 0.3), AGKVector(7.0f, -1.0f, 7.0f + forwardOffset), lengthUpper * legMutiplier, lengthLower * legMutiplier); //-- right1
abdomen->createLeg(AGKVector(-0.5, -0.5, -0.3), AGKVector(-7.0f, -1.0f, -7.0f + forwardOffset), lengthUpper * legMutiplier, lengthLower * legMutiplier); //-- left4
abdomen->createLeg(AGKVector(0.5, -0.5, -0.1), AGKVector(7.0f, -1.0f, -3.5f + forwardOffset), lengthUpper, lengthLower); //-- right3
abdomen->setHeight(2.5f);
abdomen->setSpeedLinear(10.0f);
abdomen->setSpeedLerp(2.5f);
update:
abdomen->collectInput(agk::GetRawKeyState(38), agk::GetRawKeyState(39) - agk::GetRawKeyState(37));
spiderMngr.update(agk::GetFrameTime());
AGKVector pos(abdomen->getPosition());
AGKQuaternion rot(abdomen->getOrientation());
agk::SetObjectPosition(_objBody, pos.x, pos.y, pos.z);
agk::SetObjectRotationQuat(_objBody, rot.w, rot.x, rot.y, rot.z);
The current legs are for debugging only, I have not tried it with a spider model yet.
There is a demo to try in my next post.
EDIT: 27/10/13
You can now download project with source code attached to this post. It's not complete but source was requested by someone so I am sharing with everyone, hopefully someone can find it useful.