Changeset 1613 for trunk/test


Ignore:
Timestamp:
Jul 9, 2012, 3:12:57 PM (8 years ago)
Author:
touky
Message:

BtPhysTest : Container box now moves.

Location:
trunk/test
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/test/BtPhysTest.cpp

    r1607 r1613  
    7474        vec3 NewGravity = vec3(.0f, -10.0f, .0f);
    7575        m_simulation->SetGravity(NewGravity);
    76 
    77         float offset = 30.f;
     76        m_simulation->SetContinuousDetection(true);
     77
     78        float offset = 29.5f;
    7879        vec3 pos_offset = vec3(.0f, 30.f, .0f);
    7980        for (int i=0; i < 6; i++)
    8081        {
     82                vec3 NewPosition = vec3(.0f);
     83                quat NewRotation = quat(1.f);
     84
     85                PhysicsObject* NewPhyobj = new PhysicsObject(m_simulation, NewPosition, NewRotation);
     86
    8187                int idx = i/2;
    82                 vec3 NewPosition = pos_offset;
     88                NewPosition = pos_offset;
    8389                NewPosition[idx] += offset;
    8490                offset *= -1.f;
    8591
    86                 quat NewRotation = quat(mat4(1.f));
    87                 PhysicsObject* NewPhyobj = new PhysicsObject(m_simulation, NewPosition, NewRotation);
    88 
    8992                if (idx != 1)
    9093                {
    9194                        vec3 axis = vec3(.0f);
    92                         axis[idx] = 1;
     95                        axis[2 - idx] = 1;
    9396                        NewRotation = quat::rotate(90.f, axis);
    9497                }
     
    99102        }
    100103
    101         for (int x=0; x < 5; x++)
    102         {
    103                 for (int y=0; y < 5; y++)
    104                 {
    105                         for (int z=0; z < 4; z++)
     104        for (int x=0; x < 6; x++)
     105        {
     106                for (int y=0; y < 6; y++)
     107                {
     108                        for (int z=0; z < 5; z++)
    106109                        {
    107110                                PhysicsObject* new_physobj = new PhysicsObject(m_simulation, 10.f,
    108                                         vec3(-20.f, 40.f, -20.f) +
     111                                        vec3(-20.f, 20.f, -20.f) +
    109112                                        vec3(4.f * (float)x, 4.f * (float)y, 4.f * (float)z));
    110113                                m_physobj_list << new_physobj;
     
    269272        m_simulation->TickContext(seconds);
    270273
    271         vec3 barycenter = vec3(.0f);
     274        vec3 GroundBarycenter = vec3(.0f);
     275        vec3 PhysObjBarycenter = vec3(.0f);
    272276        float factor = .0f;
     277       
    273278        for (int i = 0; i < m_ground_list.Count(); i++)
    274279        {
    275280                PhysicsObject* PhysObj = m_ground_list[i];
    276 
    277281                mat4 GroundMat = PhysObj->GetTransform();
    278                 vec3 CenterToGround = GroundMat.v3.xyz - vec3(.0f, 50.f, .0f);
    279                 vec3 CenterToCam = m_camera->m_position - vec3(.0f, 50.f, .0f);
    280                 if (dot(CenterToCam, CenterToGround) > .0f)
     282
     283                GroundBarycenter += GroundMat.v3.xyz;
     284                factor += 1.f;
     285        }
     286
     287        GroundBarycenter /= factor;
     288
     289        for (int i = 0; i < m_ground_list.Count(); i++)
     290        {
     291                PhysicsObject* PhysObj = m_ground_list[i];
     292
     293                mat4 GroundMat = PhysObj->GetTransform();
     294                vec3 CenterToGround = GroundMat.v3.xyz - GroundBarycenter;
     295                vec3 CenterToCam = m_camera->m_position - GroundBarycenter;
     296                vec3 CamDir = m_camera->m_position - m_camera->GetTarget();
     297
     298                if (dot(normalize(CenterToGround), normalize(CenterToCam)) > .0f &&
     299                        dot(normalize(CenterToGround), normalize(CamDir)) > .0f)
    281300                        PhysObj->SetRender(false);
    282301                else
    283302                        PhysObj->SetRender(true);
    284 
    285                 barycenter += GroundMat.v3.xyz;
     303        }
     304
     305        for (int i = 0; i < m_ground_list.Count(); i++)
     306        {
     307                PhysicsObject* PhysObj = m_ground_list[i];
     308
     309                mat4 GroundMat = PhysObj->GetTransform();
     310                mat4 CenterMx = mat4::translate(GroundBarycenter);
     311                GroundMat = inverse(CenterMx) * GroundMat;
     312                GroundMat = CenterMx *
     313                                        mat4(quat::fromeuler_xyz(vec3(.0f, 20.f, 20.0f) * seconds))
     314                                        * GroundMat;
     315                PhysObj->SetTransform(GroundMat.v3.xyz, quat(GroundMat));
     316        }
     317
     318        PhysObjBarycenter = vec3(.0f);
     319        for (int i = 0; i < m_physobj_list.Count(); i++)
     320        {
     321                PhysicsObject* PhysObj = m_physobj_list[i];
     322                mat4 GroundMat = PhysObj->GetTransform();
     323
     324                PhysObjBarycenter += GroundMat.v3.xyz;
    286325                factor += 1.f;
    287326        }
    288327
    289         barycenter /= factor;
    290 
    291         for (int i = 0; i < m_ground_list.Count(); i++)
    292         {
    293                 PhysicsObject* PhysObj = m_ground_list[i];
    294 
    295                 mat4 GroundMat = PhysObj->GetTransform();
    296                 mat4 CenterMx = mat4::translate(barycenter);
    297                 //GroundMat = inverse(CenterMx) * GroundMat;
    298                 //GroundMat = CenterMx * GroundMat;
    299                                         //mat4(quat::rotate(seconds * 10.0f, vec3(0, 1, 0))) * CenterMx;
    300                 //PhysObj->SetTransform(GroundMat.v3.xyz, quat(GroundMat));
    301         }
    302 
    303         m_camera->SetTarget(barycenter);
    304         m_camera->SetPosition(vec3(-40.0f, 60.0f, -40.0f));
     328        PhysObjBarycenter /= factor;
     329
     330        m_camera->SetTarget(PhysObjBarycenter);
     331        m_camera->SetPosition(GroundBarycenter + normalize(GroundBarycenter - PhysObjBarycenter) * 60.0f);
    305332
    306333#if 0
  • trunk/test/PhysicObject.h

    r1607 r1613  
    2525                : m_ready(false), m_should_render(true)
    2626        {
    27                 m_mesh.Compile("[sc#add afcb60 1 60 -.1]");
     27                m_mesh.Compile("[sc#ddd afcb60 1 60 -.1]");
    2828                vec3 BoxSize = vec3(60.f, 1.f, 60.f);
    2929                m_physics.SetShapeToBox(BoxSize);
  • trunk/test/Physics/EasyPhysics.cpp

    r1607 r1613  
    112112                {
    113113                        m_rigid_body->setWorldTransform(btTransform(LOL2BT_QUAT(base_rotation), LOL2BT_VEC3(base_location)));
    114                         m_motion_state->setWorldTransform(m_rigid_body->getWorldTransform());
     114                        m_motion_state->setWorldTransform(btTransform(LOL2BT_QUAT(base_rotation), LOL2BT_VEC3(base_location)));
    115115                }
    116116        }
  • trunk/test/Physics/LolPhysics.h

    r1608 r1613  
    5555                // The world.
    5656                m_dynamics_world = new btDiscreteDynamicsWorld(m_dispatcher, m_broadphase, m_solver, m_collision_configuration);
     57        }
     58
     59        void SetContinuousDetection(bool ShouldUseCCD)
     60        {
     61                if (m_dynamics_world)
     62                        m_dynamics_world->getDispatchInfo().m_useContinuous = ShouldUseCCD;
    5763        }
    5864
Note: See TracChangeset for help on using the changeset viewer.