5. PhysX Materials

Jump To:
main.cpp Source
Download

Main.CPP File:

For our fifth PhysX tutorial, we’re going to look at the default material in our scene. This is where we control how bouncy and grippy objects are by setting restitution, static friction and dynamic friction. It’s a small amount of code, but these values make a huge difference once objects start colliding.

NxMaterial* defaultMaterial = gScene->getMaterialFromIndex(0);
defaultMaterial->setRestitution(0.5);
defaultMaterial->setStaticFriction(0.5);
defaultMaterial->setDynamicFriction(0.5);

That gives us a simple default material to work with. A restitution of 0.5 gives some bounce, while the friction values give surfaces some resistance instead of making everything feel like it is sliding around on ice.

#include <cstdlib>
#include <stdio.h>
#include <GL/glut.h>
#include <GL/gl.h>
#define NOMINMAX
#include <windows.h>
#include <Physics/include/NxPhysics.h>

#pragma comment(lib, "PhysXLoader.lib")
#pragma comment(lib, "NxCharacter.lib")
#pragma comment(lib, "NxCooking.lib")
#pragma comment(lib, "NxExtensions.lib")

static NxPhysicsSDK *gPhysicsSDK = NULL;
NxScene *gScene = NULL;

void deinitNX(void) {
    if (gScene != NULL && gPhysicsSDK != NULL) {
        gPhysicsSDK->releaseScene(*gScene);
        gScene = NULL;
    }
    if (gPhysicsSDK != NULL) {
        gPhysicsSDK->release();
        gPhysicsSDK = NULL;
    }
}

bool initNX(void) {
    gPhysicsSDK = NxCreatePhysicsSDK(NX_PHYSICS_SDK_VERSION);
    if (gPhysicsSDK == NULL) {
        return false;
    }

    gPhysicsSDK->setParameter(NX_SKIN_WIDTH, 0.01f);

    NxSceneDesc sceneDesc;
    sceneDesc.gravity.set(0.0f, -9.8f, 0.0f);
    // PhysX 2.7-era software simulation mode.
    sceneDesc.simType = NX_SIMULATION_SW;
    gScene = gPhysicsSDK->createScene(sceneDesc);
    if (gScene == NULL) {
        deinitNX();
        return false;
    }

    NxMaterial *defaultMaterial = gScene->getMaterialFromIndex(0);
    defaultMaterial->setRestitution(0.5f);
    defaultMaterial->setStaticFriction(0.5f);
    defaultMaterial->setDynamicFriction(0.5f);

    return true;
}

void display(void) {
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
    glLoadIdentity();
    glutSwapBuffers();
}

void reshape(int w, int h) {
    if (h == 0) h = 1;
    glViewport(0, 0, (GLsizei)w, (GLsizei)h);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(60.0, (GLfloat)w / (GLfloat)h, 0.1, 100.0);
    glMatrixMode(GL_MODELVIEW);
}

int main(int argc, char **argv) {
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH | GLUT_STENCIL);
    glutInitWindowSize(500, 500);
    glutInitWindowPosition(100, 100);
    glutCreateWindow("Physics");
    glEnable(GL_DEPTH_TEST);

    if (!initNX()) {
        return 1;
    }
    std::atexit(deinitNX);

    glutDisplayFunc(display);
    glutIdleFunc(display);
    glutReshapeFunc(reshape);
    glutMainLoop();
    return 0;
}

Source & downloads

Questions or corrections? If something doesn’t work or you spot something I’ve got wrong, leave a comment below. These tutorials have been around a long time, so useful corrections are always welcome!

  • March 25, 2010