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.
how to use btSoftBodyHelpers::CreatePatchUV() ?
-
- Posts: 17
- Joined: Thu Jan 01, 2009 2:14 pm
-
- Posts: 2
- Joined: Tue May 17, 2011 7:55 pm
Re: how to use btSoftBodyHelpers::CreatePatchUV() ?
I'm wondering about the same function. It would be nice if a developer could shed some light on it. Thanks!
-
- Posts: 144
- Joined: Fri Aug 01, 2008 6:36 am
- Location: Bonn, Germany
Re: how to use btSoftBodyHelpers::CreatePatchUV() ?
Here is an example:
use like CreatePatch() and provide a pointer to array to hold texture coordinates.
draw:
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));
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);
-
- Posts: 144
- Joined: Fri Aug 01, 2008 6:36 am
- Location: Bonn, Germany
Re: how to use btSoftBodyHelpers::CreatePatchUV() ?
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)
*
*
*
*
*
*
*/
-
- Posts: 6
- Joined: Thu Mar 14, 2013 9:56 pm
Re: how to use btSoftBodyHelpers::CreatePatchUV() ?
Worked very well!
Thanks!
Thanks!