Показать сообщение отдельно
Старый 30.06.2010, 18:54   #21
Knightmare
Дэвелопер
 
Регистрация: 14.02.2007
Сообщений: 1,471
Написано 824 полезных сообщений
(для 2,920 пользователей)
Ответ: Ищу сэмлы PhysX для Blitz3d или Xors3D

Сообщение от BlackOut Посмотреть сообщение
ей занимается сам Knightmare, что тут не понятно? Все будет круто и без мата! а Рендер лол со своим врапером! то та!
BBDECL float BBCALL pxWheelSetEntity(float *entity, NxWheelShape* wheel, int step) 
{
    NxWheelContactData contactData;
    NxShape* whShape = wheel->getContact(contactData);
    WheelData* data = (WheelData*)wheel->userData;

            NxReal rollAngle = data->rollAngle;  
            rollAngle += wheel->getAxleSpeed()/gDeltaTime;
            while (rollAngle > NxTwoPi)    //normally just 1x
                rollAngle -= NxTwoPi;
            while (rollAngle < -NxTwoPi)
                rollAngle += NxTwoPi;

            data->rollAngle = rollAngle;
            //memcpy(&(wheel->userData),&rollAngle,4);

            NxMat34 pose;
            pose = wheel->getGlobalPose();

            NxReal r = wheel->getRadius();
            NxReal st = wheel->getSuspensionTravel();
            NxReal steerAngle = wheel->getSteerAngle();
            NxVec3 speed = data->actor->getLinearVelocity();

            NxVec3 p0;
            NxVec3 dir;
            p0 = pose.t;
            pose.M.getColumn(1, dir);
            dir = -dir;    //cast along -Y.

            NxMat33 rot, axisRot;
            rot.rotY(steerAngle);
            axisRot.rotY(0);

            NxMat33 rollRot;
            rollRot.rotX(rollAngle);

            pose.M = pose.M * axisRot*rot * rollRot;

            if (whShape)
            {
                if (step==1) pose.t = contactData.contactPoint + speed/60;
                else pose.t = contactData.contactPoint;
                pose.t -= dir * r;    //go from contact pos to center pos.
            }
            else
            {
                if (!data->actor->isSleeping()) pose.t = p0 + dir * st;
            }

    if (entity)
    {
        NxQuat q;
        pose.M.toQuat(q);

        entity[13] = q.x;
        entity[14] = q.y;
        entity[15] = q.z;
        entity[12] = -q.w;
        entity[16] = pose.t.x;
        entity[17] = pose.t.y;
        entity[18] = pose.t.z;
        int moved = 3;
        entity[11] = *((float*)(&moved));
    }else
    {
        data->posMat = pose;
    }
        return gDeltaTime;

}
Форматирование оригинала сохранено. Сравни:
void pxWorld::ProceedContacts(IBody * body)
{
    // for rigid bodies
    if(body->GetBodyType() == pxBODY_RIGID)
    {
        // cast pointer
        pxBody * rigidBody = (pxBody*)body;
        // if not received contacts from currect iteration
        if(rigidBody->GetLastIteration() != _lastIteration)
        {
            // aclear old contacts
            rigidBody->ClearContacts();
            // check all manifolds
            for(int i = 0; i < _world->getDispatcher()->getNumManifolds(); i++)
            {
                // getting manifold
                btPersistentManifold * contactManifold = _world->getDispatcher()->getManifoldByIndexInternal(i);
                // getting bodies
                btCollisionObject    * body1 = static_cast<btCollisionObject*>(contactManifold->getBody0());
                btCollisionObject    * body2 = static_cast<btCollisionObject*>(contactManifold->getBody1());
                // if checked body used in manifold
                if(body1 == rigidBody->GetBody() || body2 == rigidBody->GetBody())
                {
                    // add all contact points into body
                    for(int j = 0; j < contactManifold->getNumContacts(); j++)
                    {
                        // getting contact point
                        btManifoldPoint & contactPoint = contactManifold->getContactPoint(j);
                        // add contact
                        btVector3 point  = contactPoint.getPositionWorldOnB();
                        btVector3 normal = contactPoint.m_normalWorldOnB;
                        rigidBody->AddContact(body1 == rigidBody->GetBody() ? body2 : body1,
                                              point.x(), point.y(), point.z(),
                                              normal.x(), normal.y(), normal.z(),
                                              contactPoint.getDistance());
                    }
                }
            }
            // reset iteration number
            rigidBody->SetLastIteration(_lastIteration);
        }
    }
}
но в релизе нет физики, только в апдейтах на Hot Area, правильно понимаю?
Если ты будешь ждать версии 1.16 то у меня для тебя плохие новости. На http://hot.xors3d.com выкладываются также стабильные сборки.
(Offline)
 
Ответить с цитированием