本文整理汇总了C++中CPVRTModelPOD::GetBoneWorldMatrix方法的典型用法代码示例。如果您正苦于以下问题:C++ CPVRTModelPOD::GetBoneWorldMatrix方法的具体用法?C++ CPVRTModelPOD::GetBoneWorldMatrix怎么用?C++ CPVRTModelPOD::GetBoneWorldMatrix使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类CPVRTModelPOD
的用法示例。
在下文中一共展示了CPVRTModelPOD::GetBoneWorldMatrix方法的3个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: triangles
/*!****************************************************************************
@Function DrawSkinnedMesh
@Input i32NodeIndex Node index of the mesh to draw
@Description Draws a SPODMesh after the model view matrix has been set and
the meterial prepared.
******************************************************************************/
void OGLES2ChameleonMan::DrawSkinnedMesh(int i32NodeIndex)
{
SPODNode& Node = m_Scene.pNode[i32NodeIndex];
SPODMesh& Mesh = m_Scene.pMesh[Node.nIdx];
// bind the VBO for the mesh
glBindBuffer(GL_ARRAY_BUFFER, m_puiVbo[Node.nIdx]);
// bind the index buffer, won't hurt if the handle is 0
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_puiIndexVbo[Node.nIdx]);
// Set the vertex attribute offsets
glVertexAttribPointer(VERTEX_ARRAY, 3, GL_FLOAT, GL_FALSE, Mesh.sVertex.nStride, Mesh.sVertex.pData);
glVertexAttribPointer(NORMAL_ARRAY, 3, GL_FLOAT, GL_FALSE, Mesh.sNormals.nStride, Mesh.sNormals.pData);
glVertexAttribPointer(TANGENT_ARRAY, 3, GL_FLOAT, GL_FALSE, Mesh.sTangents.nStride, Mesh.sTangents.pData);
glVertexAttribPointer(BINORMAL_ARRAY, 3, GL_FLOAT, GL_FALSE, Mesh.sBinormals.nStride, Mesh.sBinormals.pData);
glVertexAttribPointer(TEXCOORD_ARRAY, 2, GL_FLOAT, GL_FALSE, Mesh.psUVW[0].nStride, Mesh.psUVW[0].pData);
glVertexAttribPointer(BONEINDEX_ARRAY, Mesh.sBoneIdx.n, GL_UNSIGNED_BYTE, GL_FALSE, Mesh.sBoneIdx.nStride, Mesh.sBoneIdx.pData);
glVertexAttribPointer(BONEWEIGHT_ARRAY, Mesh.sBoneWeight.n, GL_UNSIGNED_BYTE, GL_TRUE, Mesh.sBoneWeight.nStride, Mesh.sBoneWeight.pData);
for(int i32Batch = 0; i32Batch < Mesh.sBoneBatches.nBatchCnt; ++i32Batch)
{
/*
If the current mesh has bone index and weight data then we need to
set up some additional variables in the shaders.
*/
// Set the number of bones that will influence each vertex in the mesh
glUniform1i(m_SkinnedShaderProgram.auiLoc[eBoneCount], Mesh.sBoneIdx.n);
// Go through the bones for the current bone batch
PVRTMat4 amBoneWorld[8];
PVRTMat3 afBoneWorldIT[8], mBoneIT;
int i32Count = Mesh.sBoneBatches.pnBatchBoneCnt[i32Batch];
for(int i = 0; i < i32Count; ++i)
{
// Get the Node of the bone
int i32NodeID = Mesh.sBoneBatches.pnBatches[i32Batch * Mesh.sBoneBatches.nBatchBoneMax + i];
// Get the World transformation matrix for this bone and combine it with our app defined
// transformation matrix
amBoneWorld[i] = m_Scene.GetBoneWorldMatrix(Node, m_Scene.pNode[i32NodeID]);
// Calculate the inverse transpose of the 3x3 rotation/scale part for correct lighting
afBoneWorldIT[i] = PVRTMat3(amBoneWorld[i]).inverse().transpose();
}
glUniformMatrix4fv(m_SkinnedShaderProgram.auiLoc[eBoneMatrices], i32Count, GL_FALSE, amBoneWorld[0].ptr());
glUniformMatrix3fv(m_SkinnedShaderProgram.auiLoc[eBoneMatricesIT], i32Count, GL_FALSE, afBoneWorldIT[0].ptr());
/*
As we are using bone batching we don't want to draw all the faces contained within pMesh, we only want
to draw the ones that are in the current batch. To do this we pass to the drawMesh function the offset
to the start of the current batch of triangles (Mesh.sBoneBatches.pnBatchOffset[i32Batch]) and the
total number of triangles to draw (i32Tris)
*/
int i32Tris;
if(i32Batch+1 < Mesh.sBoneBatches.nBatchCnt)
i32Tris = Mesh.sBoneBatches.pnBatchOffset[i32Batch+1] - Mesh.sBoneBatches.pnBatchOffset[i32Batch];
else
i32Tris = Mesh.nNumFaces - Mesh.sBoneBatches.pnBatchOffset[i32Batch];
// Draw the mesh
size_t offset = sizeof(GLushort) * 3 * Mesh.sBoneBatches.pnBatchOffset[i32Batch];
glDrawElements(GL_TRIANGLES, i32Tris * 3, GL_UNSIGNED_SHORT, (void*) offset);
}
}
示例2: DrawModel
//.........这里部分代码省略.........
// If the mesh is used for skining then set up the matrix palettes.
if(bSkinning)
{
//Enable the matrix palette extension
glEnable(GL_MATRIX_PALETTE_OES);
/*
Enables the matrix palette stack extension, and apply subsequent
matrix operations to the matrix palette stack.
*/
glMatrixMode(GL_MATRIX_PALETTE_OES);
PVRTMat4 mBoneWorld;
int i32NodeID;
// Iterate through all the bones in the batch
for(int j = 0; j < pMesh->sBoneBatches.pnBatchBoneCnt[i32Batch]; ++j)
{
/*
Set the current matrix palette that we wish to change. An error
will be returned if the index (j) is not between 0 and
GL_MAX_PALETTE_MATRICES_OES. The value of GL_MAX_PALETTE_MATRICES_OES
can be retrieved using glGetIntegerv, the initial value is 9.
GL_MAX_PALETTE_MATRICES_OES does not mean you need to limit
your character to 9 bones as you can overcome this limitation
by using bone batching which splits the mesh up into sub-meshes
which use only a subset of the bones.
*/
m_Extensions.glCurrentPaletteMatrixOES(j);
// Generates the world matrix for the given bone in this batch.
i32NodeID = pMesh->sBoneBatches.pnBatches[i32Batch * pMesh->sBoneBatches.nBatchBoneMax + j];
m_Scene.GetBoneWorldMatrix(mBoneWorld, *pNode, m_Scene.pNode[i32NodeID]);
// Multiply the bone's world matrix by our transformation matrix and the view matrix
mBoneWorld = m_mView * m_mTransform * mBoneWorld;
// Load the bone matrix into the current palette matrix.
glLoadMatrixf(mBoneWorld.f);
}
}
else
{
//If we're not skinning then disable the matrix palette.
glDisable(GL_MATRIX_PALETTE_OES);
}
//Switch to the modelview matrix.
glMatrixMode(GL_MODELVIEW);
// Calculate the number of triangles in the current batch
int i32Tris;
if(bSkinning)
{
if(i32Batch + 1 < pMesh->sBoneBatches.nBatchCnt)
i32Tris = pMesh->sBoneBatches.pnBatchOffset[i32Batch+1] - pMesh->sBoneBatches.pnBatchOffset[i32Batch];
else
i32Tris = pMesh->nNumFaces - pMesh->sBoneBatches.pnBatchOffset[i32Batch];
}
else
i32Tris = pMesh->nNumFaces;
// Indexed Triangle list
if(pMesh->nNumStrips == 0)
示例3: triangles
/*!****************************************************************************
@Function DrawMesh
@Input i32NodeIndex Node index of the mesh to draw
@Description Draws a SPODMesh after the model view matrix has been set and
the meterial prepared.
******************************************************************************/
void OGLES3Skinning::DrawMesh(int i32NodeIndex)
{
SPODNode& Node = m_Scene.pNode[i32NodeIndex];
SPODMesh& Mesh = m_Scene.pMesh[Node.nIdx];
// bind the VBO for the mesh
glBindBuffer(GL_ARRAY_BUFFER, m_puiVbo[Node.nIdx]);
// bind the index buffer, won't hurt if the handle is 0
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_puiIndexVbo[Node.nIdx]);
// Enable the vertex attribute arrays
glEnableVertexAttribArray(VERTEX_ARRAY);
glEnableVertexAttribArray(NORMAL_ARRAY);
glEnableVertexAttribArray(TEXCOORD_ARRAY);
// Set the vertex attribute offsets
glVertexAttribPointer(VERTEX_ARRAY, 3, GL_FLOAT, GL_FALSE, Mesh.sVertex.nStride, Mesh.sVertex.pData);
glVertexAttribPointer(NORMAL_ARRAY, 3, GL_FLOAT, GL_FALSE, Mesh.sNormals.nStride, Mesh.sNormals.pData);
glVertexAttribPointer(TEXCOORD_ARRAY, 2, GL_FLOAT, GL_FALSE, Mesh.psUVW[0].nStride, Mesh.psUVW[0].pData);
/*
If the current mesh has bone index and weight data then we need to
set up some additional variables in the shaders.
*/
if(Mesh.sBoneIdx.n && Mesh.sBoneWeight.n)
{
glEnableVertexAttribArray(BONEINDEX_ARRAY);
glEnableVertexAttribArray(BONEWEIGHT_ARRAY);
glVertexAttribPointer(BONEINDEX_ARRAY, Mesh.sBoneIdx.n, GL_UNSIGNED_BYTE, GL_FALSE, Mesh.sBoneIdx.nStride, Mesh.sBoneIdx.pData);
glVertexAttribPointer(BONEWEIGHT_ARRAY, Mesh.sBoneWeight.n, GL_UNSIGNED_BYTE, GL_TRUE, Mesh.sBoneWeight.nStride, Mesh.sBoneWeight.pData);
/*
There is a limit to the number of bone matrices that you can pass to the shader so we have
chosen to limit the number of bone matrices that affect a mesh to 8. However, this does
not mean our character can only have a skeleton consisting of 8 bones. We can get around
this by using bone batching where the character is split up into sub-meshes that are only
affected by a sub set of the overal skeleton. This is why we have this for loop that
iterates through the bone batches contained with the SPODMesh.
*/
for (int i32Batch = 0; i32Batch < Mesh.sBoneBatches.nBatchCnt; ++i32Batch)
{
// Set the number of bones that will influence each vertex in the mesh
glUniform1i(m_ShaderProgram.auiLoc[eBoneCount], Mesh.sBoneIdx.n);
// Go through the bones for the current bone batch
PVRTMat4 amBoneWorld[8];
PVRTMat3 afBoneWorldIT[8], mBoneIT;
int i32Count = Mesh.sBoneBatches.pnBatchBoneCnt[i32Batch];
for(int i = 0; i < i32Count; ++i)
{
// Get the Node of the bone
int i32NodeID = Mesh.sBoneBatches.pnBatches[i32Batch * Mesh.sBoneBatches.nBatchBoneMax + i];
// Get the World transformation matrix for this bone and combine it with our app defined
// transformation matrix
amBoneWorld[i] = m_Transform * m_Scene.GetBoneWorldMatrix(Node, m_Scene.pNode[i32NodeID]);
// Calculate the inverse transpose of the 3x3 rotation/scale part for correct lighting
afBoneWorldIT[i] = PVRTMat3(amBoneWorld[i]).inverse().transpose();
}
glUniformMatrix4fv(m_ShaderProgram.auiLoc[eBoneMatrices], i32Count, GL_FALSE, amBoneWorld[0].ptr());
glUniformMatrix3fv(m_ShaderProgram.auiLoc[eBoneMatricesIT], i32Count, GL_FALSE, afBoneWorldIT[0].ptr());
/*
As we are using bone batching we don't want to draw all the faces contained within pMesh, we only want
to draw the ones that are in the current batch. To do this we pass to the drawMesh function the offset
to the start of the current batch of triangles (Mesh.sBoneBatches.pnBatchOffset[i32Batch]) and the
total number of triangles to draw (i32Tris)
*/
int i32Tris;
if(i32Batch+1 < Mesh.sBoneBatches.nBatchCnt)
i32Tris = Mesh.sBoneBatches.pnBatchOffset[i32Batch+1] - Mesh.sBoneBatches.pnBatchOffset[i32Batch];
else
i32Tris = Mesh.nNumFaces - Mesh.sBoneBatches.pnBatchOffset[i32Batch];
// Draw the mesh
size_t offset = sizeof(GLushort) * 3 * Mesh.sBoneBatches.pnBatchOffset[i32Batch];
glDrawElements(GL_TRIANGLES, i32Tris * 3, GL_UNSIGNED_SHORT, (void*) offset);
}
glDisableVertexAttribArray(BONEINDEX_ARRAY);
glDisableVertexAttribArray(BONEWEIGHT_ARRAY);
}
else
{
glUniform1i(m_ShaderProgram.auiLoc[eBoneCount], 0);
glDrawElements(GL_TRIANGLES, Mesh.nNumFaces*3, GL_UNSIGNED_SHORT, 0);
}
// Safely disable the vertex attribute arrays
//.........这里部分代码省略.........