Autor Wątek: [Ogre/PhysX/C++]Grupy kolizyjne physX`a  (Przeczytany 1722 razy)

Offline kokos22

  • Użytkownik

# Październik 31, 2012, 17:23:06
Kontroler postaci physx`a nie koliduje z polem wysokości.
if(obj->gController!=NULL)
{
Ogre::Vector3 orient;
 NxU32 collisionFlags;
double  time =(double)Engine::GetSingleton()->timeSinceLastFrame/1000;
Ogre::Vector3 d = Ogre::Vector3(0,-9.8,0);
   Ogre::Vector3 vec(0,0,(atof(obj->GetAttribute("KIERUNEK").c_str())*50));
vec=obj->sceneNode->getOrientation()*vec;
double velocity=atof(obj->GetAttribute("Speed").c_str());
d.x += vec.x * velocity;
d.z +=vec.z * velocity;
d=d*time;
NxVec3 da=NxVec3(d.x,d.y,d.z);
obj->gController->move(da,2,0.00001f,collisionFlags,1.0f);
   if (collisionFlags & NXCC_COLLISION_DOWN){
    Log("KOLIZJA Z TERENEM");
   }
return collisionFlags;
}
else return 0;
}


Pos.x=(int)Pos.x;
Pos.z=(int)Pos.z;
pTerrPos=Pos;
  NxHeightFieldDesc desc;
   desc.nbRows = Size;
   desc.nbColumns = Size;
   desc.convexEdgeThreshold = 0;
   desc.thickness = -1000;
   desc.samples = new NxU32[desc.nbRows * desc.nbColumns];
   desc.sampleStride = sizeof(NxU32);
   char* currentByte = (char*)desc.samples;
for( int row=0;row<64;row++)
{
for( int column=0;column<64;column++)
{
long a,b;
mTerrainGroup->convertWorldPositionToTerrainSlot(Ogre::Vector3(Pos.x+row*Skala,0,Pos.z+column*Skala),&a,&b);
Ogre::Vector3 newPos;
Ogre::Vector3 pos=Ogre::Vector3(Pos.x+row*Skala,0,Pos.z+column*Skala);
mTerrainGroup->getTerrain(a,b)->convertPosition(Ogre::Terrain::Space::WORLD_SPACE,pos,Ogre::Terrain::Space::POINT_SPACE,newPos);
double height =mTerrainGroup->getTerrain(a,b)->getHeightAtWorldPosition(Pos.x+row*Skala,0,Pos.z+column*Skala)*10;
         NxHeightFieldSample* currentSample = (NxHeightFieldSample*)currentByte;
         currentSample->height =height;
         currentSample->materialIndex0 = 0;
         currentSample->materialIndex1 = 0;
         currentSample->tessFlag = 0;
         currentByte += desc.sampleStride;
      }

   }

hField = Engine::GetSingleton()->physxManager->gPSDK->createHeightField(desc);
   delete [] desc.samples;
   NxHeightFieldShapeDesc shapeDesc;
   shapeDesc.heightField = hField;
   shapeDesc.shapeFlags = NX_SF_FEATURE_INDICES|NX_SF_VISUALIZATION;
   shapeDesc.heightScale =0.1;
   shapeDesc.rowScale =Skala;
   shapeDesc.columnScale = Skala;
   shapeDesc.materialIndexHighBits = 1;
   shapeDesc.holeMaterial = 3500;
   NxActorDesc actorDesc;
   actorDesc.shapes.pushBack(&shapeDesc);
   actorDesc.density = 1.0f;
actorDesc.group=2;

Obiekty typu NxBox czy NxCapsule kolidują bez problemu.

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline .:NOXY:.

  • Użytkownik
    • Profil

# Październik 31, 2012, 19:00:19
Albo masz zle indexy materialow albo grupy ci sie pomieszaly to bym w pierw sprawdzil. Potem zerknij czy materialIndexLowBits pomoze (ustawienie tego ofc)

Offline kokos22

  • Użytkownik

# Listopad 03, 2012, 13:23:58
Błąd okazał się banalny- grupa, której używałem była grupą bezkolizyjną.