📄 model.cpp
字号:
int currPoint;
for(currPoint = 0; currPoint < nrPoints; currPoint++)
{
glVertex3f(points[currPoint][0], points[currPoint][1], points[currPoint][2]);
}
glEnd();
glPointSize(1.0f);
}
//----------------------------------------------------------------------------//
// Render the bounding boxes of a model //
//----------------------------------------------------------------------------//
void Model::renderBoundingBox()
{
CalSkeleton *pCalSkeleton = m_calModel->getSkeleton();
std::vector<CalBone*> &vectorCoreBone = pCalSkeleton->getVectorBone();
glColor3f(1.0f, 1.0f, 1.0f);
glBegin(GL_LINES);
for(size_t boneId=0;boneId<vectorCoreBone.size();++boneId)
{
CalBoundingBox & calBoundingBox = vectorCoreBone[boneId]->getBoundingBox();
CalVector p[8];
calBoundingBox.computePoints(p);
glVertex3f(p[0].x,p[0].y,p[0].z);
glVertex3f(p[1].x,p[1].y,p[1].z);
glVertex3f(p[0].x,p[0].y,p[0].z);
glVertex3f(p[2].x,p[2].y,p[2].z);
glVertex3f(p[1].x,p[1].y,p[1].z);
glVertex3f(p[3].x,p[3].y,p[3].z);
glVertex3f(p[2].x,p[2].y,p[2].z);
glVertex3f(p[3].x,p[3].y,p[3].z);
glVertex3f(p[4].x,p[4].y,p[4].z);
glVertex3f(p[5].x,p[5].y,p[5].z);
glVertex3f(p[4].x,p[4].y,p[4].z);
glVertex3f(p[6].x,p[6].y,p[6].z);
glVertex3f(p[5].x,p[5].y,p[5].z);
glVertex3f(p[7].x,p[7].y,p[7].z);
glVertex3f(p[6].x,p[6].y,p[6].z);
glVertex3f(p[7].x,p[7].y,p[7].z);
glVertex3f(p[0].x,p[0].y,p[0].z);
glVertex3f(p[4].x,p[4].y,p[4].z);
glVertex3f(p[1].x,p[1].y,p[1].z);
glVertex3f(p[5].x,p[5].y,p[5].z);
glVertex3f(p[2].x,p[2].y,p[2].z);
glVertex3f(p[6].x,p[6].y,p[6].z);
glVertex3f(p[3].x,p[3].y,p[3].z);
glVertex3f(p[7].x,p[7].y,p[7].z);
}
glEnd();
}
//----------------------------------------------------------------------------//
// Render the mesh of the model //
//----------------------------------------------------------------------------//
void Model::renderMesh(bool bWireframe, bool bLight)
{
// get the renderer of the model
CalRenderer *pCalRenderer;
pCalRenderer = m_calModel->getRenderer();
// begin the rendering loop
if(!pCalRenderer->beginRendering()) return;
// set wireframe mode if necessary
if(bWireframe)
{
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
}
// set the global OpenGL states
glEnable(GL_DEPTH_TEST);
glShadeModel(GL_SMOOTH);
// set the lighting mode if necessary
if(bLight)
{
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
}
// we will use vertex arrays, so enable them
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_NORMAL_ARRAY);
// get the number of meshes
int meshCount;
meshCount = pCalRenderer->getMeshCount();
// render all meshes of the model
int meshId;
for(meshId = 0; meshId < meshCount; meshId++)
{
// get the number of submeshes
int submeshCount;
submeshCount = pCalRenderer->getSubmeshCount(meshId);
// render all submeshes of the mesh
int submeshId;
for(submeshId = 0; submeshId < submeshCount; submeshId++)
{
// select mesh and submesh for further data access
if(pCalRenderer->selectMeshSubmesh(meshId, submeshId))
{
unsigned char meshColor[4];
GLfloat materialColor[4];
// set the material ambient color
pCalRenderer->getAmbientColor(&meshColor[0]);
materialColor[0] = meshColor[0] / 255.0f; materialColor[1] = meshColor[1] / 255.0f; materialColor[2] = meshColor[2] / 255.0f; materialColor[3] = meshColor[3] / 255.0f;
glMaterialfv(GL_FRONT, GL_AMBIENT, materialColor);
// set the material diffuse color
pCalRenderer->getDiffuseColor(&meshColor[0]);
materialColor[0] = meshColor[0] / 255.0f; materialColor[1] = meshColor[1] / 255.0f; materialColor[2] = meshColor[2] / 255.0f; materialColor[3] = meshColor[3] / 255.0f;
glMaterialfv(GL_FRONT, GL_DIFFUSE, materialColor);
// set the vertex color if we have no lights
if(!bLight)
{
glColor4fv(materialColor);
}
// set the material specular color
pCalRenderer->getSpecularColor(&meshColor[0]);
materialColor[0] = meshColor[0] / 255.0f; materialColor[1] = meshColor[1] / 255.0f; materialColor[2] = meshColor[2] / 255.0f; materialColor[3] = meshColor[3] / 255.0f;
glMaterialfv(GL_FRONT, GL_SPECULAR, materialColor);
// set the material shininess factor
float shininess;
shininess = 50.0f; //TODO: pCalRenderer->getShininess();
glMaterialfv(GL_FRONT, GL_SHININESS, &shininess);
// get the transformed vertices of the submesh
static float meshVertices[30000][3];
int vertexCount;
vertexCount = pCalRenderer->getVertices(&meshVertices[0][0]);
// get the transformed normals of the submesh
static float meshNormals[30000][3];
pCalRenderer->getNormals(&meshNormals[0][0]);
// get the texture coordinates of the submesh
static float meshTextureCoordinates[30000][2];
int textureCoordinateCount;
textureCoordinateCount = pCalRenderer->getTextureCoordinates(0, &meshTextureCoordinates[0][0]);
// get the faces of the submesh
static CalIndex meshFaces[50000][3];
int faceCount;
faceCount = pCalRenderer->getFaces(&meshFaces[0][0]);
// set the vertex and normal buffers
glVertexPointer(3, GL_FLOAT, 0, &meshVertices[0][0]);
glNormalPointer(GL_FLOAT, 0, &meshNormals[0][0]);
// set the texture coordinate buffer and state if necessary
if((pCalRenderer->getMapCount() > 0) && (textureCoordinateCount > 0))
{
glEnable(GL_TEXTURE_2D);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glEnable(GL_COLOR_MATERIAL);
// set the texture id we stored in the map user data
glBindTexture(GL_TEXTURE_2D, (GLuint)pCalRenderer->getMapUserData(0));
// set the texture coordinate buffer
glTexCoordPointer(2, GL_FLOAT, 0, &meshTextureCoordinates[0][0]);
glColor3f(1.0f, 1.0f, 1.0f);
}
// draw the submesh
if(sizeof(CalIndex)==2)
glDrawElements(GL_TRIANGLES, faceCount * 3, GL_UNSIGNED_SHORT, &meshFaces[0][0]);
else
glDrawElements(GL_TRIANGLES, faceCount * 3, GL_UNSIGNED_INT, &meshFaces[0][0]);
// disable the texture coordinate state if necessary
if((pCalRenderer->getMapCount() > 0) && (textureCoordinateCount > 0))
{
glDisable(GL_COLOR_MATERIAL);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glDisable(GL_TEXTURE_2D);
}
}
}
}
// clear vertex array state
glDisableClientState(GL_NORMAL_ARRAY);
glDisableClientState(GL_VERTEX_ARRAY);
// reset the lighting mode
if(bLight)
{
glDisable(GL_LIGHTING);
glDisable(GL_LIGHT0);
}
// reset the global OpenGL states
glDisable(GL_DEPTH_TEST);
// reset wireframe mode if necessary
if(bWireframe)
{
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
}
// end the rendering
pCalRenderer->endRendering();
}
//设置虚拟人位置方向
void Model::Place(float x,float y,float z,float theta,float psi,float gama)
{
glTranslatef(x,y,z);
glRotatef(psi,0,1,0);
glRotatef(theta-90,1,0,0);
glRotatef(gama,0,0,1);
}
//设置虚拟人缩放因子
void Model::Setup(float sx,float sy,float sz)
{
glScaled(sx,sy,sz);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -