|
Helló!
Egy fizika editoron dolgozom, amivel interaktívan létre lehet hozni fizikai objektumokat egy testhez, és egy elég nagy gondba ütköztem.
Mégpedig abba, hogy nem találtam olyan fícsőrt a physxben, hogy tehetetlenség. Ami ugye szerintem elég alapnak kéne lennie..
Szóval a probléma az, ha van egy egyszerű rúd( kapszula ), aminek a tömegközéppontja a kapszula közepe, és a szélének adok egy erőt felfelé, akkor a kapszulám az életben elkezdene pörögni a középpont körül. Na valahogy ez physxben nem sikerül, ameddig a rúd másik vége a földön van, addig forog, amikor eltávolodott, egyszerűen repül felfelé az egész aktor..
Nem tudom mit csinálhatok rosszul, vagy maga a rendszer ilyen szar, de van valakinek megoldása erre? esetleg találkozott már valaki ilyennel?
Mellékelek egy gifet, hogy hogy néz ki physxben.
|
|
|
Hali,
Öö egészen véletlenül valaki nem találkozott olyan problémával, hogy ha egy NxActorDesc -nek beállít egy NxBodyDesc -et, akkor a létrejövő NxActor getGlobalOrientation() által visszaadott mátrixa és az NxActorDesc globalPose.M mátrixa teljesen eltérő lesz?
Kód: // ha ezt benthagyom akkor az m33_1 és az m33_2 egyforma lesz
pmDesc.pActorDesc->body = nullptr;
const NxMat33& m33_1 = pmDesc.pActorDesc->globalPose.M;
_pNxActor = _pEngine->GetPhysxSubSystem()->GetScene()->createActor(*pmDesc.pActorDesc);
const NxMat33& m33_2 = _pNxActor->getGlobalOrientation();
|
|
|
Sziasztok.
Ez az error mit takar?
Exactly one of NDEBUG and _DEBUG needs to be defined by preprocessor
és hogy lehet eltüntetni?
|
|
|
Áhá szóval akkor erre valaó a .M 
Köszönnöm a segítséget
|
|
|
Nálam így néz ki a dolog:
actorDesc-készítésekor megadom a pozíciót, és az elforgatást:
Kód: if ( inDynamic )
{
// dinamikus
actorDesc.body = &bodyDesc;
actorDesc.density = inMass;
}
// statikus
actorDesc.globalPose.t.x = inObj->aPos.x;
actorDesc.globalPose.t.y = inObj->aPos.y;
actorDesc.globalPose.t.z = inObj->aPos.z;
NxMat33 mat;
actorDesc.globalPose.M.rotZ(inObj->aRot.z);
mat = actorDesc.globalPose.M;
actorDesc.globalPose.M.rotX(inObj->aRot.x);
mat = mat * actorDesc.globalPose.M;
actorDesc.globalPose.M.rotY(inObj->aRot.y);
mat = mat * actorDesc.globalPose.M;
actorDesc.globalPose.M = mat;
// ezt lehetett volna kicsit egyszerűbben is, mind1
És amikor az objektumok világmátrixát beállítom a fizika szerint, akkor
rendelem hozzá a skálázást:
Kód: // update scene objects
float mat[16];
for (int r = 0; r < inScene->aObjCnt; r++)
{
if ( inScene->aObjects[r]->aActor != NULL )
{
inScene->aObjects[r]->aActor->getGlobalPose().getColumnMajor44( mat );
inScene->aObjects[r]->aWorldMat = inScene->aObjects[r]->aScaleMat * mat;
}
}
|
|
|
és a forgatást hogy oldod meg XD.
Én eddig így oldottam meg:
Kód: ActorDesc.globalPose = wordmat;
de mióta van nagyítás is benne, bezavarodott az egész .
A statikus objektumokat 2X nagyítja (csak a grafikusi mesht).
A dinamikusakat pedig nem abban a helyzetbe hozza be amikor elkezdem a szimulációt.
|
|
|
thx XD erre nem jöttem rá
|
|
|
Egyébként itt a skálázási problémáddal kapcsolatban ha jól értem egy modellt akarsz átméretezni, és főzni belőle valamit trimesh-t pl. Mert nálam amikor betöltöm a modellt, és elkészítem a vertex listát, akkor egyszerűen minden koordinátáját megszorzom a skálaértékkel. És akkor már egyszerűen lehet bármit főzni  .
|
|
|
Igen, akkor látványos ha megyek, mert akkor az egész képernyő szaggat,
de ha mondjuk meglököm a szereket a pályán, akkor csak az akadozik.
A getTimeGet()-el már szívtam máskor, azóta a PhysX QueryPerformanceCounter-jét használom.
|
|
|
Próbáltam hogy előbb skálázom és utánna cookolm,de mindig visszaugrik az eredetibe...
|
|
|
Idézet pista75 :
syam:
A NxScaleCookedConvexMesh() arányosan növeli a modelt,de ha nekem nemarányosan kellen?
Akkor készítesz egy másik convex mesht és saját kódból kell skáláznod és azt is cookolni.
alias aalberik
|
|
|
Hun
De csak akkor akadozik ha mész?
Mert nekem is ezt csinálta getTimeGet()-es időzítésél.
Te milyet használsz?
syam:
A NxScaleCookedConvexMesh() arányosan növeli a modelt,de ha nekem nemarányosan kellen?
|
|
|
Köszi, az enyém is így néz ki, kivéve a deviceWindow beállítást, de az sem segített. Kipróbáltam 1440*900-ban, ugyanúgy laggol, mondjuk 800x600-ba egész sima volt  . Az a furcsa, hogy
nem folyamatosan szaggat, csak néha, meg akkor ha oldalazva megyek, a másik meg, hogy fps van bőven és mégis... Ablakban 700FPS -t ír, és nem szaggat.
A kérdésedre válaszolva: nem, ruhával még nem foglalkoztam, csak járművekkel egy kicsit.
|
|
|
Idézet HunTer :
Nemjó, a példaprogram OpenGL-t használ. Viszont lehet, hogy ez inkább DirectX probléma, és azért tűnik föl csak a játékos mozgatásánál, mert ugye akkor minden kirajzolt pixel változik. Valami a full screen init-nél sántít, de még nem tudom mi.
Azért köszi!
Szia.
Én fullcreen-be csináom(1440*900-as),és nekem nem szaggat.
A fullscrenn beállításai:
Kód: t3d9->GetAdapterDisplayMode(D3DADAPTER_DEFAULT,&d3pm);
ZeroMemory(&d3pp,sizeof(d3pp));
//Teljes képernyős üzemmód
d3pp.Windowed=FALSE;
d3pp.hDeviceWindow=hwnd;
d3pp.SwapEffect=D3DSWAPEFFECT_DISCARD;
d3pp.EnableAutoDepthStencil= TRUE;
d3pp.AutoDepthStencilFormat = D3DFMT_D16;
d3pp.MultiSampleType = D3DMULTISAMPLE_4_SAMPLES;
d3pp.BackBufferFormat = D3DFMT_X8R8G8B8;
d3pp.BackBufferWidth = screenWidth;
d3pp.BackBufferHeight = screenHeight;
if(FAILED(t3d9->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hwnd,D3DCREATE_HARDWARE_VERTEXPROCESSING,&d3pp,&t3dd9)))
{
::MessageBoxA(NULL,"Nem lehet lekérdezni az eszközt!!!",NULL,NULL);
}
Nekem viszont a ruha és a soft body szimulálásával van gondom.
Te foglalkoztál vele?
Ezt a hozzászólást pista75 módosította (2011.07.22 16:13 GMT+1 óra, ---)
|
|
|
Nemjó, a példaprogram OpenGL-t használ. Viszont lehet, hogy ez inkább DirectX probléma, és azért tűnik föl csak a játékos mozgatásánál, mert ugye akkor minden kirajzolt pixel változik. Valami a full screen init-nél sántít, de még nem tudom mi.
Azért köszi!
|
|
|
Próbáld meg a saját CC példájukkal ugyanezt a fullscreent megcsinálni.
alias aalberik
|
|
|
Pontosítok, viszont így már semmi ötletem sincs: ablakos módban, 1680x1050, 60Hz VSYNC -el nem szaggat.  Nem értem, a két beállítás között csak annyi a különbség, hogy ablakos, vagy fullscreen... Passz
|
|
|
Üdv!
Egy motoron dolgozom, és laggolási problémáim vannak. A felállás az, hogy van DirectX, meg van PhysX, és ha ezekkel a beállításokkal futtatom: fullscreen, 1680 x 1050, 60Hz, VSYNC, akkor a játékos mozgása szaggat, de csak az, a többi objektum szépen mozog, az FPS is fix 60. (a játékos mozgatását a sima NxCharacterController-el oldottam meg, a példaprogram alapján) Ha viszont ablakos módban futtatom VSYNC nélkül, akkor jól működik. Én a vsync-re gyanakodtam, próbáltam már, hogy a PhysX szimulációját, nem számolt, hanem fix delta time-al hívom meg, de ez sem oldotta meg.
Környezet:
Visual C++
DirectX 9.0c
PhysX 2.8.4
Hát ez az én nagy problémám, ha valaki tud valamit segítsen plz... Előre is köszönöm!
|
|
|
Skálázást nem tűri a fiziksz.
Már elkészült convex mesht NxScaleCookedConvexMesh-sel tudsz skálázni.
alias aalberik
|
|
|
Tud valaki segíteni?
Ha átméretezek 1 modellt,akkor megszűnik a fizikája,vagy ha elindul a szimuláció akkor ugyan olyan lesz mint előtte.
Próbáltam cooking előtt méretezni hátha az a baj,de semmi,mint ha nem támogatná a méretezést a physx.
|
|
|
hát nem értem.
Ezeket beállítom így:
Kód: myBuff.verticesPosBegin = &(mVertexBuffer[0].position.x);
myBuff.numVerticesPtr = &mNumVertices;
stb.
de hogyan kapom meg ebből a dolgokat?
|
|
|
Idézet pista75 :
És hogyan tudom kivitelezni ezt?
A doksiban le van írva:
verticesPosBegin - ebben vannak xyz hármasként a generált vertex pozíciók.
numVerticesPtr - ennyi db vertexet generált, ami nem lehet több, mint maxVertices
indicesBegin - ebben vannak integerként a háromszögek. 3 db int egy háromszög.
numIndicesPtr - ennyi db indexed van vagyis numIndices / 3 db háromszög.
Ha szakítást is akarsz bele az külön téma.
alias aalberik
|
|
|
És hogyan tudom kivitelezni ezt?
Ezt a hozzászólást pista75 módosította (2011.07.03 16:28 GMT+1 óra, ---)
|
|
|
Idézet pista75 :
Sziasztok.
Most a ruha szimulálásnál tartok,de 1 valamit nem értek.
Hogyan töltöm visza a pozíziót a NxCloth ból a pozíciót a Modellembe?
az NxCloth nak nincs getGlobalPose() függvénye,csak getPosition() és getPositions() függvénye.
Ez azt jelenti hogy minden vertexnek külön kell betölteni a pozícióját?
Aha, szépen lemásolod, de ha jól emlékszem közvetlen hozzád is tudja másolni az adatokat.
alias aalberik
|
|
|
Sziasztok.
Most a ruha szimulálásnál tartok,de 1 valamit nem értek.
Hogyan töltöm visza a pozíziót a NxCloth ból a pozíciót a Modellembe?
az NxCloth nak nincs getGlobalPose() függvénye,csak getPosition() és getPositions() függvénye.
Ez azt jelenti hogy minden vertexnek külön kell betölteni a pozícióját?
|
|
|
Idézet pista75 :
thx erre nem jöttem volna rá magamtól
Ez már a forgást is tartalmazza ugye?
Aham, egy pozíció-orientáció mátrix^^
Más szemszögből nézve: model mátrix.
alias aalberik
|
|
|
thx erre nem jöttem volna rá magamtól
Ez már a forgást is tartalmazza ugye?
|
|
|
Idézet - Szimulációkor lekéred az actor pozíció-orientáció mátrixát és azzal transzformálod a grafikai mesht rajzoláskor.
getGlobalPose().getColumnMajor44 - ezzel OGL "stílusú" mátrixot kapsz.
D3Dhez gndlm RowMajor44 kell.
alias aalberik
|
|
|
|
ok akkor improvizálok,azét köszi a segítséget
Edit:
Na mind 1 hagyom,úgy is dolgoznom kellen XD
|
|
|
A probláma legalább két részes:
- ki kellene nyerned a geometriát és topológiát a a dxmeshből - ebben nem vagyok kompetens, dx téma^^
- a kinyert adatot át kell adni egy megfelelő nx descriptornak.
Ha megvan a kinyert adat akkor szerintem a fiziksz sdk példái megmutatják, hogy kell csinálni.
Közvetlen tutorialt nem ismerek.
alias aalberik
|
|
|
Aha értem.
Nemtudsz valami tutorialt ami bemutatja hogy kell XD
|
|
|
- El kell döntened milyen mesht (trimesh, convex mesh, egyéb) akarsz az actorhoz rendelni.
- Le kell gyártatnod a cookmesh-sel a fizikai mesht a grafikai meshből
- Szimulációkor lekéred az actor pozíció-orientáció mátrixát és azzal transzformálod a grafikai mesht rajzoláskor.
Nem egyszerű :]
alias aalberik
|
|
|
Szóval akkor a mesh csúcspontjait kell beletöltenem?
És akkor simán renderelek a Directx el és mennie kell?
Ezt most nem nagyon értem akkor ?
Akkor honnal tudja hogy melyik modell volt az aminek el kell mozdulnia?
|
|
|
Idézet Joga :
Én inkább ilyesmire tippelek:
Kód: NxActor& operator=( NxActor& actor, LPD3DXMESH mesh)
{
//konverzió elvégzése, stb
return actor;
}
Jaja, igazad van
alias aalberik
|
|
|
Én inkább ilyesmire tippelek:
Kód: NxActor& operator=( NxActor& actor, LPD3DXMESH mesh)
{
//konverzió elvégzése, stb
return actor;
}
|
|
|
Kód: NcActor& operator =(const LPD3DXMESH &mesh)
{
NxActor *actor = new NxActor;
...
return *actor;
}
Vagyis nincs automata konverzió a kettő között; le kell kódolni...
alias aalberik
|
|
|
Sziasztok
1 kérdés merült fel bennem,ami a dokumentációban nem volt.
1 LPD3DXMESH hogy tudok betölteni NxActor nak?
Egyszerűen így?
Kód: NxActor valami = LPD3DXMESH valami;
A segítséget előre is köszönöm
|
|
|
Idézet pista75 :
Ati hoz nem találtam drivet...
Kölcsönkérek a haveromtól 1 nvidiás kártyát megnézem azzal.
Ja még 1 kérdés és ha olyan a kártya hogy nem támogatja a physx-et akkor is futnia kellene?
Edit:
Ezt kellene felrakni?
http://www.nvidia.com/object/physx-9.10.0513-driver.html
és elméletileg menne is?
Igen és ennek bárhova fel kellene települnie + oda van írva, hogy hardveres fizikai gyorsítás GF8-tól felfelé van.
alias aalberik
|
|
|
Ati hoz nem találtam drivet...
Kölcsönkérek a haveromtól 1 nvidiás kártyát megnézem azzal.
Ja még 1 kérdés és ha olyan a kártya hogy nem támogatja a physx-et akkor is futnia kellene?
Edit:
Ezt kellene felrakni?
http://www.nvidia.com/object/physx-9.10.0513-driver.html
és elméletileg menne is?
|
|
|
Idézet pista75 :
Ha nincs nvidia kártyám akkor is működik a physx a CPU ról?
Telepítés után kellene neki^^
alias aalberik
|
|
|
Ha nincs nvidia kártyám akkor is működik a physx a CPU ról?
|
|
|
Nézte már valaki a PhysX 3.0-t?
alias aalberik
|
|
|
a PhysX verzióra gondolsz? ( 2.8.1.4 ) Azt használom a mit a 10 demo-nál mellékelt.
|
|
|
Még nem sokat foglalkoztam vele, csak azt az aall-in-one sample-t néztem, az működött rendesen. Hogy abba van-e triangle betöltés, azt nem tudom. Amúgy nem lehet, hogy a physx system software verzióval van gond? Mintha írták volna az oldalon, hogy némelyikkel nem működik tökéletesen.
|
|
|
Abba hogy oldottad meg a triangle betöltéseket? Stream-el?. Nekem ott hibát ír ki ( valami olyat ,hogy védet memória terület.... ). Nincs valami ötlet?
|
|
|
PhysX 0.9.1 és XNA 2.0
Le vagyok maradva
|
|
|
dvorgaz melyik verzió? Ha a 10-es akkor hogy kelteted életre? XNA 3.0?
|
|
|
Oks, köszi, akkor megnézem a sample-ket.
|
|
|
Idézet
dvorgaz
A másik meg ha használta már ezt valaki, ugyanúgy működik mint a C++ verzió? Tehát a C++-os tutorokat elolvasom, azok (majdnem) ugyanúgy működni fognak mondjuk XNA-ban is?
Én használtam, nekem teljesen jól működött eddig. Letöltöttem a PhysX SDK-t, és az abban lévő sample-k, és API dokumentáció alapján sikerült boldogulni. Lényegében minden ugyanaz, csak rá kell jönni mit hogyan hívnak a wrapperben.
|
|