37
Motor III. Merev test animáció Szécsi László

Motor III. Merev test animáció Szécsi László. Letöltés diák: szecsi/GraphGame //l08-engine3.ppt

Embed Size (px)

DESCRIPTION

RigidModel és RigidBody Osztályok: RigidModel 1/m, I -1 később ütközés, légellenállás RigidBody rigidModel hivatkozás x, L, q, P EngineCore: RigidModelDirectory RigidBody-k meg mehetnek az entitások közé

Citation preview

Page 1: Motor III. Merev test animáció Szécsi László. Letöltés diák: szecsi/GraphGame //l08-engine3.ppt

Motor III.Merev test animáció

Szécsi László

Page 2: Motor III. Merev test animáció Szécsi László. Letöltés diák: szecsi/GraphGame //l08-engine3.ppt

Letöltés

diák:www.iit.bme.hu/~szecsi/GraphGame/l08-engine3.ppt

Page 3: Motor III. Merev test animáció Szécsi László. Letöltés diák: szecsi/GraphGame //l08-engine3.ppt

RigidModel és RigidBodyOsztályok:RigidModel

1/m, I-1

később ütközés, légellenállásRigidBody

rigidModel hivatkozásx, L, q, P

EngineCore: RigidModelDirectoryRigidBody-k meg mehetnek az entitások közé

Page 4: Motor III. Merev test animáció Szécsi László. Letöltés diák: szecsi/GraphGame //l08-engine3.ppt

RigidModelclass RigidModel{friend class RigidBody;

/// Inverse of physical mass.double invMass;/// Inverse of mass moments of inertia matrix.D3DXMATRIX invAngularMass;

public:

Page 5: Motor III. Merev test animáció Szécsi László. Letöltés diák: szecsi/GraphGame //l08-engine3.ppt

RigidModelRigidModel( double invMass, double invAngularMassX, double invAngularMassY, double invAngularMassZ);

/// Returns 1/mass.double getInvMass();/// Returns the inverse of the moments of inertia matrix.const D3DXMATRIX& getInvAngularMass();

};

Page 6: Motor III. Merev test animáció Szécsi László. Letöltés diák: szecsi/GraphGame //l08-engine3.ppt

RigidModel.cppRigidModel::RigidModel( double invMass, double invAngularMassX, double invAngularMassY, double invAngularMassZ)

{this->invMass = invMass;D3DXMatrixScaling(&invAngularMass, invAngularMassX, invAngularMassY, invAngularMassZ);centreOfMass = D3DXVECTOR3(0, 0, 0);drag = D3DXVECTOR3(0, 0, 0);angularDrag = D3DXVECTOR3(0, 0, 0);

}

Page 7: Motor III. Merev test animáció Szécsi László. Letöltés diák: szecsi/GraphGame //l08-engine3.ppt

RigidModel.cppdouble RigidModel::getInvMass(){return invMass;

}

const D3DXMATRIX& RigidModel::getInvAngularMass()

{return invAngularMass;

}

Page 8: Motor III. Merev test animáció Szécsi László. Letöltés diák: szecsi/GraphGame //l08-engine3.ppt

RigidBodyclass RigidModel;

class RigidBody : public Entity{/// Physics model reference.RigidModel* rigidModel;

Page 9: Motor III. Merev test animáció Szécsi László. Letöltés diák: szecsi/GraphGame //l08-engine3.ppt

RigidBody/// Position. [x]D3DXVECTOR3 position;/// Orientation. [q]D3DXQUATERNION orientation;

/// Momentum. [L] (lendület)D3DXVECTOR3 momentum;/// Angular momentum. [P] (perdület)D3DXVECTOR3 angularMomentum;

Page 10: Motor III. Merev test animáció Szécsi László. Letöltés diák: szecsi/GraphGame //l08-engine3.ppt

RigidBody/// Force. [F]D3DXVECTOR3 force;/// Torque. [tau = r x F]D3DXVECTOR3 torque;

/// Auxiliary roataion matrix computed from orientation. [R]D3DXMATRIX rotationMatrix;

Page 11: Motor III. Merev test animáció Szécsi László. Letöltés diák: szecsi/GraphGame //l08-engine3.ppt

RigidBodypublic:/// Constructor.RigidBody(ShadedMesh* shadedMesh, RigidModel* rigidModel);

virtual void render(const RenderContext& context);

virtual void animate(double dt);virtual void control(const ControlContext& context);

Page 12: Motor III. Merev test animáció Szécsi László. Letöltés diák: szecsi/GraphGame //l08-engine3.ppt

RigidBodyvoid setPosition(const D3DXVECTOR3& position);void setAngularMomentum(const D3DXVECTOR3& am);

/// Returns model matrix to be used by lights and camera attached to the entity.virtual void getModelMatrix(D3DXMATRIX& modelMatrix);

/// Returns the inverse of the model matrix.virtual void getModelMatrixInverse(D3DXMATRIX& modelMatrixInverse);

/// Returns the inverse of the rotation matrix.virtual void getRotationMatrixInverse(D3DXMATRIX& rotationMatrixInverse);void getWorldInvMassMatrix(D3DXMATRIX& wim);

};

Page 13: Motor III. Merev test animáció Szécsi László. Letöltés diák: szecsi/GraphGame //l08-engine3.ppt

RigidBody.cpp#include "RigidModel.h"#include "ShadedMesh.h"#include "Camera.h"

RigidBody::RigidBody(ShadedMesh* shadedMesh, RigidModel* rigidModel)

:Entity(shadedMesh){

this->rigidModel = rigidModel;position = D3DXVECTOR3(0.0f, 0.0f, 0.0f);orientation = D3DXQUATERNION(0.0f, 0.0f, 0.0f, 1.0f);

momentum = D3DXVECTOR3(0.0f, 0.0f, 0.0f);angularMomentum = D3DXVECTOR3(0.0f, 0.0f, 0.0f);

force = D3DXVECTOR3(0.0f, 0.0f, 0.0f);torque = D3DXVECTOR3(0.0f, 0.0f, 0.0f);

D3DXMatrixRotationQuaternion(&rotationMatrix, &orientation);}

Page 14: Motor III. Merev test animáció Szécsi László. Letöltés diák: szecsi/GraphGame //l08-engine3.ppt

RigidBody.cppvoid RigidBody::render(const RenderContext& context){

D3DXMATRIX positionMatrix;D3DXMatrixTranslation(&positionMatrix, position.x, position.y, position.z);

D3DXMATRIX bodyModelMatrix = rotationMatrix * positionMatrix;D3DXMATRIX bodyModelMatrixInverse;D3DXMatrixInverse(&bodyModelMatrixInverse, NULL, &bodyModelMatrix);

context.effect->SetMatrix("modelMatrix", &bodyModelMatrix);context.effect->SetMatrix("modelMatrixInverse", &bodyModelMatrixInverse);

D3DXMATRIX modelViewProjMatrix = bodyModelMatrix * context.camera->getViewMatrix() * context.camera->getProjMatrix();context.effect->SetMatrix("modelViewProjMatrix", &modelViewProjMatrix);

D3DXMATRIX modelViewMatrix = bodyModelMatrix * context.camera->getViewMatrix();context.effect->SetMatrix("modelViewMatrix", &modelViewMatrix);

shadedMesh->render(context);}

Page 15: Motor III. Merev test animáció Szécsi László. Letöltés diák: szecsi/GraphGame //l08-engine3.ppt

RigidBody.cppvoid RigidBody::animate(double dt){momentum += force * dt;D3DXVECTOR3 velocity = momentum * rigidModel->invMass;position += velocity * dt;

angularMomentum += torque * dt;

Page 16: Motor III. Merev test animáció Szécsi László. Letöltés diák: szecsi/GraphGame //l08-engine3.ppt

animate folyt.// compute inverse mass matrixD3DXMATRIX worldSpaceInvMassMatrix;getWorldInvMassMatrix(worldSpaceInvMassMatrix);// compute angular velocity vectorD3DXVECTOR3 angularVelocity;D3DXVec3TransformCoord(&angularVelocity,

&angularMomentum, &worldSpaceInvMassMatrix);// compute rotation happening in dt timefloat rotationsPerSecond = D3DXVec3Length(&angularVelocity);D3DXQUATERNION angularDifferenceQuaternion;D3DXQuaternionRotationAxis(

&angularDifferenceQuaternion, &angularVelocity, rotationsPerSecond * 6.28 * dt);

// append rotation to orientationorientation *= angularDifferenceQuaternion;D3DXMatrixRotationQuaternion

(&rotationMatrix, &orientation);}

Page 17: Motor III. Merev test animáció Szécsi László. Letöltés diák: szecsi/GraphGame //l08-engine3.ppt

RigidBody.cppVoidRigidBody::getWorldInvMassMatrix(D3DXMATRIX& wim)

{D3DXMATRIX transposedRotationMatrix;

D3DXMatrixTranspose(&transposedRotationMatrix, &rotationMatrix);wim = transposedRotationMatrix * rigidModel->invAngularMass * rotationMatrix;

}

Page 18: Motor III. Merev test animáció Szécsi László. Letöltés diák: szecsi/GraphGame //l08-engine3.ppt

RigidBody::controlvoid RigidBody::control(const ControlContext& context)

{force = D3DXVECTOR3(0.0, 0.0, 0.0);torque = D3DXVECTOR3(0.0, 0.0, 0.0);

//gravityif(rigidModel->invMass > 0.0)

force += D3DXVECTOR3(0.0, -10.0 / rigidModel->invMass, 0.0);

}

Page 19: Motor III. Merev test animáció Szécsi László. Letöltés diák: szecsi/GraphGame //l08-engine3.ppt

RigidBody.cppvoid RigidBody::setPosition(const D3DXVECTOR3& position)

{this->position = position;

}

void RigidBody::setAngularMomentum(const D3DXVECTOR3& am)

{this->angularMomentum = am;

}

Page 20: Motor III. Merev test animáció Szécsi László. Letöltés diák: szecsi/GraphGame //l08-engine3.ppt

RigidBody.cppvoid RigidBody::getModelMatrix(D3DXMATRIX& modelMatrix){

D3DXMATRIX positionMatrix;D3DXMatrixTranslation(&positionMatrix, position.x, position.y, position.z);

modelMatrix = rotationMatrix * positionMatrix;}

void RigidBody::getModelMatrixInverse(D3DXMATRIX& modelMatrixInverse){

D3DXMATRIX positionMatrix, rotationMatrixTransposed;D3DXMatrixTranslation(&positionMatrix, -position.x, -position.y, -position.z);D3DXMatrixTranspose(&rotationMatrixTransposed, &rotationMatrix);

modelMatrixInverse = positionMatrix * rotationMatrixTransposed;}

void RigidBody::getRotationMatrixInverse(D3DXMATRIX& rotationMatrixInverse){

D3DXMatrixTranspose(&rotationMatrixInverse, &rotationMatrix);}

Page 21: Motor III. Merev test animáció Szécsi László. Letöltés diák: szecsi/GraphGame //l08-engine3.ppt

XML<RigidModel name="ship" invMass="1" invAngularMassX="1" invAngularMassY="1" invAngularMassZ="1" />

<Group> <RigidBody name="flagShip" shadedMesh="steelPredator" rigidModel="ship" control="player"/>

</Group>

Page 22: Motor III. Merev test animáció Szécsi László. Letöltés diák: szecsi/GraphGame //l08-engine3.ppt

Directory.hclass RigidModel;typedef std::map<const std::wstring, RigidModel*> RigidModelDirectory;

Page 23: Motor III. Merev test animáció Szécsi László. Letöltés diák: szecsi/GraphGame //l08-engine3.ppt

EngineCoreRigidModelDirectoryrigidModelDirectory;

void loadRigidModels(XMLNode& xMainNode);

void loadRigidBodies(XMLNode& groupNode, NodeGroup* group);

Page 24: Motor III. Merev test animáció Szécsi László. Letöltés diák: szecsi/GraphGame //l08-engine3.ppt

loadLevelloadRigidModels(xMainNode);

// még az entitások betöltése előtt

Page 25: Motor III. Merev test animáció Szécsi László. Letöltés diák: szecsi/GraphGame //l08-engine3.ppt

EngineCore.cpp#include "RigidModel.h"#include "RigidBody.h"

void EngineCore::loadRigidModels(XMLNode& xMainNode){int iRigidModel = 0;XMLNode rigidModelNode;while(!(rigidModelNode=xMainNode.getChildNode(L"RigidModel",

iRigidModel)).isEmpty()){

const wchar_t* rigidModelName = rigidModelNode|L"name";double invMass = rigidModelNode.readDouble(L"invMass");double invAngularMassX = rigidModelNode.readDouble(L"invAngularMassX");double invAngularMassY = rigidModelNode.readDouble(L"invAngularMassY");double invAngularMassZ = rigidModelNode.readDouble(L"invAngularMassZ");

RigidModel* rigidModel = new RigidModel(invMass, invAngularMassX, invAngularMassY, invAngularMassZ);

rigidModelDirectory[rigidModelName] = rigidModel;iRigidModel++;

}

}

Page 26: Motor III. Merev test animáció Szécsi László. Letöltés diák: szecsi/GraphGame //l08-engine3.ppt

EngineCore.cppvoid EngineCore::loadRigidBodies(XMLNode& groupNode, NodeGroup* group){int iRigidBody = 0;XMLNode rigidBodyNode;while( !(rigidBodyNode =

groupNode.getChildNode(L"RigidBody", iRigidBody)).isEmpty() ){ const wchar_t* shadedMeshName = rigidBodyNode|L"shadedMesh"; ShadedMeshDirectory::iterator iShadedMesh =

shadedMeshDirectory.find(shadedMeshName); const wchar_t* rigidModelName = rigidBodyNode|L"rigidModel"; RigidModelDirectory::iterator iRigidModel =

rigidModelDirectory.find(rigidModelName); if(iShadedMesh != shadedMeshDirectory.end() &&

iRigidModel != rigidModelDirectory.end()) {

RigidBody* rigidBody =new RigidBody(iShadedMesh->second, iRigidModel->second);

rigidBody->setPosition(rigidBodyNode.readVector(L"pos"));group->add(rigidBody);const wchar_t* entityName = rigidBodyNode|L"name";if(entityName)

entityDirectory[entityName] = rigidBody; } iRigidBody++;}}

Page 27: Motor III. Merev test animáció Szécsi László. Letöltés diák: szecsi/GraphGame //l08-engine3.ppt

EngineCore.cppvoid EngineCore::loadGroup(XMLNode& groupNode, NodeGroup*& group)

{if(groupNode.isEmpty())

return;

group = new NodeGroup();

loadEntities(groupNode, group);loadRigidBodies(groupNode, group);

}

Page 28: Motor III. Merev test animáció Szécsi László. Letöltés diák: szecsi/GraphGame //l08-engine3.ppt

PróbaNem történik semmi

control-t nem hívjuk még

Page 29: Motor III. Merev test animáció Szécsi László. Letöltés diák: szecsi/GraphGame //l08-engine3.ppt

Új class: ControlContextHagyjuk üresen,

EngineCore:#include "ControlContext.h"

void EngineCore::animate(double dt, double t){currentCamera->second->animate(dt);sceneRoot->control(ControlContext());sceneRoot->animate(dt);

}

Page 30: Motor III. Merev test animáció Szécsi László. Letöltés diák: szecsi/GraphGame //l08-engine3.ppt

PróbaZuhan

Játék a RigidBody::controlban

Pl.

torque.x += 1;torque.y += 1;

Page 31: Motor III. Merev test animáció Szécsi László. Letöltés diák: szecsi/GraphGame //l08-engine3.ppt

VezérlésControlStatus osztály

Billentyűlenyomások, egérgombok és egérpozíció nyilvántartása

EngineCore-ba:ControlStatus status;

Page 32: Motor III. Merev test animáció Szécsi László. Letöltés diák: szecsi/GraphGame //l08-engine3.ppt

ControlStatusclass ControlStatus{public:

/// Array of key pressed state variables. Addressed by virtual key codes, true if key is pressed.bool keyPressed[0xff];/// Mouse pointer position in normalized screen space.D3DXVECTOR3 mousePosition;/// Pressed state variable of left, center and right mouse buttons.bool mouseButtonPressed[3];

/// Screen width. Not set by constructor.unsigned int screenWidth;/// Screen height. Not set by constructor.unsigned int screenHeight;

/// Updates input state by processing message.virtual void handleInput(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);

/// Constructor. Intializes input state.ControlStatus();

};

Page 33: Motor III. Merev test animáció Szécsi László. Letöltés diák: szecsi/GraphGame //l08-engine3.ppt

ControlStatus.cpp#include "DXUT.h"#include "ControlStatus.h"

ControlStatus::ControlStatus(){

for(unsigned int i=0; i<0xff; i++)keyPressed[i] = false;

mouseButtonPressed[0] = false;mouseButtonPressed[1] = false;mouseButtonPressed[2] = false;mousePosition = D3DXVECTOR3(0, 0, 0);

}

void ControlStatus::handleInput(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam){

if(uMsg == WM_KEYDOWN)keyPressed[wParam] = true;

else if(uMsg == WM_KEYUP)keyPressed[wParam] = false;

else if(uMsg == WM_KILLFOCUS){

for(unsigned int i=0; i<0xff; i++)keyPressed[i] = false;

}else if(uMsg == WM_MOUSEMOVE){

POINT pixPos;if(GetCursorPos(&pixPos))

mousePosition = D3DXVECTOR3((double)pixPos.x / screenWidth * 2.0 - 1.0, (double)pixPos.y / screenHeight * 2.0 - 1.0, 0);}

}

Page 34: Motor III. Merev test animáció Szécsi László. Letöltés diák: szecsi/GraphGame //l08-engine3.ppt

EngineCore::processMessage

void EngineCore::processMessage(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)

{

currentCamera->second->handleInput(hWnd, uMsg,

wParam, lParam);status.handleInput(hWnd, uMsg, wParam, lParam);

}

Page 35: Motor III. Merev test animáció Szécsi László. Letöltés diák: szecsi/GraphGame //l08-engine3.ppt

ControlContextclass ControlStatus;class Node;

class ControlContext{public: const ControlStatus& controlStatus;

/// Time step.double dt;/// Scene graph reference for interaction computations.Node* interactors;

ControlContext(const ControlStatus& controlStatus,double dt,Node* interactors):controlStatus(controlStatus)

{this->dt = dt;this->interactors = interactors;

}};

Page 36: Motor III. Merev test animáció Szécsi László. Letöltés diák: szecsi/GraphGame //l08-engine3.ppt

Létrehozásavoid EngineCore::animate(double dt, double t)

{currentCamera->second->animate(dt);sceneRoot->control(ControlContext(status, dt, sceneRoot));sceneRoot->animate(dt);

}

Page 37: Motor III. Merev test animáció Szécsi László. Letöltés diák: szecsi/GraphGame //l08-engine3.ppt

RigidBody::control játék#include "ControlContext.h"#include "ControlStatus.h"

if(context.controlStatus.keyPressed['U'])force.y += 100;