Mercurial > hg > Members > e075743
annotate src/CollisionDetector.cpp @ 13:39e0c583e0a3 default tip
add GiantroboClassfile.
author | tokumoritaichirou@w-133-13-243-110.cc.u-ryukyu.ac.jp |
---|---|
date | Wed, 03 Feb 2010 18:37:01 +0900 |
parents | 5727d511a13a |
children |
rev | line source |
---|---|
10
5727d511a13a
add src in Martial Project Xcode.
tokumoritaichirou@nw0743.st.ie.u-ryukyu.ac.jp
parents:
diff
changeset
|
1 /* |
5727d511a13a
add src in Martial Project Xcode.
tokumoritaichirou@nw0743.st.ie.u-ryukyu.ac.jp
parents:
diff
changeset
|
2 * CollisionDetector.cpp |
5727d511a13a
add src in Martial Project Xcode.
tokumoritaichirou@nw0743.st.ie.u-ryukyu.ac.jp
parents:
diff
changeset
|
3 * Martial |
5727d511a13a
add src in Martial Project Xcode.
tokumoritaichirou@nw0743.st.ie.u-ryukyu.ac.jp
parents:
diff
changeset
|
4 * |
5727d511a13a
add src in Martial Project Xcode.
tokumoritaichirou@nw0743.st.ie.u-ryukyu.ac.jp
parents:
diff
changeset
|
5 * Created by ryoma on 10/01/26. |
5727d511a13a
add src in Martial Project Xcode.
tokumoritaichirou@nw0743.st.ie.u-ryukyu.ac.jp
parents:
diff
changeset
|
6 * Copyright 2010 琉球大学. All rights reserved. |
5727d511a13a
add src in Martial Project Xcode.
tokumoritaichirou@nw0743.st.ie.u-ryukyu.ac.jp
parents:
diff
changeset
|
7 * |
5727d511a13a
add src in Martial Project Xcode.
tokumoritaichirou@nw0743.st.ie.u-ryukyu.ac.jp
parents:
diff
changeset
|
8 */ |
5727d511a13a
add src in Martial Project Xcode.
tokumoritaichirou@nw0743.st.ie.u-ryukyu.ac.jp
parents:
diff
changeset
|
9 |
5727d511a13a
add src in Martial Project Xcode.
tokumoritaichirou@nw0743.st.ie.u-ryukyu.ac.jp
parents:
diff
changeset
|
10 #include "CollisionDetector.h" |
5727d511a13a
add src in Martial Project Xcode.
tokumoritaichirou@nw0743.st.ie.u-ryukyu.ac.jp
parents:
diff
changeset
|
11 |
5727d511a13a
add src in Martial Project Xcode.
tokumoritaichirou@nw0743.st.ie.u-ryukyu.ac.jp
parents:
diff
changeset
|
12 void CollisionDetector::addCollisionObject(CollisionObject* cobj) { |
5727d511a13a
add src in Martial Project Xcode.
tokumoritaichirou@nw0743.st.ie.u-ryukyu.ac.jp
parents:
diff
changeset
|
13 collisionObjectList.push_back(cobj); |
5727d511a13a
add src in Martial Project Xcode.
tokumoritaichirou@nw0743.st.ie.u-ryukyu.ac.jp
parents:
diff
changeset
|
14 } |
5727d511a13a
add src in Martial Project Xcode.
tokumoritaichirou@nw0743.st.ie.u-ryukyu.ac.jp
parents:
diff
changeset
|
15 |
5727d511a13a
add src in Martial Project Xcode.
tokumoritaichirou@nw0743.st.ie.u-ryukyu.ac.jp
parents:
diff
changeset
|
16 void CollisionDetector::detectCollision(CollisionNode* cn1, CollisionNode* cn2) { |
5727d511a13a
add src in Martial Project Xcode.
tokumoritaichirou@nw0743.st.ie.u-ryukyu.ac.jp
parents:
diff
changeset
|
17 cn1->setCollision(true); |
5727d511a13a
add src in Martial Project Xcode.
tokumoritaichirou@nw0743.st.ie.u-ryukyu.ac.jp
parents:
diff
changeset
|
18 cn2->setCollision(true); |
5727d511a13a
add src in Martial Project Xcode.
tokumoritaichirou@nw0743.st.ie.u-ryukyu.ac.jp
parents:
diff
changeset
|
19 } |
5727d511a13a
add src in Martial Project Xcode.
tokumoritaichirou@nw0743.st.ie.u-ryukyu.ac.jp
parents:
diff
changeset
|
20 |
5727d511a13a
add src in Martial Project Xcode.
tokumoritaichirou@nw0743.st.ie.u-ryukyu.ac.jp
parents:
diff
changeset
|
21 void CollisionDetector::checkCollision(CollisionObject* co1, CollisionObject* co2) { |
5727d511a13a
add src in Martial Project Xcode.
tokumoritaichirou@nw0743.st.ie.u-ryukyu.ac.jp
parents:
diff
changeset
|
22 std::list<CollisionNode*> collisionNodeList1, collisionNodeList2; |
5727d511a13a
add src in Martial Project Xcode.
tokumoritaichirou@nw0743.st.ie.u-ryukyu.ac.jp
parents:
diff
changeset
|
23 collisionNodeList1 = co1->getCollisionNodeList(); |
5727d511a13a
add src in Martial Project Xcode.
tokumoritaichirou@nw0743.st.ie.u-ryukyu.ac.jp
parents:
diff
changeset
|
24 collisionNodeList2 = co2->getCollisionNodeList(); |
5727d511a13a
add src in Martial Project Xcode.
tokumoritaichirou@nw0743.st.ie.u-ryukyu.ac.jp
parents:
diff
changeset
|
25 osg::NodePath npl1 , npl2; |
5727d511a13a
add src in Martial Project Xcode.
tokumoritaichirou@nw0743.st.ie.u-ryukyu.ac.jp
parents:
diff
changeset
|
26 osg::Matrix m1, m2; |
5727d511a13a
add src in Martial Project Xcode.
tokumoritaichirou@nw0743.st.ie.u-ryukyu.ac.jp
parents:
diff
changeset
|
27 std::list<CollisionNode*>::iterator node1, node2; |
5727d511a13a
add src in Martial Project Xcode.
tokumoritaichirou@nw0743.st.ie.u-ryukyu.ac.jp
parents:
diff
changeset
|
28 for(node1 = collisionNodeList1.begin(); node1 != collisionNodeList1.end(); ++node1) { |
5727d511a13a
add src in Martial Project Xcode.
tokumoritaichirou@nw0743.st.ie.u-ryukyu.ac.jp
parents:
diff
changeset
|
29 for(node2 = collisionNodeList2.begin(); node2 != collisionNodeList2.end(); ++node2) { |
5727d511a13a
add src in Martial Project Xcode.
tokumoritaichirou@nw0743.st.ie.u-ryukyu.ac.jp
parents:
diff
changeset
|
30 npl1 = (*node1)->getNodePath(); |
5727d511a13a
add src in Martial Project Xcode.
tokumoritaichirou@nw0743.st.ie.u-ryukyu.ac.jp
parents:
diff
changeset
|
31 npl2 = (*node2)->getNodePath(); |
5727d511a13a
add src in Martial Project Xcode.
tokumoritaichirou@nw0743.st.ie.u-ryukyu.ac.jp
parents:
diff
changeset
|
32 //衝突判定 |
5727d511a13a
add src in Martial Project Xcode.
tokumoritaichirou@nw0743.st.ie.u-ryukyu.ac.jp
parents:
diff
changeset
|
33 m1 = osg::computeLocalToWorld(npl1); |
5727d511a13a
add src in Martial Project Xcode.
tokumoritaichirou@nw0743.st.ie.u-ryukyu.ac.jp
parents:
diff
changeset
|
34 m2 = osg::computeLocalToWorld(npl2); |
5727d511a13a
add src in Martial Project Xcode.
tokumoritaichirou@nw0743.st.ie.u-ryukyu.ac.jp
parents:
diff
changeset
|
35 if ((*node1)->getBound(m1).intersects((*node2)->getBound(m2))) { |
5727d511a13a
add src in Martial Project Xcode.
tokumoritaichirou@nw0743.st.ie.u-ryukyu.ac.jp
parents:
diff
changeset
|
36 if (Martial::TEST::SHOW_COLLISION) printf("collision!! %s->[%s] & %s->[%s]\n", co1->getName(), (*node1)->getName(), |
5727d511a13a
add src in Martial Project Xcode.
tokumoritaichirou@nw0743.st.ie.u-ryukyu.ac.jp
parents:
diff
changeset
|
37 co2->getName(), (*node2)->getName()); |
5727d511a13a
add src in Martial Project Xcode.
tokumoritaichirou@nw0743.st.ie.u-ryukyu.ac.jp
parents:
diff
changeset
|
38 detectCollision(*node1, *node2); |
5727d511a13a
add src in Martial Project Xcode.
tokumoritaichirou@nw0743.st.ie.u-ryukyu.ac.jp
parents:
diff
changeset
|
39 } |
5727d511a13a
add src in Martial Project Xcode.
tokumoritaichirou@nw0743.st.ie.u-ryukyu.ac.jp
parents:
diff
changeset
|
40 } |
5727d511a13a
add src in Martial Project Xcode.
tokumoritaichirou@nw0743.st.ie.u-ryukyu.ac.jp
parents:
diff
changeset
|
41 } |
5727d511a13a
add src in Martial Project Xcode.
tokumoritaichirou@nw0743.st.ie.u-ryukyu.ac.jp
parents:
diff
changeset
|
42 } |
5727d511a13a
add src in Martial Project Xcode.
tokumoritaichirou@nw0743.st.ie.u-ryukyu.ac.jp
parents:
diff
changeset
|
43 |
5727d511a13a
add src in Martial Project Xcode.
tokumoritaichirou@nw0743.st.ie.u-ryukyu.ac.jp
parents:
diff
changeset
|
44 void CollisionDetector::frame() { |
5727d511a13a
add src in Martial Project Xcode.
tokumoritaichirou@nw0743.st.ie.u-ryukyu.ac.jp
parents:
diff
changeset
|
45 std::list<CollisionObject*>::iterator iter1, iter2; |
5727d511a13a
add src in Martial Project Xcode.
tokumoritaichirou@nw0743.st.ie.u-ryukyu.ac.jp
parents:
diff
changeset
|
46 iter1 = collisionObjectList.begin(); |
5727d511a13a
add src in Martial Project Xcode.
tokumoritaichirou@nw0743.st.ie.u-ryukyu.ac.jp
parents:
diff
changeset
|
47 iter2 = iter1; |
5727d511a13a
add src in Martial Project Xcode.
tokumoritaichirou@nw0743.st.ie.u-ryukyu.ac.jp
parents:
diff
changeset
|
48 float length; |
5727d511a13a
add src in Martial Project Xcode.
tokumoritaichirou@nw0743.st.ie.u-ryukyu.ac.jp
parents:
diff
changeset
|
49 osg::Vec3 v1, v2; |
5727d511a13a
add src in Martial Project Xcode.
tokumoritaichirou@nw0743.st.ie.u-ryukyu.ac.jp
parents:
diff
changeset
|
50 |
5727d511a13a
add src in Martial Project Xcode.
tokumoritaichirou@nw0743.st.ie.u-ryukyu.ac.jp
parents:
diff
changeset
|
51 for(++iter1; iter1 != collisionObjectList.end(); ++iter1) { |
5727d511a13a
add src in Martial Project Xcode.
tokumoritaichirou@nw0743.st.ie.u-ryukyu.ac.jp
parents:
diff
changeset
|
52 length = ((*iter1)->getPos()-(*iter2)->getPos()).length(); |
5727d511a13a
add src in Martial Project Xcode.
tokumoritaichirou@nw0743.st.ie.u-ryukyu.ac.jp
parents:
diff
changeset
|
53 if (length <= 3.0) { |
5727d511a13a
add src in Martial Project Xcode.
tokumoritaichirou@nw0743.st.ie.u-ryukyu.ac.jp
parents:
diff
changeset
|
54 if (Martial::TEST::SHOW_COLLISION) printf("%s close to %s (%.3f), check collision..\n", (*iter2)->getName(), (*iter1)->getName(), length); |
5727d511a13a
add src in Martial Project Xcode.
tokumoritaichirou@nw0743.st.ie.u-ryukyu.ac.jp
parents:
diff
changeset
|
55 checkCollision(*iter1, *iter2); |
5727d511a13a
add src in Martial Project Xcode.
tokumoritaichirou@nw0743.st.ie.u-ryukyu.ac.jp
parents:
diff
changeset
|
56 } |
5727d511a13a
add src in Martial Project Xcode.
tokumoritaichirou@nw0743.st.ie.u-ryukyu.ac.jp
parents:
diff
changeset
|
57 iter2 = iter1; |
5727d511a13a
add src in Martial Project Xcode.
tokumoritaichirou@nw0743.st.ie.u-ryukyu.ac.jp
parents:
diff
changeset
|
58 } |
5727d511a13a
add src in Martial Project Xcode.
tokumoritaichirou@nw0743.st.ie.u-ryukyu.ac.jp
parents:
diff
changeset
|
59 } |
5727d511a13a
add src in Martial Project Xcode.
tokumoritaichirou@nw0743.st.ie.u-ryukyu.ac.jp
parents:
diff
changeset
|
60 /* |
5727d511a13a
add src in Martial Project Xcode.
tokumoritaichirou@nw0743.st.ie.u-ryukyu.ac.jp
parents:
diff
changeset
|
61 startFrameTick = osg::Timer::instance()->tick(); |
5727d511a13a
add src in Martial Project Xcode.
tokumoritaichirou@nw0743.st.ie.u-ryukyu.ac.jp
parents:
diff
changeset
|
62 |
5727d511a13a
add src in Martial Project Xcode.
tokumoritaichirou@nw0743.st.ie.u-ryukyu.ac.jp
parents:
diff
changeset
|
63 //SceneGraphの走査 -> 座標計算, 衝突判定 |
5727d511a13a
add src in Martial Project Xcode.
tokumoritaichirou@nw0743.st.ie.u-ryukyu.ac.jp
parents:
diff
changeset
|
64 //衝突処理はcheckCollision内部で行なう?(未実装) |
5727d511a13a
add src in Martial Project Xcode.
tokumoritaichirou@nw0743.st.ie.u-ryukyu.ac.jp
parents:
diff
changeset
|
65 for(mobIter = movableObjectList.begin(); mobIter != movableObjectList.end(); ++mobIter) { |
5727d511a13a
add src in Martial Project Xcode.
tokumoritaichirou@nw0743.st.ie.u-ryukyu.ac.jp
parents:
diff
changeset
|
66 (*mobIter)->reload(); |
5727d511a13a
add src in Martial Project Xcode.
tokumoritaichirou@nw0743.st.ie.u-ryukyu.ac.jp
parents:
diff
changeset
|
67 //このcheckCollisionは、後に削除 |
5727d511a13a
add src in Martial Project Xcode.
tokumoritaichirou@nw0743.st.ie.u-ryukyu.ac.jp
parents:
diff
changeset
|
68 //CollisionDetectorクラスを定義し、そこでcheckCollsionすることに |
5727d511a13a
add src in Martial Project Xcode.
tokumoritaichirou@nw0743.st.ie.u-ryukyu.ac.jp
parents:
diff
changeset
|
69 (*mobIter)->checkCollision(); |
5727d511a13a
add src in Martial Project Xcode.
tokumoritaichirou@nw0743.st.ie.u-ryukyu.ac.jp
parents:
diff
changeset
|
70 } |
5727d511a13a
add src in Martial Project Xcode.
tokumoritaichirou@nw0743.st.ie.u-ryukyu.ac.jp
parents:
diff
changeset
|
71 */ |