# HG changeset patch # User tokumoritaichirou@w-133-13-243-110.cc.u-ryukyu.ac.jp # Date 1265189821 -32400 # Node ID 39e0c583e0a37f752077703ece51d4d7dc66e89e # Parent d45a95c697c307c98da11a069988e7e954b7194a add GiantroboClassfile. diff -r d45a95c697c3 -r 39e0c583e0a3 src/Giantarm.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/Giantarm.cpp Wed Feb 03 18:37:01 2010 +0900 @@ -0,0 +1,352 @@ +/* + * giantarm.cpp + * Martial + * + * Created by e075743 on 10/02/03. + * Copyright 2010 __MyCompanyName__. All rights reserved. + * + */ + +#include "Giantarm.h" + +Giantarm::Giantarm(char* _name) : Humanoid::Humanoid(_name) { + moveCount = 0.0; + //scale = osg::Vec3(0.01,0.01,0.01); + + humanoidNode = osgDB::readNodeFile("Giantarm.osg"); + humanoidForm = new osg::PositionAttitudeTransform(); + humanoidForm->addChild(humanoidNode); + mform->addChild(humanoidForm); + + //ノードにアクセス。MatrixTransformをnameで検索(visitor内部で std::map で保持) + SearchMatrixTransformVisitor visitor = SearchMatrixTransformVisitor(); + + humanoidNode->accept(visitor); + bodyForm = visitor.getMatrixTransform("body"); + leftUpperArmForm = visitor.getMatrixTransform("left_arm"); + rightUpperArmForm = visitor.getMatrixTransform("right_arm"); + leftDownArmForm = visitor.getMatrixTransform("left_hand"); + rightDownArmForm = visitor.getMatrixTransform("right_hand"); + //leftUpperLegForm = visitor.getMatrixTransform("left_leg1"); + //rightUpperLegForm = visitor.getMatrixTransform("right_leg1"); + //leftDownLegForm = visitor.getMatrixTransform("left_leg2"); + //rightDownLegForm = visitor.getMatrixTransform("right_leg2"); + + //衝突判定ノードの追加 + CollisionNode* collisionNode; + + bodyForm->setMatrix(osg::Matrix()); + + collisionNode = new CollisionNode("Body-Node1", new osg::Sphere(osg::Vec3(0, 0, 0), 0.5)); + bodyForm->addChild(collisionNode->getGeode()); + collisionNodeList.push_back(collisionNode); + collisionNode = new CollisionNode("Body-Node2", new osg::Sphere(osg::Vec3(0, 0, 0.5), 0.5)); + bodyForm->addChild(collisionNode->getGeode()); + collisionNodeList.push_back(collisionNode); + collisionNode = new CollisionNode("Body-Node3", new osg::Sphere(osg::Vec3(0, 0, -0.6), 0.5)); + bodyForm->addChild(collisionNode->getGeode()); + collisionNodeList.push_back(collisionNode); + collisionNode = new CollisionNode("Left-Arm-Node", new osg::Sphere(osg::Vec3(1, -0.4, -0.7), 0.3)); + leftDownArmForm->addChild(collisionNode->getGeode()); + collisionNodeList.push_back(collisionNode); + collisionNode = new CollisionNode("Right-Arm-Node", new osg::Sphere(osg::Vec3(-1, -0.4, -0.7), 0.3)); + rightDownArmForm->addChild(collisionNode->getGeode()); + collisionNodeList.push_back(collisionNode); + //collisionNode = new CollisionNode("Left-Leg-Node", new osg::Sphere(osg::Vec3(0, 0, 0), 30)); + //leftUpperLegForm->addChild(collisionNode->getGeode()); + //collisionNodeList.push_back(collisionNode); + //collisionNode = new CollisionNode("Right-Leg-Node", new osg::Sphere(osg::Vec3(0, 0, 0), 30)); + //rightUpperLegForm->addChild(collisionNode->getGeode()); + //collisionNodeList.push_back(collisionNode); + + SearchGeodeVisitor gvisitor = SearchGeodeVisitor(); + + gvisitor.setSearchGeodeName("Collision_right_leg1_geode"); + humanoidNode->accept(gvisitor); + + //std::cout << "getVisitor: result = " << gvisitor.getGeode().getName(); << "\n"; + + unWaitFunc = &Giantarm::nop; + funcs[PUSH_LEFT] = &Giantarm::walk; + funcs[PUSH_RIGHT] = &Giantarm::turn; + funcs[PUSH_UP] = &Giantarm::jump; + funcs[PUSH_DOWN] = &Giantarm::squat; + funcs[PUSH_RIGHTUP] = &Giantarm::jump; + funcs[PUSH_LEFTUP] = &Giantarm::jump; + funcs[PUSH_RIGHTDOWN] = &Giantarm::walk; + funcs[PUSH_LEFTDOWN] = &Giantarm::walk; + funcs[RELEASE_HAT] = &Giantarm::stop; + funcs[PUSH_A] = &Giantarm::punch; + funcs[PUSH_B] = &Giantarm::nop; + funcs[PUSH_C] = &Giantarm::nop; + funcs[PUSH_D] = &Giantarm::nop; + funcs[RELEASE_BUTTON] = &Giantarm::stop; +} + +void Giantarm::releaseHat() { + printInput("Class Giantarm [%s] :: RELEASE-HAT\n", name); + (this->*funcs[RELEASE_HAT])(); +} + +void Giantarm::pushLeft() { + printInput("Class Giantarm [%s] :: PUSH-LEFT\n", name); + (this->*funcs[PUSH_LEFT])(); +} + +void Giantarm::pushRight() { + printInput("Class Giantarm [%s] :: PUSH-RIGHT\n", name); + (this->*funcs[PUSH_RIGHT])(); +} + +void Giantarm::pushUp() { + printInput("Class Giantarm [%s] :: PUSH-UP\n", name); + (this->*funcs[PUSH_UP])(); +} + +void Giantarm::pushDown() { + printInput("Class Giantarm [%s] :: PUSH-DOWN\n", name); + //(this->*funcs[PUSH_RIGHTDOWN])(); + (this->*funcs[PUSH_A])(); +} + +void Giantarm::pushRightUp() { + printInput("Class Giantarm [%s] :: PUSH-RIGHT-UP\n", name); + (this->*funcs[PUSH_RIGHTUP])(); +} +void Giantarm::pushRightDown() { + printInput("Class Giantarm [%s] :: PUSH-RIGHT-DOWN\n", name); + (this->*funcs[PUSH_RIGHTDOWN])(); +} +void Giantarm::pushLeftUp() { + printInput("Class Giantarm [%s] :: PUSH-LEFT-UP\n", name); + (this->*funcs[PUSH_RIGHTUP])(); +} + +void Giantarm::pushLeftDown() { + printInput("Class Giantarm [%s] :: PUSH-LEFT-DOWN\n", name); + (this->*funcs[PUSH_LEFTDOWN])(); +} + +void Giantarm::pushA() { + printInput("Class Giantarm [%s] :: PUSH-A\n", name); + (this->*funcs[PUSH_A])(); +} + +void Giantarm::releaseA() { + printInput("Class Giantarm [%s] :: RELEASE-A\n", name); +} + +void Giantarm::pushB() { + printInput("Class Giantarm [%s] :: PUSH-B\n", name); + (this->*funcs[PUSH_B])(); +} + +void Giantarm::releaseB() { + printInput("Class Giantarm [%s] :: RELASE-B\n", name); +} + +void Giantarm::pushC() { + printInput("Class Giantarm [%s] :: PUSH-C\n", name); + (this->*funcs[PUSH_C])(); +} + +void Giantarm::releaseC() { + printInput("Class Giantarm [%s] :: RELEASE-C\n", name); +} + +void Giantarm::pushD() { + printInput("Class Giantarm [%s] :: PUSH-D\n", name); + (this->*funcs[PUSH_D])(); +} + +void Giantarm::releaseD() { + printInput("Class Giantarm [%s] :: RELEASE-D\n", name); +} + +void Giantarm::stackPush() { + stack[PUSH_LEFT] = funcs[PUSH_LEFT]; + stack[PUSH_RIGHT] = funcs[PUSH_RIGHT]; + stack[PUSH_UP] = funcs[PUSH_UP]; + stack[PUSH_DOWN] = funcs[PUSH_DOWN]; + stack[PUSH_RIGHTUP] = funcs[PUSH_RIGHTUP]; + stack[PUSH_LEFTUP] = funcs[PUSH_LEFTUP]; + stack[PUSH_RIGHTDOWN] = funcs[PUSH_RIGHTDOWN]; + stack[PUSH_LEFTDOWN] = funcs[PUSH_LEFTDOWN]; + stack[RELEASE_HAT] = funcs[RELEASE_HAT]; + stack[PUSH_A] = funcs[PUSH_A]; + stack[PUSH_B] = funcs[PUSH_B]; + stack[PUSH_C] = funcs[PUSH_C]; + stack[PUSH_D] = funcs[PUSH_D]; + stack[RELEASE_BUTTON] = funcs[RELEASE_BUTTON]; + + funcs[PUSH_LEFT] = &Giantarm::wait; + funcs[PUSH_RIGHT] = &Giantarm::wait; + funcs[PUSH_UP] = &Giantarm::wait; + funcs[PUSH_DOWN] = &Giantarm::wait; + funcs[PUSH_RIGHTUP] = &Giantarm::wait; + funcs[PUSH_LEFTUP] = &Giantarm::wait; + funcs[PUSH_RIGHTDOWN] = &Giantarm::wait; + funcs[PUSH_LEFTDOWN] = &Giantarm::wait; + funcs[RELEASE_HAT] = &Giantarm::wait; + funcs[PUSH_A] = &Giantarm::wait; + funcs[PUSH_B] = &Giantarm::wait; + funcs[PUSH_C] = &Giantarm::wait; + funcs[PUSH_D] = &Giantarm::wait; + funcs[RELEASE_BUTTON] = &Giantarm::wait; +} + +void Giantarm::stackPop() { + funcs[PUSH_LEFT] = stack[PUSH_LEFT]; + funcs[PUSH_RIGHT] = stack[PUSH_RIGHT]; + funcs[PUSH_UP] = stack[PUSH_UP]; + funcs[PUSH_DOWN] = stack[PUSH_DOWN]; + funcs[PUSH_RIGHTUP] = stack[PUSH_RIGHTUP]; + funcs[PUSH_LEFTUP] = stack[PUSH_LEFTUP]; + funcs[PUSH_RIGHTDOWN] = stack[PUSH_RIGHTDOWN]; + funcs[PUSH_LEFTDOWN] = stack[PUSH_LEFTDOWN]; + funcs[RELEASE_HAT] = stack[RELEASE_HAT]; + funcs[PUSH_A] = stack[PUSH_A]; + funcs[PUSH_B] = stack[PUSH_B]; + funcs[PUSH_C] = stack[PUSH_C]; + funcs[PUSH_D] = stack[PUSH_D]; + funcs[RELEASE_BUTTON] = stack[RELEASE_BUTTON]; +} + +/* Giantarmの各モーションを定義 */ + +void Giantarm::punch() { + float sinVal = sin(moveCount); + float cosVal = cos(moveCount); + double punch[6][3] = {{5.0,-30.0,-30.0},{10.0,-90.0,-90.0},{15.0,-90.0,60.0},{15.0,-90.0,60.0},{10.0,-90.0,-90.0},{0.0,0.0,0.0}}; + osg::Matrixd roteMatrix; + osg::Matrixd dirMatrix; + osg::Matrixd accMatrix; + + bodyForm->setMatrix(osg::Matrixf::rotate(osg::DegreesToRadians(punch[(int)moveCount%6][0]), osg::Vec3(0,0,1))); + rightUpperArmForm->setMatrix(osg::Matrixf::rotate(osg::DegreesToRadians(punch[(int)moveCount%6][1]), osg::Vec3(1,0,0))); + rightDownArmForm->setMatrix(osg::Matrixf::rotate(osg::DegreesToRadians(punch[(int)moveCount%6][2]), osg::Vec3(1,0,0))); + moveCount += 1; + //if(moveCount <= 0.5){ + //bodyForm->setMatrix(osg::Matrixf::rotate(osg::DegreesToRadians(sinVal*10.0), osg::Vec3(0,0,1))); + //rightUpperArmForm->setMatrix(osg::Matrixf::rotate(osg::DegreesToRadians(sinVal*60.0-90), osg::Vec3(1,0,0))); + //rightDownArmForm->setMatrix(osg::Matrixf::rotate(osg::DegreesToRadians(sinVal*60.0-20), osg::Vec3(1,0,0))); + //} +} + +void Giantarm::walk() { + velocity = osg::Vec3(0.5*avatarDirection,0,0); + moveCount += (float)avatarDirection * 0.5; + float sinVal = sin(moveCount); + float cosVal = cos(moveCount); + + setPos(osg::Vec3(position.x(), position.y(), position.z()+cos(moveCount)*0.01)); + + osg::Matrixd roteMatrix; + osg::Matrixd dirMatrix; + osg::Matrixd accMatrix; + + //positionAttitudeMatrix.setAttitude();での演算にくらべると、倍高速? + bodyForm->setMatrix(osg::Matrixf::rotate(osg::DegreesToRadians(sinVal*10.0), osg::Vec3(0,0,1))); + leftUpperArmForm->setMatrix(osg::Matrixf::rotate(osg::DegreesToRadians(sinVal*30.0+10), osg::Vec3(1,0,0))); + rightUpperArmForm->setMatrix(osg::Matrixf::rotate(osg::DegreesToRadians(sinVal*-30.0+10), osg::Vec3(1,0,0))); + //leftUpperLegForm->setMatrix(osg::Matrixf::rotate(osg::DegreesToRadians(sinVal*-45.0), osg::Vec3(1,0,0))); + //rightUpperLegForm->setMatrix(osg::Matrixf::rotate(osg::DegreesToRadians(sinVal*45.0), osg::Vec3(1,0,0))); + +} + +void Giantarm::turn() { + angularVelocity = osg::Vec3(0,0,osg::DegreesToRadians(180.0/10.0)); + motionTime = 10; + avatarDirection *= -1; + void (Giantarm::*tmp)() = funcs[PUSH_LEFT]; + funcs[PUSH_LEFT] = funcs[PUSH_RIGHT]; + funcs[PUSH_RIGHT] = tmp; + stackPush(); + unWaitFunc = &Giantarm::stop; + wait(); +} + +void Giantarm::jump() { + funcs[PUSH_UP] = &Giantarm::nop; + funcs[PUSH_RIGHTUP] = &Giantarm::nop; + funcs[PUSH_LEFTUP] = &Giantarm::nop; + velocity = osg::Vec3(velocity.x(), velocity.y(), 4); + acceleration = osg::Vec3(acceleration.x(), acceleration.y(), -0.3); +} + +void Giantarm::stop() { + moveCount = 0; + motionTime = 0; + velocity = osg::Vec3(0,0,0); + angularVelocity = osg::Vec3(0,0,0); +} + +void Giantarm::wait() { + if ((--motionTime) < 0) { + (this->*unWaitFunc)(); + unWaitFunc = &Giantarm::nop; + stackPop(); + } +} + +//以下、未実装 + +void Giantarm:: run() {}; +void Giantarm:: squat() {}; +void Giantarm:: down() {}; +void Giantarm:: freeze() {}; + +void Giantarm::frame() { + update(); +} + +void Giantarm::update() { + + //[当たり判定の処理] - 未実装,ただ判定を消すだけ + std::list::iterator iter; + for (iter = collisionNodeList.begin(); iter != collisionNodeList.end(); ++iter) { + (*iter)->setCollision(false); + } + + osg::Matrixd roteMatrix; + osg::Matrixd dirMatrix; + osg::Matrixd accMatrix; + + direction += angularVelocity; + velocity += acceleration; + + accMatrix.makeTranslate(acceleration); + roteMatrix.makeRotate( + osg::Quat( + direction.x(), osg::Vec3(1,0,0), + direction.y(), osg::Vec3(0,1,0), + direction.z(), osg::Vec3(0,0,1) + ) + ); + + velocity += (accMatrix*roteMatrix).getTrans(); + position += velocity; + + // 地面を抜けた場合 + if (position.z() < 0) { + position.z() = 0; + funcs[PUSH_UP] = &Giantarm::jump; + funcs[PUSH_RIGHTUP] = &Giantarm::jump; + funcs[PUSH_LEFTUP] = &Giantarm::jump; + velocity = osg::Vec3(velocity.x(), velocity.y(), 0); + acceleration = osg::Vec3(acceleration.x(), acceleration.y(), 0); + } + + accMatrix.makeTranslate(acceleration); + roteMatrix.makeRotate( + osg::Quat( + defaultDirection.x()+direction.x(), osg::Vec3(1,0,0), + defaultDirection.y()+direction.y(), osg::Vec3(0,1,0), + defaultDirection.z()+direction.z(), osg::Vec3(0,0,1) + ) + ); + + dirMatrix.makeTranslate(position); + accMatrix.makeScale(scale); + mform->setMatrix(accMatrix*roteMatrix*dirMatrix); +} \ No newline at end of file diff -r d45a95c697c3 -r 39e0c583e0a3 src/Giantarm.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/Giantarm.h Wed Feb 03 18:37:01 2010 +0900 @@ -0,0 +1,57 @@ +/* + * giantarm.h + * Martial + * + * Created by e075743 on 10/02/03. + * Copyright 2010 __MyCompanyName__. All rights reserved. + * + */ + +#ifndef _Giantarm_H_ +#define _Giantarm_H_ + +#include "Humanoid.h" + +class Giantarm : public Humanoid { +protected: + void (Giantarm::*funcs[14])(); + void (Giantarm::*stack[14])(); + void (Giantarm::*frameFunc)(); + void (Giantarm::*unWaitFunc)(); + virtual void walk(); + virtual void turn(); + virtual void jump(); + void punch(); + virtual void run(); + virtual void squat(); + virtual void down(); + virtual void wait(); + virtual void freeze(); + virtual void stop(); + virtual void update(); + virtual void stackPush(); + virtual void stackPop(); + virtual void nop() {}; //none operation +public: + Giantarm(char* _name = "Giantarm"); + virtual void frame(); + virtual void releaseHat(); + virtual void pushRight(); + virtual void pushLeft(); + virtual void pushUp(); + virtual void pushDown(); + virtual void pushRightUp(); + virtual void pushRightDown(); + virtual void pushLeftUp(); + virtual void pushLeftDown(); + virtual void pushA(); + virtual void releaseA(); + virtual void pushB(); + virtual void releaseB(); + virtual void pushC(); + virtual void releaseC(); + virtual void pushD(); + virtual void releaseD(); +}; + +#endif