view src/Robot.cpp.orig @ 10:5727d511a13a

add src in Martial Project Xcode.
author tokumoritaichirou@nw0743.st.ie.u-ryukyu.ac.jp
date Wed, 03 Feb 2010 03:39:04 +0900
parents
children
line wrap: on
line source

/*
 *  Robot.cpp
 *  Martial
 *
 *  Created by ryoma on 10/01/23.
 *  Copyright 2010 琉球大学. All rights reserved.
 *
 */

#include "Robot.h"

Robot::Robot(char* _name) : Character::Character(_name) {
	name = _name;
	moveCount = 0.0;
	moveFlag = 0;

	reloadFunc = &Robot::reload;

	RobotNode = new osg::Group();
	body = osgDB::readNodeFile("robot_body.osg");

	leftArm = osgDB::readNodeFile("robot_l_arm.osg");
	rightArm = osgDB::readNodeFile("robot_r_arm.osg");
	leftLeg = osgDB::readNodeFile("robot_l_leg.osg");
	rightLeg = osgDB::readNodeFile("robot_r_leg.osg");

//	SearchMatrixTransformVisitor* visitor = new SearchMatrixTransformVisitor("Mesh133004__Black_");
//	body->accept(*visitor);
//	hoge = visitor->getMatrixTransform();

	if( hoge != NULL ) {
		std::cout << "Success!! Matrix name is [" << hoge->getName() << "]\n";
	} else {
		puts("False......");
	}

	bodyForm = new osg::PositionAttitudeTransform();	
	leftArmForm = new osg::PositionAttitudeTransform();
	rightArmForm = new osg::PositionAttitudeTransform();
	leftLegForm = new osg::PositionAttitudeTransform();
	rightLegForm = new osg::PositionAttitudeTransform();

	//ロボットの組み立て

	bodyForm->addChild(body);
	leftArmForm->addChild(leftArm);
	rightArmForm->addChild(rightArm);
	leftLegForm->addChild(leftLeg);
	rightLegForm->addChild(rightLeg);

	mform->addChild(bodyForm);
	bodyForm->addChild(leftArmForm);
	bodyForm->addChild(rightArmForm);
	bodyForm->addChild(leftLegForm);
	bodyForm->addChild(rightLegForm);

	//微調整。 ここはモデリングツールでやろうよ。。まじで。。

	bodyForm->setPosition(osg::Vec3(0.0,0.0,1.5));
	leftArmForm->setPosition(osg::Vec3(0.5,-0.3,0.2));
	rightArmForm->setPosition(osg::Vec3(-0.5,-0.3,0.2));
	leftLegForm->setPosition(osg::Vec3(0.2,0,-1.2));
	rightLegForm->setPosition(osg::Vec3(-0.2,0,-1.2));

	//衝突判定ノードの追加

	CollisionNode* collisionNode = new CollisionNode("Body-Node", new osg::Cylinder(osg::Vec3(0, 0, 0), 0.4, 2.5));
	bodyForm->addChild(collisionNode->getNode());
	collisionNodeList.push_back(collisionNode);

	collisionNode = new CollisionNode("Left-Arm-Node", new osg::Sphere(osg::Vec3(0, 0, 0), 0.3));
	leftArmForm->addChild(collisionNode->getNode());
	collisionNodeList.push_back(collisionNode);

	collisionNode = new CollisionNode("Right-Arm-Node", new osg::Sphere(osg::Vec3(0, 0, 0), 0.3));
	rightArmForm->addChild(collisionNode->getNode());
	collisionNodeList.push_back(collisionNode);
	
	collisionNode = new CollisionNode("Left-Leg-Node", new osg::Sphere(osg::Vec3(0, 0, 0), 0.3));
	leftLegForm->addChild(collisionNode->getNode());
	collisionNodeList.push_back(collisionNode);

	collisionNode = new CollisionNode("Right-Leg-Node", new osg::Sphere(osg::Vec3(0, 0, 0), 0.3));
	rightLegForm->addChild(collisionNode->getNode());
	collisionNodeList.push_back(collisionNode);	

	reload();
}

void Robot::pushLeft() {
	printf("Class Robott [%s] :: PUSH-LEFT\n", name);
	moveFlag = 1;
	setVel(osg::Vec3(1.0,0.0,0.0));
}

void Robot::releaseLeft() {
	printf("Class Robott [%s] :: RELEASE-LEFT\n", name);
	moveFlag = 0;
	setVel(osg::Vec3(0,0.0,0.0));
}

void Robot::pushRight() {
	printf("Class Robott [%s] :: PUSH-RIGHT\n", name);
	moveFlag = 1;
	setVel(osg::Vec3(-1.0,0.0,0.0));
}

void Robot::releaseRight() {
	printf("Class Robott [%s] :: RELASE-RIGHT\n", name);
	moveFlag = 0;
	setVel(osg::Vec3(0,0.0,0.0));
}

void Robot::pushUp() {
	printf("Class Robott [%s] :: PUSH-UP\n", name);
}

void Robot::releaseUp() {
	printf("Class Robott [%s] :: RELEASE-UP\n", name);
}

void Robot::pushDown() {
	printf("Class Robott [%s] :: PUSH-DOWN\n", name);
}

void Robot::releaseDown() {
	printf("Class Robott [%s] :: RELEASE-DOWN\n", name);
}



void Robot::pushA() {
	printf("Class Robott [%s] :: PUSH-A\n", name);
	moveFlag = 1;
	setVel(osg::Vec3(1.0,0.0,0.0));
}

void Robot::releaseA() {
	printf("Class Robott [%s] :: RELEASE-A\n", name);
	moveFlag = 0;
	setVel(osg::Vec3(0,0.0,0.0));
}

void Robot::pushB() {
	printf("Class Robott [%s] :: PUSH-B\n", name);
	turn();
}

void Robot::releaseB() {
	printf("Class Robott [%s] :: RELASE-B\n", name);
	moveFlag = 0;
	setVel(osg::Vec3(0,0.0,0.0));
}

void Robot::pushC() {
	printf("Class Robott [%s] :: PUSH-C\n", name);
}

void Robot::releaseC() {
	printf("Class Robott [%s] :: RELEASE-C\n", name);
}

void Robot::pushD() {
	printf("Class Robott [%s] :: PUSH-D\n", name);
}

void Robot::releaseD() {
	printf("Class Robott [%s] :: RELEASE-D\n", name);
}

void Robot::walk() {
	printf("walk");
	moveFlag = 1;
	setVel(osg::Vec3(-5.0,0.0,0.0));
}

void Robot::turn() {
	angularVelocity = osg::Vec3(angularVelocity.x(), angularVelocity.y(), 0.1);
}

void Robot::stop() {
	velocity = osg::Vec3(0,0,0);
	angularVelocity = osg::Vec3(0,0,0);
}


void Robot::reload() {
	moveCount += (float)moveFlag * 0.5;
	float sinVal = sin(moveCount);
	float cosVal = cos(moveCount);

	if (moveFlag != 0) setPos(osg::Vec3(position.x(), position.y(), position.z()+cos(moveCount)*0.01));
	
	bodyForm->setAttitude(osg::Quat(osg::DegreesToRadians(sinVal*10.0), osg::Vec3(0,0,1)));
	leftArmForm->setAttitude(osg::Quat(osg::DegreesToRadians(sinVal*30.0+10.0), osg::Vec3(1,0,0)));
	rightArmForm->setAttitude(osg::Quat(osg::DegreesToRadians(-sinVal*30.0+10.0), osg::Vec3(1,0,0)));
	leftLegForm->setAttitude(osg::Quat(osg::DegreesToRadians(-sinVal*45.0), osg::Vec3(1,0,0)));
	rightLegForm->setAttitude(osg::Quat(osg::DegreesToRadians(sinVal*45.0), osg::Vec3(1,0,0)));

	//位置の再計算は親クラスのreloadと一緒なのでまかせたい..けどなぜかできない
	// Character::reload(); (MovableObject::reload())
	osg::Matrixd roteMatrix;
	osg::Matrixd dirMatrix;
	osg::Matrixd accMatrix;

	direction += angularVelocity;
	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;

	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);
}