Motor IIII. Vezérlés Szécsi László. Letöltés diák: www.iit.bme.hu/~szecsi/GraphGame //l09-engine4.ppt.

Slides:



Advertisements
Hasonló előadás
A kétdimenziós tömbök Páll Boglárka. Ismétlés: Az egydimenziós tömbök  Meghatározás: A tömb egy olyan összetett adatszerkezet amely több rögzített számú,
Advertisements

Analitikus (koordináta) geometriai gyorstalpaló
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.
Grafikus játékok fejlesztése Szécsi László t14-physics
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.
 Lineáris egyenlet  algebrai egyenlet  konstansok és első fokú ismeretlenek  pl.: egyenes egyenlete  Lineáris egyenletrendszer  lineáris egyenletek.
 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(){
Socket programozás Példák
Basics A few things one must know. Slides Insert a title slide Put a title on it.
Készítsünk el egy olyan egy dokumentumos (SDI) alkalmazást, amely alkalmas a mysql adatbáziskezelővel létrehozott BANK adatbázisunk UGYFEL táblájának.
Kapcsolat az adatabázishoz - Előkészületek // Implementation public: void ReleaseDataBase(); void ConnectDataBase(CString s); virtual ~CBankDoc(); protected:
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.
UNIVERSITY OF SZEGED D epartment of Software Engineering UNIVERSITAS SCIENTIARUM SZEGEDIENSIS Programozás II. 6. Gyakorlat const, static, dinamikus 2D.
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.
Oracle multimédia Kiss Attila Információs Rendszerek Tanszék
Oracle – ORDMS lehetőségek UDT:- objektum típusok - kollekció típusok SQL> CREATE TYPE SZEMELY AS OBJECT ( 2 NEV VARCHAR2(20), 3 TEL VARCHAR2(14)); SQL>
VFP xBase adatkezelés - munkaterületek - DML - DDL - navigáció - eljárások, függvények - vezérlési szerkezetek - változók - képernyő IO - mintaprogram.
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 VI Adatbázisok, MySQL
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;
Windows Server 2008 { PowerShell }
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.
Tervezési példák és ötletek Összeadók Összeadók Vektor szorzás Vektor szorzás Erőforrás megosztás Erőforrás megosztás Összehasonlítók (comparators) Összehasonlítók.
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.
Termikus szimuláció kiegészítés. Heat equation Boundary conditions ­second kind (Neumann) ­third kind (Robin) ­first kind (Dirichlet)
Típusváltás (Type Conversion) n Áttekintés n Példák.
AAO Csink László november.
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ó.
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ó.
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.
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.
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.
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.
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,
 Map  Reduce  Scan  Histogram  Compact const size_t dataSize = 1024; cl_kernel mapKernel = cl.createKernel(clProgram, "map"); float* hData = new.
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.
Készült az ERFP – DD2002 – HU – B – 01 szerzősésszámú projekt támogatásával Chapter 6 / 1 C h a p t e r 6 Elastic Critical Plate Buckling Loads.
Készült az ERFP – DD2002 – HU – B – 01 szerzősésszámú projekt támogatásával Chapter 1 / 1 C h a p t e r 1 Introduction.
Számítógépes Grafika 4. gyakorlat Programtervező informatikus (esti)‏ 2011/2012 őszi félév.
- Group Policy - Group Policy Preferences - Group Policy 4x5 - Optimális munkakörnyezet – az első lépcsőfok.
A sablon nyelvének választása: /Format/Slide Design /majd jobb oldalt válaszd a másik be- ágyazott sablont! Projekt logó beállítása: /View/Master /Slide.
Department of Applied Mechanics – Budapest University of Technology and Economics Magas röptű robotok a mennyezeten Magas röptű robotok a mennyezeten Stépán.
2. gyakorlat DirectX 2007/2008 tavasz Klár Gergely
ELTE-IK, Számítógépes grafika 2./haladó 2. gyakorlat Klár Gergely.
Szebb és használhatóbb programok Vezérlőelemek dinamikus felhelyezése.
Motor IIII. PhysX utáni rendberakás Vezérlés Szécsi László.
03. GYAKORLAT Szervó motor.
Szervó motor helyzetének vezérlése potenciométer segítségével
Ruletták a Minkowski síkon
Függvénysablonok használata
Előadás másolata:

Motor IIII. Vezérlés Szécsi László

Letöltés diák: //l09-engine4.ppt

Új mechanizmus: vezérlés XML fileban definálható vezérlő RigidBodyControl osztály EngineCore-ba directory RigidBody-ba hivatkozás egy vezérlőre RigidBodyControl-ból származtatás –MotorControl –TargetControl betöltés

Új inline class: RigidBodyControl #pragma once class RigidBody; #include "ControlContext.h" /// Base class for rigid body control mechanisms. class RigidBodyControl { public: /// Applies control to the rigid body. Invoked from RigidBody::control, directly manipulates kinematic status. virtual void apply(RigidBody* controlledBody, const ControlContext& context)=0; };

RigidBody-ba class RigidBodyControl; class RigidBody : public Entity { friend class MotorControl; //majd kell RigidBodyControl* controller; public: void setController(RigidBodyControl* controller);

RigidBody.cpp void RigidBody::setController( RigidBodyControl* controller) { this->controller = controller; } RigidBody::RigidBody(ShadedMesh* shadedMesh, RigidModel* rigidModel) :Entity(shadedMesh) { controller = NULL;

Alkalmazzuk #include "RigidBodyControl.h" void RigidBody::control(const ControlContext& context){ force = D3DXVECTOR3(0.0, 0.0, 0.0); torque = D3DXVECTOR3(0.0, 0.0, 0.0); if(controller) controller->apply(this, context); }

Directory.h class RigidBodyControl; typedef std::map RigidBodyControlDirectory; Mielőtt be tudnánk tölteni valamit kell egy konkrét vezérlő

XML: ezt szeretnénk betölteni <Motor key="5" codeType="numpad" force.x="35" force.y="0" force.z="0" /> <Motor key="0" codeType="numpad" force.x="-35" force.y="0" force.z="0" /> <Motor key="7" codeType="numpad" torque.x="1" torque.y="0" torque.z="0" /> <Motor key="9" codeType="numpad" torque.x="-1" torque.y="0" torque.z="0" /> <Motor key="6" codeType="numpad" torque.x="0" torque.y="1" torque.z="0" /> <Motor key="4" codeType="numpad" torque.x="0" torque.y="-1" torque.z="0" /> <Motor key="8" codeType="numpad" torque.x="0" torque.y="0" torque.z="1" /> <Motor key="2" codeType="numpad" torque.x="0" torque.y="0" torque.z="-1" />

XML … …

Új class: MotorControl base: RigidBodyControl #include "RigidBodyControl.h" class Motor; class MotorControl : public RigidBodyControl { /// Container of Motor instances. std::vector motors; public: /// Constructor. MotorControl(void); /// Destructor. Releases Motor instances. ~MotorControl(void); /// Inserts a motor. void addMotor(Motor* motor); void apply(RigidBody* controlledBody, const ControlContext& context); };

Új class: Motor class Motor { friend class MotorControl; friend class WheelControl; /// Activating key. unsigned int key; /// Force applied by motor. D3DXVECTOR3 force; /// Torque applied by motor. D3DXVECTOR3 torque; public: /// Constructor. Motor(unsigned int key, const D3DXVECTOR3& force, const D3DXVECTOR3& torque); };

Motor.cpp Motor::Motor(unsigned int key, const D3DXVECTOR3& force, const D3DXVECTOR3& torque) { this->key = key; this->force = force; this->torque = torque; }

MotorControl.cpp #include "MotorControl.h" #include "RigidBody.h" #include "RigidModel.h" #include "Motor.h" #include "ControlStatus.h" MotorControl::MotorControl(void){} MotorControl::~MotorControl(void) { std::vector ::iterator i = motors.begin(); while(i != motors.end()) { delete *i; i++; } void MotorControl::addMotor(Motor* motor) {motors.push_back(motor); }

MotorControl.cpp void MotorControl::apply(RigidBody* controlledBody, const ControlContext& context) { std::vector ::iterator i = motors.begin(); while(i != motors.end()) { Motor* motor = *i; if(context.controlStatus.keyPressed[motor->key]) { D3DXVECTOR3 worldForce, worldTorque; D3DXVec3TransformNormal(&worldForce, &motor->force, &controlledBody->rotationMatrix); controlledBody->force += worldForce; D3DXVec3TransformNormal(&worldTorque, &motor->torque, &controlledBody->rotationMatrix); controlledBody->torque += worldTorque; } i++;}

EngineCore-ba class MotorControl; //class előtt RigidBodyControlDirectory rigidBodyControlDirectory; void loadMotorControls( XMLNode& xMainNode); void loadMotors( XMLNode& motorControlNode, MotorControl* motorControl);

EngineCore.cpp #include "MotorControl.h" #include "Motor.h"

EngineCore.cpp void EngineCore::loadMotorControls(XMLNode& xMainNode) { int iMotorControl = 0; XMLNode motorControlNode; while( !(motorControlNode = xMainNode.getChildNode(L"MotorControl", iMotorControl)).isEmpty() ) { const wchar_t* motorControlName = motorControlNode|L"name"; MotorControl* motorControl = new MotorControl(); loadMotors(motorControlNode, motorControl); rigidBodyControlDirectory[motorControlName] = motorControl; iMotorControl++; }

EngineCore.cpp void EngineCore::loadMotors(XMLNode& motorControlNode, MotorControl* motorControl) { int iMotor = 0; XMLNode motorNode; while( !(motorNode = motorControlNode.getChildNode(L"Motor", iMotor)).isEmpty() ) { D3DXVECTOR3 force = motorNode.readVector(L"force"); D3DXVECTOR3 torque = motorNode.readVector(L"torque"); unsigned int keyCode = motorNode.readLong(L"key"); const wchar_t* codeTypeString = motorNode|L"codeType"; if(codeTypeString && wcscmp(codeTypeString, L"numpad") == 0) keyCode += VK_NUMPAD0; else if(codeTypeString && wcscmp(codeTypeString, L"function") == 0) keyCode += VK_F1; motorControl->addMotor( new Motor(keyCode, force, torque)); iMotor++; }

EngineCore::loadLevel loadMotorControls(xMainNode); //loadGroup elé

EngineCore::loadRigidBodies rigidBody->setPosition( rigidBodyNode.readVector(L"pos")); const wchar_t* controlName = rigidBodyNode|L"control"; if(controlName){ RigidBodyControlDirectory::iterator iControl = rigidBodyControlDirectory.find(controlName); if(iControl != rigidBodyControlDirectory.end()) rigidBody->setController(iControl->second); }

Mehet! Nehéz dolog az űrhajó-irányítás…

Legyen "légellenállás" Sebességfüggő csillapítás <RigidModel name="ship" invMass="1" invAngularMassX="1" invAngularMassY="1" invAngularMassZ="1" drag.x="0.2" drag.y="1" drag.z="1" angularDrag.x="5" angularDrag.y="5" angularDrag.z="5" />

RigidModel-be /// Coefficients of velocity attenuation. D3DXVECTOR3 drag; /// Coefficients of angular velocity attenuation. D3DXVECTOR3 angularDrag; public: void setDrag(const D3DXVECTOR3& drag); void setAngularDrag(const D3DXVECTOR3& angularDrag);

RigidModel.cpp void RigidModel::setDrag(const D3DXVECTOR3& drag) { this->drag = drag; } void RigidModel::setAngularDrag(const D3DXVECTOR3& angularDrag) { this->angularDrag = angularDrag; }

RigidModel::RigidModel drag = D3DXVECTOR3(0, 0, 0); angularDrag = D3DXVECTOR3(0, 0, 0);

EngineCore::loadRigidModels RigidModel* rigidModel = new RigidModel(invMass, invAngularMassX, invAngularMassY, invAngularMassZ); rigidModel->setDrag( rigidModelNode.readVector(L"drag")); rigidModel->setAngularDrag( rigidModelNode. readVector(L"angularDrag"));

RigidBody::control if(rigidModel->getInvMass() > 0.0) { D3DXMATRIX transposedRotationMatrix; D3DXMatrixTranspose(&transposedRotationMatrix, &rotationMatrix); D3DXVECTOR3 modelMomentum; D3DXVec3TransformNormal(&modelMomentum, &momentum, &transposedRotationMatrix); D3DXVECTOR3 velocity = modelMomentum * rigidModel->getInvMass(); D3DXVECTOR3 modelDragForce = D3DXVECTOR3( velocity.x * rigidModel->drag.x, velocity.y * rigidModel->drag.y, velocity.z * rigidModel->drag.z); modelDragForce *= D3DXVec3Length(&modelDragForce); D3DXVECTOR3 worldDragForce; D3DXVec3TransformNormal(&worldDragForce, &modelDragForce, &rotationMatrix); // folyt.

Visszacsapás megakadályozása double expectedMomentumChange = D3DXVec3Length(&(worldDragForce * context.dt)); double allowedMomentumChange = D3DXVec3Length(&momentum) * 0.5; if( expectedMomentumChange > allowedMomentumChange) worldDragForce *= allowedMomentumChange / expectedMomentumChange; force -= worldDragForce; // folyt.

Ugyanez forgásra D3DXVECTOR3 modelAngularMomentum; D3DXVec3TransformNormal(&modelAngularMomentum, &angularMomentum, &transposedRotationMatrix); D3DXVECTOR3 angularVelocity; D3DXVec3TransformNormal(&angularVelocity, &modelAngularMomentum, &rigidModel->getInvAngularMass()); D3DXVECTOR3 modelDragTorque = D3DXVECTOR3( angularVelocity.x * rigidModel->angularDrag.x, angularVelocity.y * rigidModel->angularDrag.y, angularVelocity.z * rigidModel->angularDrag.z); modelDragTorque *= D3DXVec3Length(&modelDragTorque); D3DXVECTOR3 worldDragTorque; D3DXVec3TransformNormal(&worldDragTorque, &modelDragTorque, &rotationMatrix); double expectedAngularMomentumChange = D3DXVec3Length(&(worldDragTorque * context.dt)); double allowedAngularMomentumChange = D3DXVec3Length(&angularMomentum) * 0.5; if( expectedAngularMomentumChange > allowedAngularMomentumChange ) worldDragTorque *= allowedAngularMomentumChange / expectedAngularMomentumChange; torque -= worldDragTorque; } // endif(rigidModel->getInvMass() > 0.0)

Mehet! Így már könnyebb.