PhysX integráció Szécsi László. Letöltés diák: bagira.iit.bme.hu/~szecsi/GraphGame //l11-physx.ppt modell: bagira.iit.bme.hu/~szecsi/GraphGame //pickup.zip.

Slides:



Advertisements
Hasonló előadás
1 Hernyák Zoltán Programozási Nyelvek II. Eszterházy Károly Főiskola Számítástudományi tsz.
Advertisements

2010/2011 ősz Klár Gergely  A DirectX egy alacsonyszintű API gyűjtemény  Multimédiás alkalmazások futtatására, írására szolgál  Részei.
GraphGame gg001-Triangle
1. foreach( fejlesztő in Lurdyház ) { fejlesztő.Agy. Delete If( delegate ( Content c ) { return c.ContainsAny( „Win32 / User32.dll”, „GDI”,„GDI+”,„WindowsForms”,
3D képszintézis fizikai alapmodellje
Térfogatvizualizáció Szirmay-Kalos László. Térfogati modellek v(x,y,z) hőmérséklet sűrűség légnyomás potenciál anyagfeszültség... v(x,y,z) tárolás: 3D.
Bevezetés a tárgyakhoz Tárgyak  Objects are the containers for values of a specified type  Objects are either signals, variables or constants  Once.
FelültöltésVHDL Felültöltés (Overloading) n Áttekintés n Példák.
Szécsi László. June 2010 DirectX SDK Visual Studio 2010.
Mesh betöltés, kirajzolás Szécsi László. dx11-ben nincs – játékfejlesztők írnak maguknak úgyis DXUT-ban van – CDXUTSDKMesh – csak sdkmesh formátumot tud.
 Gauss szűrő uniform sampler2D colorMap; const float kernel[9] = float[9]( 1.0, 2.0, 1.0, 2.0, 4.0, 2.0, 1.0, 2.0, 1.0); out vec4 outColor; void main(){
 Fény fotonok szimulációja  Nem változtatja meg a frekvenciát ütközéskor  Homogén és inhomogén közegben.
Socket programozás Példák
© Kozsik Tamás Tömbök, kollekciók és egyéb alaposztályok.
TRANZIENS ADATTÁROLÁS State objektum Egy alkalmazásszintű gyűjtemény (Dictionary), mely Tombstone esetén megőrzi tartalmát a memóriában kulcs/érték párokként.
Programozás II. 3. Gyakorlat C++ alapok.
Delegátumok C#-ban Krizsán Zoltán iit 1.0.
Course Situation and Event Driven Models for Multilevel Abstraction Based Virtual Engineering Spaces Óbuda University John von Neumann Faculty of Informatics.
Számítógépes grafika OpenGL 1. gyakorlat.
Oracle multimédia Kiss Attila Információs Rendszerek Tanszék
A megértés körei Binzberger Viktor Budapest Műszaki és Gazdaságtudományi Egyetem Filozófia és Tudománytörténet Tanszék.
PHP V Osztályok, Objektumok. Osztály class Person { var $name; // tulajdonság, változó function getName() { // metódus, tagfüggvény return $this->name;
Multimédiás programok készítése Macromedia Director fejlesztői környezetben 4. előadás Készítette: Kosztyán Zsolt
2008/2009 tavasz Klár Gergely  A DirectX egy alacsonyszintű API gyűjtemény  Multimédiás alkalmazások futtatására, írására szolgál 
Gábor Dénes Főiskola (IAI)Programozási technológia (Java) - III. / 1 13.Állományok, bejegyzések 14.Folyamok 15.Közvetlen hozzáférésű állomány.
Hasznos ismeretek Hogyan bővítsük ismereteinket AVRDUDEflags -E noreset.
Könyvtár, csomag és alprogramokVHDL Könyvtár, csomag és alprogram n Library és use n Package n Alprogramok –Procedure –Function –Resolution function Egy.
AAO Csink László november.
Térfogatvizualizáció Szirmay-Kalos László. Térfogati modellek v(x,y,z) hőmérséklet sűrűség légnyomás potenciál anyagfeszültség... v(x,y,z) tárolás: 3D.
Motor IIII. Vezérlés Szécsi László. Letöltés diák: //l09-engine4.ppt.
Motor IIII. PhysX utáni rendberakás Vezérlés Szécsi László.
Motor II. Env map Spotlight Szécsi László. Letöltés /code/E/code/EggCoreSecondBase.zip Kibontani (vagy előző labor folyt.):
Terep Szécsi László. Mechanizmus NxHeightField-ek definiálása PhysicsModel-be NxHeightFieldShapeDesc-ek betöltése Mesh-ek gyártása az NxHeightField- ekből.
PhysX autó Szécsi László. Letöltés diák: bagira.iit.bme.hu/~szecsi/GraphGame //l12-car.ppt modell: bagira.iit.bme.hu/~szecsi/GraphGame //pickup.zip.
DirectX9 empty project Szécsi László. Visual Studio Első indításkor C++ választása.
Motor I. Scene graph XML Rendering Szécsi László.
Environment mapping Szécsi László. Új osztály: Lab3EnvMap copy&paste: Lab2Trafo.h -> Lab3EnvMap.h copy&paste: Lab2Trafo.cpp -> Lab3EnvMap.cpp copy&paste:
Vízfelület Szécsi László. Nyílt víz a nyílt óceánon a felületi cseppecskék körmozgást végeznek trochoid hullámforma hullámhossz hullámmagasság amplitúdó.
Transzformációk, textúrák, árnyalás Szécsi László.
DirectX9 empty project Szécsi László. Project létrehozása Microsoft DirectX SDK (August 2008) telepítése Start Menu \ Microsoft DirectX SDK (August 2008)\
Motor V. Ütközés detektálás és válasz Szécsi László.
V. labor Thread, animáció. Animáció A figurák a lépés kijelölése után nem rögtön az új helyen teremnek, hanem egyenes vonal mentén mozognak a cél felé.
OIS. Kezdeti teendők Letöltés: OgreLabControllersBase.zip Kicsomagol, betölt:.sln Additional include és library path beállítása Working directory beállítása.
SzgLab 3. Java. I. labor Alapok, OOP váz, megjelenítés konzolon.
II. labor Lépések kezelése. Új metódus a Square osztályba public static int letterToFileIndex(char letter) throws NumberFormatException { int i = 0; for.
III. labor AWT, eseménykezelés Applet. Új class: ButtonView import java.awt.*; import java.awt.event.*; import java.util.LinkedList; public class ButtonView.
Kamera, 3D, transzformációk Szécsi László. Math.zip kibontása az Egg projectkönyvtárba – float2, foat3, float4 típusok, HLSL-ben megszokott műveletekkel.
Grafikus játékok fejlesztése Szécsi László g10-engine
Effect framework, HLSL shader László Szécsi. forráskódban elérhető egyszerűsíti a shaderek fordítását, rajzolási állapot beállítását – pass: egy ilyen.
OO framework, Egg util library László Szécsi. Projektek nem osztoznak semmilyen kódon – DXUT mindegyikben – effect betöltés, mesh betöltés, GUI mindegyikbe.
Geometry instancing Szécsi László. copy-paste-rename gg009-Gui folder vcxproj, filters átnevezés solution/add existing project rename project working.
User interface Szécsi László. Egg projectben DXUTgui.cpp – CDXUTDialogResourceManager::CDXUTDialogReso urceManager() m_SpriteBufferBytes11 = 0; ezt kihagyták,
Textúrázás Szécsi László. giraffe.jpg letöltése SolutionDir/Media folderbe.
 Map  Reduce  Scan  Histogram  Compact const size_t dataSize = 1024; cl_kernel mapKernel = cl.createKernel(clProgram, "map"); float* hData = new.
 Kvantált kép fényesség értékei: G [ 0, Gmax ]  G fényességű pontok száma: P(G)
GPGPU labor XII. Tomográfiás rekonstrukció. Kezdeti teendők Tantárgy honlapja, Monte Carlo szimuláció A labor kiindulási alapjának letöltése (lab12_base.zip),
GPGPU labor X. Monte Carlo módszerek. Kezdeti teendők Tantárgy honlapja, Monte Carlo módszerek A labor kiindulási alapjának letöltése (lab10_base.zip),
GPGPU labor IX. Lineáris egyenletrendszerek megoldása.
GPGPU Labor 15.. Párhuzamos primitívek Map Reduce Scan Histogram Compact.
GPGPU labor II. GPU mint vektor processzor. Kezdeti teendők Tantárgy honlapja, Bevezetés – Alap könyvtárak letöltése Tantárgy honlapja, GPU mint vektor.
 OpenCL platform  Számító eszközök  OpenCL kontextusok  Parancs sorok  Szinkronizáció  Memória objektumok  OpenCL programok  OpenCL függvények.
2. gyakorlat DirectX 2007/2008 tavasz Klár Gergely
ELTE-IK, Számítógépes grafika 2./haladó 2. gyakorlat Klár Gergely.
Krizsán Zoltán, iit C# osztályok 2 Adattagok  Osztály hatáskörben definiált változó.  Formája: [attribútum] [módosító] típus azonosító [=kezdő érték][,
Kamera, 3D, transzformációk Szécsi László
JAVA programozási nyelv NetBeans fejlesztőkörnyezetben I/13. évfolyam
JAVA programozási nyelv NetBeans fejlesztőkörnyezetben I/13. évfolyam
YOUR LOGO HERE YOUR COMPANY NAME COMPANY PHONE
Függvénysablonok használata
ZUMTOBEL CARICA-T M 1/35W QT12 ETR BK Description
Előadás másolata:

PhysX integráció Szécsi László

Letöltés diák: bagira.iit.bme.hu/~szecsi/GraphGame //l11-physx.ppt modell: bagira.iit.bme.hu/~szecsi/GraphGame //pickup.zip

XML – új XML file <NxBoxShape position.y="9" dimension.x="32" dimension.y="4" dimension.z="10" /> <NxBoxShape position.y="12" dimension.x="6" dimension.y="4" dimension.z="10" /> <PhysicsEntity name="ground" shadedMesh="ground" physicsModel="ground" />

Directory.h – új konténerek typedef std::map PhysicsMaterialDirectory; class PhysicsModel; typedef std::map PhysicsModelDirectory;

EngineCore – új tagváltozók NxPhysicsSDK*nxPhysicsSDK; NxScene*nxScene; PhysicsMaterialDirectory physicsMaterialDirectory; PhysicsModelDirectory physicsModelDirectory;

EngineCore – új metódusok void loadPhysicsMaterials(XMLNode& xMainNode); void loadPhysicsModels(XMLNode& xMainNode); // folyt.

Shapek betöltéséhez modellbe void loadShapeDesc(XMLNode& shapeNode, NxShapeDesc* shapeDesc, D3DXVECTOR3 originalAxis = D3DXVECTOR3(0, 1, 0)); void loadNxBoxShapes(XMLNode& physicsModelNode, PhysicsModel* physicsModel); void loadNxCapsuleShapes(XMLNode& physicsModelNode, PhysicsModel* physicsModel); void loadNxSphereShapes(XMLNode& physicsModelNode, PhysicsModel* physicsModel); void loadNxPlaneShapes(XMLNode& physicsModelNode, PhysicsModel* physicsModel);

Entitás betöltő metódus void loadPhysicsEntities( XMLNode& groupNode, NodeGroup* group); // class PhysicsEntity; elődekl. kell

EngineCore-t hagyjuk félbe Majd később implementáljuk a metódusokat Előbb csináljuk meg az új osztályokat

Új class: PhysicsModel ( NxActorDesc wrapper ) class PhysicsEntity; class PhysicsModel { NxActorDesc nxActorDesc; public: void addShape( NxShapeDesc* shapeDesc); PhysicsModel(bool dynamic); ~PhysicsModel(); NxActorDesc& getNxActorDesc(); };

PhysicsModel::PhysicsModel PhysicsModel::PhysicsModel( bool dynamic) { NxBodyDesc* nxBodyDesc = NULL; if(dynamic) nxBodyDesc = new NxBodyDesc(); nxActorDesc.body = nxBodyDesc; nxActorDesc.density = 1; }

PhysicsModel.cpp PhysicsModel::~PhysicsModel() { delete nxActorDesc.body; } NxActorDesc& PhysicsModel::getNxActorDesc() { return nxActorDesc; }

PhysicsModel::addShape void PhysicsModel::addShape( NxShapeDesc* shapeDesc){ nxActorDesc.shapes.pushBack( shapeDesc); }

Új class: PhysicsEntity base class: Entity class PhysicsEntity : public Entity { NxActor* nxActor; public: NxActor* getNxActor(); PhysicsEntity(ShadedMesh* shadedMesh, PhysicsModel* physicsModel, NxScene* nxScene, const NxVec3& position); void render(const RenderContext& context); void setPosition( const D3DXVECTOR3& position); };

PhysicsEntity.cpp #include "PhysicsModel.h" #include "ShadedMesh.h" #include "Camera.h" PhysicsEntity::PhysicsEntity( ShadedMesh* shadedMesh, PhysicsModel* physicsModel, NxScene* nxScene, const NxVec3& position) :Entity(shadedMesh) { NxActorDesc& nxActorDesc = physicsModel->getNxActorDesc(); nxActorDesc.globalPose.t = position; nxActor = nxScene->createActor(nxActorDesc); }

PhysicsEntity.cpp NxActor* PhysicsEntity::getNxActor() { return nxActor; }

PhysicsEntity.cpp void PhysicsEntity::render(const RenderContext& context) { NxMat34 pose = nxActor->getGlobalPose(); D3DXMATRIX modelMatrix; D3DXMatrixIdentity(&modelMatrix); pose.getColumnMajor44((NxF32*)&modelMatrix); D3DXMATRIX modelMatrixInverse; D3DXMatrixInverse(&modelMatrixInverse, NULL, &modelMatrix); context.effect->SetMatrix("modelMatrix", &modelMatrix); context.effect->SetMatrix("modelMatrixInverse", &modelMatrixInverse); D3DXMATRIX modelViewProjMatrix = modelMatrix * context.camera->getViewMatrix() * context.camera->getProjMatrix(); context.effect->SetMatrix("modelViewProjMatrix", &modelViewProjMatrix); D3DXMATRIX modelViewMatrix = modelMatrix * context.camera->getViewMatrix(); context.effect->SetMatrix("modelViewMatrix", &modelViewMatrix); shadedMesh->render(context); }

Vissza az EngineCore-hoz Implementáljuk a betöltőket meg a többit EngineCore.cpp: #include "PhysicsModel.h" #include "PhysicsEntity.h"

createManagedResources kieg. nxPhysicsSDK = NxCreatePhysicsSDK(NX_PHYSICS_SDK_VERSION) ; nxPhysicsSDK->setParameter(NX_SKIN_WIDTH, 0.01); NxSceneDesc nxSceneDesc; nxSceneDesc.simType = NX_SIMULATION_SW; nxSceneDesc.gravity = NxVec3(0,-9.8,0); nxScene = nxPhysicsSDK- >createScene(nxSceneDesc);

createManagedResources folyt. NxMaterial* defaultMaterial = nxScene->getMaterialFromIndex(0); defaultMaterial->setRestitution(0.5); defaultMaterial-> setStaticFriction(0.5); defaultMaterial-> setDynamicFriction(0.5); loadLevel();

releaseManagedResources kieg. nxPhysicsSDK->releaseScene(*nxScene); nxPhysicsSDK->release();

createDefaultResources kieg. nxScene->simulate(0.0001); nxScene->flushStream(); return S_OK;

releaseDefaultResources kieg. while (!nxScene-> fetchResults( NX_RIGID_BODY_FINISHED, false)) // üres ciklus ;

animate void EngineCore::animate(double dt, double t) { currentCamera->second->animate(dt); while (!nxScene-> fetchResults(NX_RIGID_BODY_FINISHED, false)); sceneRoot->control( ControlContext(status, dt, sceneRoot)); sceneRoot->animate(dt); nxScene->simulate(dt); nxScene->flushStream(); }

loadLevel kieg. XMLNode xMainNode=XMLNode::openFileHelper(L" media\\levelPhysX.xml", L"Scene"); //… loadPhysicsMaterials(xMainNode); loadPhysicsModels(xMainNode); // még a loadGroup előtt

loadGroup kieg. loadPhysicsEntities(groupNode, group);

void EngineCore::loadPhysicsMaterials(XMLNode& xMainNode){ int iPhysicsMaterial = 0; XMLNode physicsMaterialNode; while( !(physicsMaterialNode = xMainNode.getChildNode(L"PhysicsMaterial", iPhysicsMaterial)).isEmpty() ) { const wchar_t* physicsMaterialName = physicsMaterialNode|L"name"; NxMaterialDesc nxMaterialDesc; if(physicsMaterialNode.readBool(L"friction", true)) nxMaterialDesc.flags &= ~NX_MF_DISABLE_FRICTION; else nxMaterialDesc.flags |= NX_MF_DISABLE_FRICTION; physicsMaterialDirectory[physicsMaterialName] = nxScene->createMaterial(nxMaterialDesc); iPhysicsMaterial++; } √

void EngineCore::loadPhysicsModels(XMLNode& xMainNode) { int iPhysicsModel = 0; XMLNode physicsModelNode; while( !(physicsModelNode = xMainNode.getChildNode(L"PhysicsModel", iPhysicsModel)).isEmpty() ) { const wchar_t* physicsModelName = physicsModelNode|L"name"; PhysicsModel* physicsModel; const wchar_t* dynamismString = physicsModelNode|L"dynamism"; if(dynamismString && wcscmp(dynamismString, L"static") == 0) { physicsModel = new PhysicsModel(false); loadNxPlaneShapes(physicsModelNode, physicsModel); } else physicsModel = new PhysicsModel(true); loadNxBoxShapes(physicsModelNode, physicsModel); loadNxCapsuleShapes(physicsModelNode, physicsModel); loadNxSphereShapes(physicsModelNode, physicsModel); physicsModelDirectory[physicsModelName] = physicsModel; iPhysicsModel++; }

// segédfüggvény, mindegyik shapehez kell void EngineCore::loadShapeDesc(XMLNode& shapeNode, NxShapeDesc* shapeDesc, D3DXVECTOR3 originalAxis) { shapeDesc->localPose.t = shapeNode.readNxVec3(L"position"); D3DXVECTOR3 axis = shapeNode.readVector(L"axis"); if(D3DXVec3Length(&axis) < ) axis = originalAxis; D3DXVECTOR3 turnAxis; D3DXVec3Cross(&turnAxis, &axis, &originalAxis); D3DXVec3Normalize(&axis, &axis); D3DXMATRIX turnMatrix; D3DXMatrixRotationAxis(&turnMatrix, &turnAxis, acos(D3DXVec3Dot(&axis, &originalAxis))); shapeDesc-> localPose.M.setColumnMajorStride4((NxF32*)&turnMatrix); }

void EngineCore::loadNxBoxShapes(XMLNode& physicsModelNode, PhysicsModel* physicsModel) { int iShape = 0; XMLNode shapeNode; while( !(shapeNode = physicsModelNode.getChildNode(L"NxBoxShape", iShape)).isEmpty() ) { NxBoxShapeDesc* nxBoxShapeDesc = new NxBoxShapeDesc(); loadShapeDesc(shapeNode, nxBoxShapeDesc); nxBoxShapeDesc->dimensions = shapeNode.readNxVec3(L"dimension", NxVec3(10, 10, 10)); physicsModel->addShape(nxBoxShapeDesc); iShape++; }

void EngineCore::loadNxCapsuleShapes(XMLNode& physicsModelNode, PhysicsModel* physicsModel) { int iShape = 0; XMLNode shapeNode; while( !(shapeNode = physicsModelNode.getChildNode(L"NxCapsuleShape", iShape)).isEmpty() ) { NxCapsuleShapeDesc* nxCapsuleShapeDesc = new NxCapsuleShapeDesc(); loadShapeDesc(shapeNode, nxCapsuleShapeDesc); nxCapsuleShapeDesc->radius = shapeNode.readDouble(L"radius", 5.0); nxCapsuleShapeDesc->height = shapeNode.readDouble(L"height", 10.0); physicsModel->addShape(nxCapsuleShapeDesc); iShape++; }

void EngineCore::loadNxSphereShapes(XMLNode& physicsModelNode, PhysicsModel* physicsModel) { int iShape = 0; XMLNode shapeNode; while( !(shapeNode = physicsModelNode.getChildNode(L"NxSphereShape", iShape)).isEmpty() ) { NxSphereShapeDesc* nxSphereShapeDesc = new NxSphereShapeDesc(); loadShapeDesc(shapeNode, nxSphereShapeDesc); nxSphereShapeDesc->radius = shapeNode.readDouble(L"radius", 1.0); physicsModel->addShape(nxSphereShapeDesc); iShape++; }

void EngineCore::loadNxPlaneShapes(XMLNode& physicsModelNode, PhysicsModel* physicsModel) { int iShape = 0; XMLNode shapeNode; while( !(shapeNode = physicsModelNode.getChildNode(L"NxPlaneShape", iShape)).isEmpty() ) { NxPlaneShapeDesc* nxPlaneShapeDesc = new NxPlaneShapeDesc(); loadShapeDesc(shapeNode, nxPlaneShapeDesc); nxPlaneShapeDesc->d = shapeNode.readDouble(L"offset"); nxPlaneShapeDesc->normal = shapeNode.readNxVec3(L"normal", NxVec3(0, 1, 0)); physicsModel->addShape(nxPlaneShapeDesc); iShape++; }

void EngineCore::loadPhysicsEntities( XMLNode& groupNode, NodeGroup* group) { int iPhysicsEntity = 0; XMLNode physicsEntityNode; while( !(physicsEntityNode = groupNode.getChildNode(L"PhysicsEntity", iPhysicsEntity)).isEmpty() ) { const wchar_t* shadedMeshName = physicsEntityNode|L"shadedMesh"; ShadedMeshDirectory::iterator iShadedMesh = shadedMeshDirectory.find(shadedMeshName); const wchar_t* physicsModelName = physicsEntityNode|L"physicsModel"; PhysicsModelDirectory::iterator iPhysicsModel = physicsModelDirectory.find(physicsModelName); if(iShadedMesh != shadedMeshDirectory.end() && iPhysicsModel != physicsModelDirectory.end()){ NxVec3 position = physicsEntityNode.readNxVec3(L"position"); PhysicsEntity* physicsEntity = new PhysicsEntity(iShadedMesh->second, iPhysicsModel->second, nxScene, position); group->add(physicsEntity); const wchar_t* entityName = physicsEntityNode|L"name"; if(entityName) entityDirectory[entityName] = physicsEntity; } iPhysicsEntity++; }

Próba Leesik a földre XML-be: Legyen még egy ugyanilyen entitás, valahol fölötte és kicsit odébb Ráesik és leborul