Войти
ПрограммированиеФорумФизика

PhysX создание объекта

#0
9:22, 19 окт. 2007

При создание актера мы должны указать либо плотность и PhysX посчитает массу сам либо сразу массу. И то и другое одновременно указывать нельзя:

//Создаём SceneNode & Entity
ent = OgreX::OgreX_world::getSingleton().getActiveSceneMgr()->createEntity(mName, mMeshName);
node = OgreX::OgreX_world::getSingleton().getActiveSceneMgr()->getRootSceneNode()->createChildSceneNode(mName);
node->setPosition(pos);
node->attachObject(ent);

NxActor *actor;

NxActorDesc actorDesc;
NxBodyDesc bodyDesc;
actorDesc.setToDefault();
bodyDesc.setToDefault();

//Получаем размеры объекта
Ogre::AxisAlignedBox bBox;
bBox = ent->getBoundingBox();
bBox.scale(node->getScale());

Ogre::Vector3 max = bBox.getMaximum();
Ogre::Vector3 min = bBox.getMinimum();
Ogre::Vector3 size = max - min;

NxBoxShapeDesc shapeDesc;
//shapeDesc.setToDefault();
shapeDesc.dimensions.set(toNx(size / 2));
if (_material != NULL)
shapeDesc.materialIndex = _material->getMaterialIndex();
actorDesc.shapes.push_back(&shapeDesc);

if (_objgroup == Dynamic)
actorDesc.body = &bodyDesc;

if (_objgroup == Static || _objgroup == Kinematic )
actorDesc.body = NULL;

actorDesc.density = _density;
actorDesc.globalPose.t = toNx(node->getWorldPosition());

Ogre::Quaternion q = node->getWorldOrientation();
actorDesc.globalPose.M.fromQuat(toNx(q));

actor = mScene->mScene->createActor(actorDesc);
actor->setName( mName.data() );

actor->userData = node;

if (_objgroup == Kinematic)
actor->raiseBodyFlag(NX_BF_KINEMATIC);

Вообщем я хочу задавать сразу массу, а ни плотность. Но вот в чем проблема: если я убираю
actorDesc.density = _density;  а вместо этого делаю actor->setMass(50.0f);, то получаю ошибку  причем ошибка на
actor = mScene->mScene->createActor(actorDesc);  И еще такую фишку заметил, что я могу указать и плотность и массу !


Прошло более 3 лет
#1
23:37, 3 авг. 2011

Приветствую!
Подскажите в чём может бы ть проблема.

Пишу прогу на C++ Builder 2010, PhysX использую через библиотеку написаную на Visual C++ 2010.

На ОС Winows 7 появляется ошибка при создании Convex актёра, НО не всегда, на Windows XP SP3 (другой комп.) ошибка почти не появляется.

Выскакивает
Изображение

Вот часть классов которые использую.

Класс вершины:

class C_Vector3
{
public:
  GLfloat x;
  GLfloat y;
  GLfloat z;
        
  C_Vector3() {x = 0.0f; y = 0.0f; z = 0.0f;}
};

Класс формы физической модели

class C_MeshPhysX
{
public:
  unsigned short int iVertex;
  C_Vector3 * pVertex;
  
  unsigned short int iFace;
  unsigned long int *pFace;

  C_MeshPhysX()  { iVertex = 0; pVertex = 0; iFace = 0; pFace= 0; };
  ~C_MeshPhysX()  { delete [] pVertex; delete [] pFace; };

    void operator=(C_MeshPhysX &In)
    {
        iVertex = In.iVertex;
        pVertex = new C_Vector3[iVertex];
        for (int i= 0; i < iVertex; i++)
        {
            pVertex[i] = In.pVertex[i];
        }

        iFace = In.iFace;
        pFace = new unsigned long int[iFace];
        for (int i= 0; i < iFace; i++)
        {
            pFace[i] = In.pFace[i];
        }
    }
};

Вот метод инициализации PhysX:

void C_PhysX::InitNx()
{
    // Create the physics SDK
    gPhysicsSDK = NxCreatePhysicsSDK(NX_PHYSICS_SDK_VERSION);
  if (!gPhysicsSDK)
    {
      MessageBoxA(0, "PhysX НЕ работает!", "ERROR", MB_OK|MB_ICONEXCLAMATION);
      return;
    }

    // Set the physics parameters
  gPhysicsSDK->setParameter(NX_SKIN_WIDTH, 0.01f);

    // Set the debug visualization parameters
  gPhysicsSDK->setParameter(NX_VISUALIZATION_SCALE, 1); // для вычисления толщины поверхностей
  gPhysicsSDK->setParameter(NX_VISUALIZE_COLLISION_SHAPES, 1);
  gPhysicsSDK->setParameter(NX_VISUALIZE_ACTOR_AXES, 1);
  gPhysicsSDK->setParameter(NX_VISUALIZE_COLLISION_FNORMALS, 1);

  gPhysicsSDK->setParameter(NX_VISUALIZE_CONTACT_POINT, 1);
  gPhysicsSDK->setParameter(NX_VISUALIZE_CONTACT_NORMAL, 1);
  gPhysicsSDK->setParameter(NX_VISUALIZE_CONTACT_ERROR, 1);
  gPhysicsSDK->setParameter(NX_VISUALIZE_CONTACT_FORCE, 1);
  
    // Create the scene
    NxSceneDesc sceneDesc;
  sceneDesc.simType  = NX_SIMULATION_SW; // NX_SIMULATION_SW используется софт ( NX_SIMULATION_HW - аппаратно)
    sceneDesc.gravity  = gDefaultGravity;

    gScene = gPhysicsSDK->createScene(sceneDesc); // To create the SDK object
  sceneDesc.flags |= NX_SF_ENABLE_ACTIVETRANSFORMS;

    // Create the default material
  NxMaterial* defaultMaterial = gScene->getMaterialFromIndex(0); 
  defaultMaterial->setRestitution(0.5); // субстанций со средней упругостью restitution=0.5
  defaultMaterial->setStaticFriction(0.5); // средним трением покоя static friction=0.5 (статическое трение)
  defaultMaterial->setDynamicFriction(0.5); // средним трением скольжения dynamic friction=0.5 (динамическое трение)

  NxReal myTimestep = 1.0f/60.0f;
  gScene->setTiming(myTimestep / 4.0f, 4, NX_TIMESTEP_FIXED);
   
  UpdateTime(); // Get the current time #include "UpdateTime.h"
    if (gScene)  StartPhysics(); // Start the first frame of the simulation
  
}

И вот так создаётся Convex актёр.
Класс C_Array по сути указатель на динамический массив с использованием шаблона.

void C_PhysX::actorDescShapes (NxConvexShapeDesc &convexShapeDesc, C_MeshPhysX &Mesh)
{
    NxConvexMeshDesc* convexDesc  = NULL;

      // Create descriptor for convex mesh
    convexDesc  = new NxConvexMeshDesc();
    assert(convexDesc);

    convexDesc->numVertices      = Mesh.iVertex;
    convexDesc->pointStrideBytes  = sizeof(float)*3;
    convexDesc->points        = Mesh.pVertex;

    convexDesc->flags        = NX_CF_COMPUTE_CONVEX;

    convexShapeDesc.localPose.t    = NxVec3(0, 0, 0);
    convexShapeDesc.userData    = convexDesc;
 
      // Two ways on cooking mesh: 1. Saved in memory, 2. Saved in file  
    NxInitCooking();
      // Cooking from memory
    MemoryWriteBuffer buf;
      //bool status =
    NxCookConvexMesh(*convexDesc, buf);

    NxConvexMesh *pMesh      = gPhysicsSDK->createConvexMesh(MemoryReadBuffer(buf.data));


    assert(pMesh);    //------------------------------------------------------------------ СТРОКА 126


    convexShapeDesc.meshData  = pMesh;
    NxCloseCooking();

      // Save mesh in userData for drawing.
    pMesh->saveToDesc(*convexDesc);
    assert(convexShapeDesc.isValid());
}

//--------------------------------------------------------------------------------------------

NxActor* C_PhysX::CreateConvex(C_Array < C_MeshPhysX > &aMesh, float density)
{
  NxActorDesc actorDesc;
  NxBodyDesc bodyDesc;
//-----------------------------------------------------------------------------------------------
  if ( aMesh.GetSize() == 0 ) return 0;
  if ( aMesh[0].iVertex == 0 ) return 0;

  for (int i = 0; i < aMesh.GetSize(); i++ )
  {
    NxConvexShapeDesc *convexShapeDesc = new NxConvexShapeDesc;
    actorDescShapes(*convexShapeDesc, aMesh[i]);
    actorDesc.shapes.pushBack(convexShapeDesc);
  }
//-----------------------------------------------------------------------------------------------
  actorDesc.body    = &bodyDesc;
  actorDesc.density  = density;   
  actorDesc.globalPose.t = NxVec3(0, 0, 0);  
  assert(actorDesc.isValid());

  NxActor* actor = gScene->createActor(actorDesc);
  assert(actor);  

  return actor;
}

Буду благодарен если поможете решить проблему.

#2
8:34, 4 авг. 2011

smt005
Переустановить драйвера Физикса.

#3
14:33, 6 авг. 2011

Не помогло!

Скачал PhysX 3, буду на него переходить.

Только у меня с подключениемвсякие проблемы возникают...

#4
3:55, 12 авг. 2011

Кончай извращаться, переходи на нормальный С++, билдер это не серьёзно и графикой/физикой на нём заниматься пустое дело, и очень не благодарное

#5
11:05, 28 авг. 2011

Я делаю редактро, на Builder его легче сделать, поэтому я так извращаюсь.

А проблема не в Builder а в самом PhysX или в моём коде.

ПрограммированиеФорумФизика

Тема в архиве.