Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: orxonox.OLD/branches/single_player_map/src/lib/collision_reaction/cr_physics_ground_walk.cc @ 8863

Last change on this file since 8863 was 8863, checked in by patrick, 18 years ago

reverted the collision reaction

File size: 4.7 KB
Line 
1/*
2   orxonox - the future of 3D-vertical-scrollers
3
4   Copyright (C) 2004 orx
5
6   This program is free software; you can redistribute it and/or modify
7   it under the terms of the GNU General Public License as published by
8   the Free Software Foundation; either version 2, or (at your option)
9   any later version.
10
11   ### File Specific:
12   main-programmer: Patrick Boenzli
13   co-programmer: ...
14*/
15
16#define DEBUG_SPECIAL_MODULE DEBUG_MODULE_COLLISION_REACTION
17
18#include "collision.h"
19#include "collision_event.h"
20
21#include "physics_interface.h"
22
23#include "world_entity.h"
24#include "cr_physics_ground_walk.h"
25
26#include <vector>
27
28#include "debug.h"
29
30#include "aabb.h"
31
32using namespace std;
33
34
35/**
36 *  standard constructor
37 */
38CRPhysicsGroundWalk::CRPhysicsGroundWalk ()
39    : CollisionReaction()
40{
41  this->setClassID(CL_CR_PHYSICS_GROUND_WALK, "CRPhysicsGroundWalk");
42}
43
44
45/**
46 *  standard deconstructor
47 */
48CRPhysicsGroundWalk::~CRPhysicsGroundWalk ()
49{}
50
51
52/**
53 * caluculates and applys the reaction to a specific collision
54 *  @param collision the collision
55 */
56void CRPhysicsGroundWalk::reactToCollision(Collision* collision)
57{
58  CollisionEvent* ce = collision->getCollisionEvents().front();
59  Vector normal = ce->getGroundNormal();
60  // normal.normalize();
61
62  // put it back
63  //   PRINTF(0)("putting it back to lastPos: \n");
64  //   this->lastPositions[0].debug();
65  //   PRINTF(0)("current pos:\n");
66  //   collision->getEntityB()->getAbsCoor().debug();
67
68  Vector height;
69  AABB* box = collision->getEntityB()->getModelAABB();
70  WorldEntity* entity = collision->getEntityB();
71
72  float CR_MAX_WALK_HEIGHT = 2.0f;
73  float CR_THRESHOLD = 0.2f;
74
75//   if( box != NULL)
76//   {
77//
78//     Vector collPos =  collision->getEntityB()->getAbsCoor()  + box->center - ce->getCollisionPosition();
79//     height = collPos.y - box->halfLength[1];
80//
81//     PRINTF(0)("height: %f          , model height: %f\n", height, box->halfLength[1]);
82//     PRINTF(0)(" ground normal: %f, %f, %f\n", normal.x, normal.y, normal.z);
83//
84//     // object is beneath the plane (ground)
85//     if( height < 0.0f )
86//     {
87//       entity->shiftCoor(Vector(0, -height, 0));
88//     }
89//     // object is already in the wall
90//     else if( ce->isInWall())
91//     {
92//
93//     }
94//
95//
96//
97//   }
98
99
100
101
102
103// #if 0
104  if( box != NULL)
105    height = ( ce->getCollisionPosition() - collision->getEntityB()->getAbsCoor() )*(-1.0f) ;
106  else
107    height = ce->getCollisionPosition() - collision->getEntityB()->getAbsCoor() ;
108
109
110  if( box != NULL) {
111
112
113    if(ce->getCollisionPosition().x <= 0.9 && ce->getGroundNormal().len() <= 1.4f) {
114      collision->getEntityB()->setAbsCoor(collision->getEntityB()->getLastAbsCoor());
115      return;
116    }
117    if(ce->getCollisionPosition().z <= 0.9 && ce->getGroundNormal().len() <= 1.4f) {
118      collision->getEntityB()->setAbsCoor(collision->getEntityB()->getLastAbsCoor());
119      return;
120    }
121
122    if(ce->getGroundNormal().len() <= 0.1f) {
123      collision->getEntityB()->setAbsCoor(collision->getEntityB()->getLastAbsCoor());
124      return;
125    }
126
127
128    if(ce->getGroundNormal().len() >= 1.4f) {
129      downspeed++;
130      collision->getEntityB()->setAbsCoor(collision->getEntityB()->getAbsCoor() + Vector(0.0,-0.08*downspeed,0.0));
131      return;
132    }
133
134
135    if(height.y > box->halfLength[1] + 0.0f ) // Above ground
136    {
137      if(height.y < box->halfLength[1] + 2.3f) // Snap in
138      {
139        downspeed = 0;
140        collision->getEntityB()->setAbsCoor(collision->getEntityB()->getAbsCoor() - Vector(0.0,height.- box->halfLength[1] - 0.0f,0.0));
141      } else
142      {
143        downspeed++;
144        collision->getEntityB()->setAbsCoor(collision->getEntityB()->getAbsCoor() + Vector(0.0,-0.08*downspeed,0.0));
145      }
146
147    }
148    else {
149      if(height.y <  box->halfLength[1] + 0.0f   /* && height.y  >  - 55.0f*/) // below ground
150      {
151        //if(downspeed <= 0) downspeed =1;
152        collision->getEntityB()->setAbsCoor(collision->getEntityB()->getAbsCoor() + Vector(0.0, -height.+  box->halfLength[1] + 2.0f,0.0));
153        //collision->getEntityB()->setVelocity(Vector(0.0,0.0,0.0));
154        downspeed = 0;
155      }
156
157    }
158
159  }// if(box!= NULL)
160// #endif
161  /*
162  PRINTF(0)("Collision with Ground: \n");
163  collision->getEntityB()->getAbsCoor().debug();
164  collision->getEntityB()->setVelocity(Vector());
165  collision->getEntityB()->setAbsCoor(this->lastPositions[1]);
166
167  */
168
169}
170
171
172
173
174/**
175 * use this to do some collision offline calculations, only called for bContinuousPoll == true
176 */
177void CRPhysicsGroundWalk::update(WorldEntity* owner)
178{
179  for( int i = 9; i > 0; i--) {
180    this->lastPositions[i] = this->lastPositions[i-1];
181    //     PRINTF(0)("lastPosition[%i]: %f, %f, %f\n", i, lastPositions[i].x, lastPositions[i].y, lastPositions[i].z);
182  }
183  this->lastPositions[0] = owner->getAbsCoor();
184}
185
186
Note: See TracBrowser for help on using the repository browser.