how to use btSoftBodyHelpers::CreatePatchUV() ?

Post Reply
yaoyansi
Posts: 17
Joined: Thu Jan 01, 2009 2:14 pm

how to use btSoftBodyHelpers::CreatePatchUV() ?

Post by yaoyansi »

hi, all
Could you tell me how to use btSoftBodyHelpers::CreatePatchUV() ? There is no demo in bullet on this function. I have a problem of how to create a skit on a skinned character, but i don't know whether this function can solve my problem.
neothemachine
Posts: 2
Joined: Tue May 17, 2011 7:55 pm

Re: how to use btSoftBodyHelpers::CreatePatchUV() ?

Post by neothemachine »

I'm wondering about the same function. It would be nice if a developer could shed some light on it. Thanks!
mi076
Posts: 144
Joined: Fri Aug 01, 2008 6:36 am
Location: Bonn, Germany

Re: how to use btSoftBodyHelpers::CreatePatchUV() ?

Post by mi076 »

Here is an example:
use like CreatePatch() and provide a pointer to array to hold texture coordinates.

Code: Select all

int resolution_x = 10;
int resolution_y = 10;
const btScalar half_width = btScalar(10.0);
const btScalar length      = btScalar(20.0);
const btScalar pos_x      = btScalar(-15.0);
const btScalar pos_y      = btScalar(30.0);
const btScalar pos_z      = btScalar(-50.0);
float * tex_coords = new float[ (resolution_x - 1)*(resolution_y -1)*12 ];

btSoftBody * sb = btSoftBodyHelpers::CreatePatchUV(soft_body_world_info,
                                  btVector3(pos_x - half_width,
                                            pos_y,
                                            pos_z),
                                  btVector3(pos_x + half_width,
                                            pos_y,
                                            pos_z),
                                  btVector3(pos_x - half_width,
                                            pos_y - length,
                                            pos_z + btScalar(0.0)),
                                  btVector3(pos_x + half_width,
                                            pos_y - length,
                                            pos_z + btScalar(1.0)),
                                  resolution_x,
                                  resolution_y,
                                  1 + 2,
                                  false,
                                  tex_coords);

world->addSoftBody(sb);
//sb->setTotalMass(btScalar(5.0));
draw:

Code: Select all

glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, t0);
glEnable(GL_TEXTURE_2D);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
int j = 0;
    
    for(int i=0; i < sb->m_faces.size(); i++)
    {
    btSoftBody::Face f0 = sb->m_faces[i];
    btSoftBody::Node * node00 = f0.m_n[0];
    btVector3 v00 = node00->m_x;
    btVector3 n00 = node00->m_n;
    btSoftBody::Node * node01 = f0.m_n[1];
    btVector3 v01 = node01->m_x;
    btVector3 n01 = node01->m_n;
    btSoftBody::Node * node02 = f0.m_n[2];
    btVector3 v02 = node02->m_x;
    btVector3 n02 = node02->m_n;

    glBegin(GL_TRIANGLES);

    glNormal3f( n00.getX(), n00.getY(), n00.getZ() );
    glMultiTexCoord2f(GL_TEXTURE0, tex_coords[j+0], tex_coords[j+1]);
    glVertex3f( v00.getX(), v00.getY(), v00.getZ() );

    glNormal3f( n01.getX(), n01.getY(), n01.getZ() );
    glMultiTexCoord2f(GL_TEXTURE0, tex_coords[j+2], tex_coords[j+3]);
    glVertex3f( v01.getX(), v01.getY(), v01.getZ() );

    glNormal3f( n02.getX(), n02.getY(), n02.getZ() );
    glMultiTexCoord2f(GL_TEXTURE0, tex_coords[j+4], tex_coords[j+5]);
    glVertex3f( v02.getX(), v02.getY(), v02.getZ() );

    glEnd();
    j += 6;
    }
glDisable(GL_TEXTURE_2D);
mi076
Posts: 144
Joined: Fri Aug 01, 2008 6:36 am
Location: Bonn, Germany

Re: how to use btSoftBodyHelpers::CreatePatchUV() ?

Post by mi076 »

comments from btSoftBodyHelpers.cpp

Code: Select all

        /*
         *
         *  corners:
         *
         *  [0][0]     corner00 ------- corner01   [resx][0]
         *                |                |
         *                |                |
         *  [0][resy]  corner10 -------- corner11  [resx][resy]
         *
         *
         *
         *
         *
         *
         *   "fixedgs" map:
         *
         *  corner00      -->   +1
         *  corner01      -->   +2
         *  corner10      -->   +4
         *  corner11      -->   +8
         *  upper middle -->  +16
         *  left middle    -->  +32
         *  right middle  -->  +64
         *  lower middle --> +128
         *  center         --> +256
         *
         *
         *   tex_coords size   (resx-1)*(resy-1)*12
         *
         *
         *
         *     SINGLE QUAD INTERNALS
         *
         *  1) btSoftBody's nodes and links,
         *     diagonal link is optional ("gendiags")
         *
         *
         *    node00 ------ node01
         *      | .              
         *      |   .            
         *      |     .          
         *      |       .        
         *      |         .      
         *    node10        node11
         *
         *
         *
         *   2) Faces:
         *      two triangles,
         *      UV Coordinates (hier example for single quad)
         *      
         *     (0,1)          (0,1)  (1,1)
         *     1 |\            3 \-----| 2
         *       | \              \    |
         *       |  \              \   |
         *       |   \              \  |
         *       |    \              \ |
         *     2 |-----\ 3            \| 1
         *     (0,0)    (1,0)       (1,0)
         *
         *
         *
         *
         *
         *
         */
czuber
Posts: 6
Joined: Thu Mar 14, 2013 9:56 pm

Re: how to use btSoftBodyHelpers::CreatePatchUV() ?

Post by czuber »

Worked very well!

Thanks!
Post Reply