Mercurial > hg > Members > e075743
view src/CollisionDetector.cpp @ 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
/* * CollisionDetector.cpp * Martial * * Created by ryoma on 10/01/26. * Copyright 2010 琉球大学. All rights reserved. * */ #include "CollisionDetector.h" void CollisionDetector::addCollisionObject(CollisionObject* cobj) { collisionObjectList.push_back(cobj); } void CollisionDetector::detectCollision(CollisionNode* cn1, CollisionNode* cn2) { cn1->setCollision(true); cn2->setCollision(true); } void CollisionDetector::checkCollision(CollisionObject* co1, CollisionObject* co2) { std::list<CollisionNode*> collisionNodeList1, collisionNodeList2; collisionNodeList1 = co1->getCollisionNodeList(); collisionNodeList2 = co2->getCollisionNodeList(); osg::NodePath npl1 , npl2; osg::Matrix m1, m2; std::list<CollisionNode*>::iterator node1, node2; for(node1 = collisionNodeList1.begin(); node1 != collisionNodeList1.end(); ++node1) { for(node2 = collisionNodeList2.begin(); node2 != collisionNodeList2.end(); ++node2) { npl1 = (*node1)->getNodePath(); npl2 = (*node2)->getNodePath(); //衝突判定 m1 = osg::computeLocalToWorld(npl1); m2 = osg::computeLocalToWorld(npl2); if ((*node1)->getBound(m1).intersects((*node2)->getBound(m2))) { if (Martial::TEST::SHOW_COLLISION) printf("collision!! %s->[%s] & %s->[%s]\n", co1->getName(), (*node1)->getName(), co2->getName(), (*node2)->getName()); detectCollision(*node1, *node2); } } } } void CollisionDetector::frame() { std::list<CollisionObject*>::iterator iter1, iter2; iter1 = collisionObjectList.begin(); iter2 = iter1; float length; osg::Vec3 v1, v2; for(++iter1; iter1 != collisionObjectList.end(); ++iter1) { length = ((*iter1)->getPos()-(*iter2)->getPos()).length(); if (length <= 3.0) { if (Martial::TEST::SHOW_COLLISION) printf("%s close to %s (%.3f), check collision..\n", (*iter2)->getName(), (*iter1)->getName(), length); checkCollision(*iter1, *iter2); } iter2 = iter1; } } /* startFrameTick = osg::Timer::instance()->tick(); //SceneGraphの走査 -> 座標計算, 衝突判定 //衝突処理はcheckCollision内部で行なう?(未実装) for(mobIter = movableObjectList.begin(); mobIter != movableObjectList.end(); ++mobIter) { (*mobIter)->reload(); //このcheckCollisionは、後に削除 //CollisionDetectorクラスを定義し、そこでcheckCollsionすることに (*mobIter)->checkCollision(); } */