Autor Wątek: [Ogre\PhysX\C++]Skalowanie pola wysokości.  (Przeczytany 2629 razy)

Offline kokos22

  • Użytkownik

# Październik 01, 2012, 21:58:58
Mam problem z dokładnym odwzorowaniem terenu. Tworzę siatkę o wymiarach 64x64 wypełniam ją za pomocą
mTerrainGroup->getHeightAtWorldPosition(....)Skaluję przez (5000/513 - wielkość terenu do wielkości heightmapy) i wychodzi mi niemal, że idealnie jednak z  bliska widać spore odstępstwa siatki od terenu, a co gorsza Character Controller wpada mi pod teren przez "dziury " pomiędzy bokami trójkątów. Boki A i B każdego trójkąta znajdują się w odległości równej zastosowanej skali (9.74659) gdzie średnica kontrolera wynosi około 1. Gdy używam skali =1 -siatka swoje, teren swoje.Wszelka pomoc i sugestie mile widziane.

Offline Mr. Spam

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

Offline .:NOXY:.

  • Użytkownik
    • Profil

# Październik 01, 2012, 23:54:11
Sprawdzales physx visual debuggerem jak sie sprawy maja? Ogolnie teren sie powinno wrzucac jako TerrainMeshShape.

Offline Veldrin

  • Użytkownik

# Październik 02, 2012, 00:10:15
@up: TerrainMeshShape to coś nowego? Wersja 3.1 (czy może coś jeszcze)? Jakieś równice w stosunku to HeightField?

Ostatnio jak korzystałem z PhysX to używałem 3.0 i stąd moje pytania.

Offline .:NOXY:.

  • Użytkownik
    • Profil

# Październik 02, 2012, 11:59:28
Uh to nie pomoge ja sie zatrzymalem na 2.8.3 potem przeskoczylem na bulleta :)

Offline flexi

  • Użytkownik

# Październik 02, 2012, 12:15:48
Tak offtopujac: Mam zamiar podpiac silniczek fizyczny pod silniczek, tylko niewiem ktory wybrac PhysX 3 lub Bullet, 2 wygladaja spoko :-) moze ktos doradzic?

Offline kokos22

  • Użytkownik

# Październik 02, 2012, 17:25:13
Doszedłem do tego, że błędy te wynikają z tego, iż physX pobiera wysokości w postaci typu całkowitego a potem je skaluje -z tego wniosek, że muszę dostarczyć do fizyki wysokości całkowite takie jakie ogre pobiera z heightmapy. Teraz pytanie jak od ogra wyciągnąć wysokości całkowite - te, które ogre pobrał z heightmapy.
(Pobrać te dane umiem ale nie bardzo wiem jak przekonwerterować pozycje świata na pozycję konkretnego punktu z tablicy[513][513].) Na koniec dodam jeszcze, że nie wystarczy podzielić pozycji przez daną skale ze względu na rozchodzenie się "kawałków" terenu w różnych kierunkach-sprawę komplikują minusowe wartości.

Offline kokos22

  • Użytkownik

# Październik 02, 2012, 19:08:49
Mam duży problem ze skalowaniem całej siatki (jej wysokości), żeby uniknąć liczb zmiennoprzecinkowych pobraną od ogra wysokość mnożę przez 1000 po czym ustawiam heightScale dla physX`a 0.001 jednak siatka znajduje się teraz daleko pod terenem.Wie ktoś na czym polega mój błąd?
==============================================================================
Dodatkowym problemem jest fakt, że character controller o polu podstawy mniejszym niż pole jednego trójkąta z siatki terenu - przenika przez siatkę i spada ....
« Ostatnia zmiana: Październik 03, 2012, 20:09:10 wysłana przez kokos22 »

Offline .:NOXY:.

  • Użytkownik
    • Profil

# Październik 05, 2012, 14:07:21
Ja to zawsze robilem tak moze ci to jakos pomoze:

if((MainPhysic.gScene != NULL)){

NxHeightFieldDesc heightFieldDesc;
heightFieldDesc.nbColumns = MAP_X;
heightFieldDesc.nbRows = MAP_Z;
heightFieldDesc.thickness = -1000;
heightFieldDesc.convexEdgeThreshold = 0;

heightFieldDesc.samples = new NxU32[MAP_X*MAP_Z];
heightFieldDesc.sampleStride = sizeof(NxU32);

short material_index = MainPhysic.GetMaterial("grass");
short hi = material_index & 0xFF80;
short lo = material_index & 0x007F;

NxU8* currentByte = (NxU8*)heightFieldDesc.samples;

for( NxU32 row=0; row<MAP_X; ++row ){
for( NxU32 column=0; column<MAP_Z; ++column ){
NxHeightFieldSample* currentSample = (NxHeightFieldSample*)currentByte;

currentSample->height = (unsigned int)(data[row][column].vertex.y*100.0f);
currentSample->materialIndex0 = lo;
currentSample->materialIndex1 = lo;
currentSample->tessFlag = 1;

currentByte += heightFieldDesc.sampleStride;
}}

NxHeightField* heightField = MainPhysic.gPhysicsSDK->createHeightField(heightFieldDesc);

delete [] heightFieldDesc.samples;

NxHeightFieldShapeDesc heightFieldShapeDesc;

heightFieldShapeDesc.heightField = heightField;
heightFieldShapeDesc.shapeFlags = NX_SF_FEATURE_INDICES | NX_SF_VISUALIZATION;
heightFieldShapeDesc.heightScale = 0.01f;
heightFieldShapeDesc.rowScale = MAP_SCALE;
heightFieldShapeDesc.columnScale = MAP_SCALE;
heightFieldShapeDesc.materialIndexHighBits = hi;
heightFieldShapeDesc.holeMaterial = 0;
heightFieldShapeDesc.group = 1;

if(!heightFieldShapeDesc.isValid()) MessageBox(NULL, "ACTOR IS NOT VALID!!!", "HMAP::CREATE HEIGHT_FIELD", MB_OK|MB_ICONSTOP);

NxActorDesc actorDesc;

actorDesc.shapes.pushBack(&heightFieldShapeDesc);
actorDesc.globalPose.t = NxVec3( 0, 0, 0 );
actorDesc.density = 1000.0f;

NxActor *A = MainPhysic.gScene->createActor(actorDesc);
A->setGroup(1);

GameLog<<"[DONE]\n";
}
else GameLog<<"[FAIL]\n";

Offline kokos22

  • Użytkownik

# Październik 06, 2012, 10:04:29
Ze skalowaniem sobie poradziłem, został tylko problem z "przelatywaniem" CC przez siatkę. Średnica CC to jakieś 1.2m, a każda z wysokości trójkąta z siatki to co najmniej 2.5m  przez co wg mnie CC spada. Jeżeli zamiast kontrolera stworzę zwykłą kapsułę o tych samych wymiarach nie ma żadnego problemu. ta toczy się pomiędzy liniami nie spadając, CC jednak tak już nie działa.
« Ostatnia zmiana: Październik 06, 2012, 11:02:21 wysłana przez kokos22 »