## Character Controller

A place to discuss everything related to Newton Dynamics.

Moderators: Sascha Willems, walaber

### Character Controller

I wanted to make some application using Newton 2.13 for Linux and its CharacterController. Everything compiled and runned well (with just rigid bodies only) but when i tried to add some CC functionality app even don't compiles... I'm using Ubuntu 9.10, easyEclipse 1.3.0 and Newton 2.13.

Here is my source code without everything unnecessary:

Code: Select all
`#include <SFML/Graphics.hpp>#include <Newton/Newton.h>#include <Newton/dMath/dVector.h>#include <Newton/dMath/dMatrix.cpp>#include <Newton/dMath/dQuaternion.h>#include <Newton/dMath/dMathDefines.h>#include <Newton/JointLibrary.h>#include <Newton/dCustomJoints/CustomJointLibraryStdAfx.h>#include <Newton/dCustomJoints/CustomPlayerController.h>#define PLAYER_SPEED      10.0f#define PLAYER_SIDE_SPEED    5.0f#define PLAYER_JOINT_ID      0xEF38AB01void playerMove(CustomPlayerController *player, dFloat velocity, dFloat strafe, dFloat rotation){   velocity *= PLAYER_SPEED;   strafe *= PLAYER_SIDE_SPEED;   player-> SetVelocity(velocity, strafe, rotation);}// add force and torque to rigid bodyvoid  PhysicsApplyGravityForce (const NewtonBody* body, dFloat timestep, int threadIndex){   dFloat Ixx;   dFloat Iyy;   dFloat Izz;   dFloat mass;   NewtonBodyGetMassMatrix (body, &mass, &Ixx, &Iyy, &Izz);   dVector force (0.0f, -mass * 10.0f, 0.0f);   NewtonBodySetForce (body, &force.m_x);}NewtonBody* CreatePlayBody (   NewtonWorld* world,   dFloat mass,   const dMatrix& srcMatrix,   const dVector& size,   int matrixlId){   dFloat Ixx;   dFloat Iyy;   dFloat Izz;   NewtonBody* rigidBody;   NewtonCollision* collision;   dVector origin;   dVector inertia;   dMatrix matrix (srcMatrix);   matrix.m_front = matrix.m_front.Scale (1.0f / dSqrt (matrix.m_front % matrix.m_front));   matrix.m_right = matrix.m_front * matrix.m_up;   matrix.m_right = matrix.m_right.Scale (1.0f / dSqrt (matrix.m_right % matrix.m_right));   matrix.m_up = matrix.m_right * matrix.m_front;   // create the collision   dMatrix location (dRollMatrix(-3.1416f * 0.5f));   collision = NewtonCreateCapsule (world, size.m_y, size.m_x, 0, &location[0][0]);//   collision = NewtonCreateCylinder (world, size.m_y, size.m_x, 0, &location[0][0]);   // calculate the moment of inertia and the relative center of mass of the solid   NewtonConvexCollisionCalculateInertialMatrix (collision, &inertia[0], &origin[0]);   Ixx = mass * inertia[0];   Iyy = mass * inertia[1];   Izz = mass * inertia[2];   //create the rigid body   rigidBody = NewtonCreateBody (world, collision);   // release the collision geometry when not need it   NewtonReleaseCollision (world, collision);   // set the correct center of gravity for this body   NewtonBodySetCentreOfMass (rigidBody, &origin[0]);   // set the mass matrix   NewtonBodySetMassMatrix (rigidBody, mass, Ixx, Iyy, Izz);   // assign the wood id   NewtonBodySetMaterialGroupID (rigidBody, matrixlId);   // set the force and torque call back function   NewtonBodySetForceAndTorqueCallback (rigidBody, PhysicsApplyGravityForce);   // set the matrix for both the rigid body and the graphic body   NewtonBodySetMatrix (rigidBody, &matrix[0][0]);   return rigidBody;}int main(){   NewtonWorld* g_world;    // Create main window    sf::RenderWindow App(sf::VideoMode(800, 600), "мій курсовий кусень коду");    App.PreserveOpenGLStates(true);    // Enable Z-buffer read and write    glEnable(GL_DEPTH_TEST);    glDepthMask(GL_TRUE);    glClearDepth(1.f);    // Setup a perspective projection    glMatrixMode(GL_PROJECTION);    glLoadIdentity();    gluPerspective(90.f, 1.f, 1.f, 500.f);   // Create a clock for measuring the time elapsed    sf::Clock Clock;    g_world = NewtonCreate();    NewtonSetPlatformArchitecture(g_world, 0);    // set a fix world size    dVector minSize (-500.0f, -500.0f, -500.0f);    dVector maxSize ( 500.0f,  500.0f,  500.0f);    NewtonSetWorldSize (g_world, &minSize[0], &maxSize[0]);    // configure the Newton world to use iterative solve mode 0    // this is the most efficient but the less accurate mode    NewtonSetSolverModel (g_world, 1);    // NEWTON CC    CustomPlayerController* player;    NewtonBody* playerBody;    dMatrix location (GetIdentityMatrix());    location.m_posit.m_y = 0;    dFloat kinematicCushion = 1.0f / 64.0f;    dVector size (1.8748f, 0.4885f, 1.0f);    playerBody = CreatePlayBody(g_world, 100, location, size, 0);    // make sure the player is active   dVector pin (0.0f, 1.0f, 0.0f, 0.0f);   dMatrix globalFrame (GetIdentityMatrix());   globalFrame.m_front = dVector (0.0f, 1.0f, 0.0f, 0.0f);        // up direction in global Space   globalFrame.m_up    = dVector (1.0f, 0.0f, 0.0f, 0.0f);        // front direction in global Space   globalFrame.m_right = globalFrame.m_front * globalFrame.m_up;  // strafing direction in global Space   dFloat maxStairStepFactor = 0.7f / size.m_x;   player = new CustomPlayerController(globalFrame, playerBody, maxStairStepFactor, kinematicCushion);    dVector eye, lookat, up;    eye = dVector(0, 250, 40);    lookat  = dVector(0, 0, 0);    up = dVector(0, 1, 0);    // Start game loop    while (App.IsOpened())    {        // Process events        sf::Event Event;        NewtonUpdate(g_world, Clock.GetElapsedTime());        while (App.GetEvent(Event))        {            // Close window : exit            if (Event.Type == sf::Event::Closed)                App.Close();            // Escape key : exit            if ((Event.Type == sf::Event::KeyPressed))                switch (Event.Key.Code)                {                    case sf::Key::Escape:                        App.Close();                    break;                }            // Adjust the viewport when the window is resized            if (Event.Type == sf::Event::Resized)                glViewport(0, 0, Event.Size.Width, Event.Size.Height);         }        // Clear depth buffer        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);        // Apply some transformations        glMatrixMode(GL_MODELVIEW);        glLoadIdentity();        gluLookAt(eye.m_x, eye.m_y, eye.m_z, lookat.m_x, lookat.m_y, lookat.m_z, up.m_x, up.m_y, up.m_z);        // Finally, display the rendered frame on screen        App.Display();    }    // destroy all rigid bodies, this is not necessary because Newton Destroy world will also destroy all bodies      // but if you want to change level and restart you can call this function.      NewtonDestroyAllBodies (g_world);      // finally destroy the newton world      NewtonDestroy (g_world);    return EXIT_SUCCESS;}`

And here is the compiler output:
**** Build of configuration Debug for project myGLApp ****

make all
Building file: ../main.cpp
Invoking: GCC C++ Compiler
g++ -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"main.d" -MT"main.d" -o"main.o" "../main.cpp" -I/usr/include/Newton
#SOME WARNINGS FROM SFML HERE
Finished building: ../main.cpp

Building target: myGLApp
g++ -o"myGLApp" ./main.o -lsfml-graphics -lsfml-window -lpthread -lsfml-system -lGL -lGLU /usr/lib/libNewton.a -I/usr/include/Newton
./main.o: In function `main':
/home/errorist/workspace/myGLApp/Debug/../main.cpp:145: undefined reference to `NewtonCustomJoint::operator new(unsigned int)'
/home/errorist/workspace/myGLApp/Debug/../main.cpp:145: undefined reference to `CustomPlayerController::CustomPlayerController(dMatrix const&, NewtonBody const*, float, float)'
/home/errorist/workspace/myGLApp/Debug/../main.cpp:145: undefined reference to `NewtonCustomJoint::operator delete(void*)'
collect2: ld returned 1 exit status
make: *** [myGLApp] Error 1

Someone, tell me, please, what should i do to make CC work properly...

shybovycha

Posts: 52
Joined: Fri Oct 23, 2009 6:15 am
Location: Poland