本文整理汇总了C++中ISkin::GetBone方法的典型用法代码示例。如果您正苦于以下问题:C++ ISkin::GetBone方法的具体用法?C++ ISkin::GetBone怎么用?C++ ISkin::GetBone使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类ISkin
的用法示例。
在下文中一共展示了ISkin::GetBone方法的4个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: makeSkin
bool Exporter::makeSkin(NiTriBasedGeomRef shape, INode *node, FaceGroup &grp, TimeValue t)
{
if (!mExportSkin)
return false;
if (grp.verts.empty())
return false;
//get the skin modifier
Modifier *mod = GetSkin(node);
if (!mod)
return false;
ISkin *skin = (ISkin *) mod->GetInterface(I_SKIN);
if (!skin)
return false;
ISkinContextData *skinData = skin->GetContextInterface(node);
if (!skinData)
return false;
if (grp.strips.empty())
strippify(grp);
// Create new call back to finish export
SkinInstance* si = new SkinInstance(this);
mPostExportCallbacks.push_back(si);
skin->GetSkinInitTM(node, si->bone_init_tm, false);
skin->GetSkinInitTM(node, si->node_init_tm, true);
si->shape = shape;
// Get bone references (may not actually exist in proper structure at this time)
int totalBones = skin->GetNumBones();
si->boneWeights.resize(totalBones);
si->boneList.resize(totalBones);
for (int i=0; i<totalBones; ++i) {
si->boneList[i] = getNode(skin->GetBone(i));
}
vector<int>& vidx = grp.vidx;
int nv = vidx.size();
for (int i=0; i<nv; ++i)
{
int vi = vidx[i];
int nbones = skinData->GetNumAssignedBones(vi);
for (int j=0; j<nbones; ++j)
{
SkinWeight sw;
sw.index = i;
sw.weight = skinData->GetBoneWeight(vi,j);
int boneIndex = skinData->GetAssignedBone(vi,j);
SkinInstance::SkinWeightList& weights = si->boneWeights[boneIndex];
weights.push_back(sw);
}
}
// remove unused bones
vector<NiNodeRef>::iterator bitr = si->boneList.begin();
SkinInstance::BoneWeightList::iterator switr = si->boneWeights.begin();
for (int i=0; i<totalBones; ++i) {
vector<SkinWeight> &weights = (*switr);
if (weights.empty())
{
bitr = si->boneList.erase(bitr);
switr = si->boneWeights.erase(switr);
}
else
{
++bitr, ++switr;
}
}
// Check for dismemberment
if (IsFallout3() || IsSkyrim()) {
Modifier *dismemberSkinMod = GetBSDismemberSkin(node);
if (dismemberSkinMod)
{
if (IBSDismemberSkinModifier *disSkin = (IBSDismemberSkinModifier *) dismemberSkinMod->GetInterface(I_BSDISMEMBERSKINMODIFIER)){
Tab<IBSDismemberSkinModifierData*> modData = disSkin->GetModifierData();
if (modData.Count() >= 1) {
IBSDismemberSkinModifierData* bsdsmd = modData[0];
si->SkinInstConstructor = BSDismemberSkinInstance::Create;
Tab<BSDSPartitionData> &flags = bsdsmd->GetPartitionFlags();
GenericNamedSelSetList &fselSet = bsdsmd->GetFaceSelList();
FaceMap fmap;
NiTriBasedGeomDataRef data = DynamicCast<NiTriBasedGeomData>(shape->GetData());
vector<Triangle> tris = data->GetTriangles();
for (int i=0; i<tris.size(); ++i) {
Triangle tri = tris[i];
fmap[ rotate(tri) ] = i;
}
// Build up list of partitions and face to partition map
si->partitions.resize(flags.Count());
si->facePartList.resize( grp.faces.size(), -1 );
for (int i=0; i<flags.Count(); ++i) {
BodyPartList& bp = si->partitions[i];
//.........这里部分代码省略.........
示例2: GetBoneGroup
void SGP_MaxInterface::GetBoneGroup( Modifier *pModifier,
int nModifierType,
INode* pNode,
Mesh* pMesh,
int nVertexId,
BoneGroup& boneGroup )
{
if( !pMesh )
{
assert( false );
return;
}
if( nVertexId >= pMesh->numVerts )
{
assert( false );
return;
}
// static mesh
if( nModifierType == MODIFIER_NONE )
{
INode* pParent = pNode->GetParentNode();
if( pParent && ( IsBone( pParent ) || IsBipedBone( pParent ) ) )
{
Influence infl;
infl.fWeight = 1.0f;
strcpy( infl.szBoneName, pParent->GetName() );
boneGroup.AddInfluence( infl );
}
}
// check for physique modifier
else if( nModifierType == MODIFIER_PHYSIQUE )
{
assert( pModifier && "get bone group error, modifier is null" );
// create a physique export interface
IPhysiqueExport *pPhysiqueExport = (IPhysiqueExport *)pModifier->GetInterface(I_PHYINTERFACE);
if(pPhysiqueExport == NULL)
{
return;
}
// create a context export interface
IPhyContextExport *pContextExport = (IPhyContextExport *)pPhysiqueExport->GetContextInterface(pNode);
if(pContextExport == NULL)
{
pModifier->ReleaseInterface(I_PHYINTERFACE, pPhysiqueExport);
return;
}
// set the flags in the context export interface
pContextExport->ConvertToRigid(TRUE);
pContextExport->AllowBlending(TRUE);
// get the vertex export interface
IPhyVertexExport *pVertexExport = (IPhyVertexExport *)pContextExport->GetVertexInterface(nVertexId);
if(pVertexExport == NULL)
{
pPhysiqueExport->ReleaseContextInterface(pContextExport);
pModifier->ReleaseInterface(I_PHYINTERFACE, pPhysiqueExport);
return;
}
// get the vertex type
int vertexType = pVertexExport->GetVertexType();
// handle the specific vertex type
if(vertexType == RIGID_TYPE)
{
// typecast to rigid vertex
IPhyRigidVertex *pTypeVertex = (IPhyRigidVertex *)pVertexExport;
Influence infl;
if( pTypeVertex->GetNode() )
{
strcpy( infl.szBoneName, pTypeVertex->GetNode()->GetName() );
infl.fWeight = 1.0f;
boneGroup.AddInfluence( infl );
}
else
return;
}
else if(vertexType == RIGID_BLENDED_TYPE)
{
// typecast to blended vertex
IPhyBlendedRigidVertex *pTypeVertex = (IPhyBlendedRigidVertex *)pVertexExport;
// loop through all influencing bones
Influence infl;
for(int nodeId = 0; nodeId < pTypeVertex->GetNumberNodes(); nodeId++)
{
strcpy( infl.szBoneName, pTypeVertex->GetNode( nodeId )->GetName() );
infl.fWeight = pTypeVertex->GetWeight( nodeId );
boneGroup.AddInfluence( infl );
}
}
// release all interfaces
//.........这里部分代码省略.........
示例3: vcCal
//.........这里部分代码省略.........
{
// typecast to rigid vertex
IPhyRigidVertex *pTypeVertex;
pTypeVertex = (IPhyRigidVertex *)pVertexExport;
// add the influence to the vertex candidate
// get the influencing bone
if(!AddBoneInfluence(pSkeletonCandidate, pVertexCandidate, pTypeVertex->GetNode(), 1.0f))
{
pPhysiqueExport->ReleaseContextInterface(pContextExport);
m_pModifier->ReleaseInterface(I_PHYINTERFACE, pPhysiqueExport);
delete pVertexCandidate;
theExporter.SetLastError("Invalid bone assignment.", __FILE__, __LINE__);
return 0;
}
}
else if(vertexType == RIGID_BLENDED_TYPE)
{
// typecast to blended vertex
IPhyBlendedRigidVertex *pTypeVertex;
pTypeVertex = (IPhyBlendedRigidVertex *)pVertexExport;
// loop through all influencing bones
int nodeId;
for(nodeId = 0; nodeId < pTypeVertex->GetNumberNodes(); nodeId++)
{
// add the influence to the vertex candidate
if(!AddBoneInfluence(pSkeletonCandidate, pVertexCandidate, pTypeVertex->GetNode(nodeId), pTypeVertex->GetWeight(nodeId)))
{
pPhysiqueExport->ReleaseContextInterface(pContextExport);
m_pModifier->ReleaseInterface(I_PHYINTERFACE, pPhysiqueExport);
delete pVertexCandidate;
theExporter.SetLastError("Invalid bone assignment.", __FILE__, __LINE__);
return 0;
}
}
}
// release all interfaces
pPhysiqueExport->ReleaseContextInterface(pContextExport);
m_pModifier->ReleaseInterface(I_PHYINTERFACE, pPhysiqueExport);
}
#if MAX_RELEASE >= 4000
// check for skin modifier
else if(m_modifierType == MODIFIER_SKIN)
{
// create a skin interface
ISkin *pSkin;
pSkin = (ISkin*)m_pModifier->GetInterface(I_SKIN);
if(pSkin == 0)
{
delete pVertexCandidate;
theExporter.SetLastError("Skin modifier interface not found.", __FILE__, __LINE__);
return 0;
}
// create a skin context data interface
ISkinContextData *pSkinContextData;
pSkinContextData = (ISkinContextData *)pSkin->GetContextInterface(m_pINode);
if(pSkinContextData == 0)
{
m_pModifier->ReleaseInterface(I_SKIN, pSkin);
delete pVertexCandidate;
theExporter.SetLastError("Skin context data interface not found.", __FILE__, __LINE__);
return 0;
}
// loop through all influencing bones
int nodeId;
for(nodeId = 0; nodeId < pSkinContextData->GetNumAssignedBones(vertexId); nodeId++)
{
// get the bone id
int boneId;
boneId = pSkinContextData->GetAssignedBone(vertexId, nodeId);
if(boneId < 0) continue;
// add the influence to the vertex candidate
if(!AddBoneInfluence(pSkeletonCandidate, pVertexCandidate, pSkin->GetBone(boneId), pSkinContextData->GetBoneWeight(vertexId, nodeId)))
{
m_pModifier->ReleaseInterface(I_SKIN, pSkin);
delete pVertexCandidate;
theExporter.SetLastError("Invalid bone assignment.", __FILE__, __LINE__);
return 0;
}
}
// release all interfaces
m_pModifier->ReleaseInterface(I_SKIN, pSkin);
}
#endif
else if( m_modifierType == MODIFIER_MORPHER || m_modifierType == MODIFIER_NONE ) {
}
else
{
theExporter.SetLastError("No physique/skin/morpher modifier found.", __FILE__, __LINE__);
return 0;
}
return pVertexCandidate;
}
示例4: ProcessSkin
//----------------------------------------------------------------------------
void SceneBuilder::ProcessSkin(INode *node, Modifier *skinMod)
{
// 构造皮肤控制器。如果Max的网格被按照材质细分,每一个网格都需要自己的蒙皮
// 信息控制器。蒙皮信息中的offset,在动画起始时被计算,是骨骼的世界变换。
//
// node:
// 指向蒙皮修改器指向的Max中的节点。
// skinMod:
// 指向蒙皮修改器
// 1. 获得max蒙皮信息中的骨骼,对应的在Phoenix的骨骼节点列表
// 2. 获得maxNode影响的Phoenix网格
// 3. 获得max中每个骨骼所影响的Phoenix网格中的顶点的数量,忽略不受蒙皮信息
// 影响的网格
// 4. 计算Phoenix mesh的蒙皮信息,生成SkinControl,AttachController到
// Phoenix mesh上。
// 1
bool needDel;
TriObject *triObj = GetTriObject(node, &needDel);
Mesh *maxMesh = &triObj->GetMesh();
// Max皮肤控制器接口
ISkin *skin = (ISkin*)skinMod->GetInterface(I_SKIN);
ISkinContextData *skinData = skin->GetContextInterface(node);
// max Skin Bones -> Phoenix2 Skin Bones
int b, numSkinBone = skin->GetNumBones();
PX2::Node **bones = new1<PX2::Node*>(numSkinBone);
for (b=0; b<numSkinBone; b++)
{
INode *boneNode = skin->GetBone(b);
const std::string &boneName = boneNode->GetName();
PX2::Node *node = PX2::StaticCast<PX2::Node>(mScene->GetObjectByName(boneName));
bones[b] = node;
}
// 1
// 获得maxNode相关联的Phoenix mesh
std::vector<PX2::TriMesh*> meshes;
PX2::Object *object = mScene->GetObjectByName(node->GetName());
if (object->IsExactly(PX2::TriMesh::TYPE))
{
meshes.push_back(PX2::StaticCast<PX2::TriMesh>(object));
}
else
{
PX2::Node *node = PX2::StaticCast<PX2::Node>(object);
const char *nName = node->GetName().c_str();
for (int c=0; c<node->GetNumChildren(); c++)
{
PX2::Movable *child = node->GetChild(c);
const char *cName = child->GetName().c_str();
if (strncmp(cName, nName, strlen(nName)) == 0) // 这里必须是strlen(nName),因为子节点有_1,_2
{
meshes.push_back(PX2::StaticCast<PX2::TriMesh>(child));
}
}
}
// 为Phoenix2的每个网格建立相关的皮肤控制器
int *boneInfuseNumVert = new1<int>(numSkinBone);
for (int m=0; m<(int)meshes.size(); m++)
{
PX2::TriMesh *mesh = meshes[m];
// Phoenix顶点在max顶点中的索引
PX2::VertexBuffer *vb = mesh->GetVertexBuffer();
int px2MeshVertexNum = vb->GetNumElements();
std::vector<int> MaxVertexIndex; // i->max索引
int v, i, j, k;
PX2::VertexBufferAccessor vba(mesh->GetVertexFormat(), vb);
// 3
for (int v=0; v<px2MeshVertexNum; ++v)
{
Float3 &position = vba.Position<Float3>(v);
for (i=0; i<maxMesh->getNumVerts(); i++)
{
if (position[0] == maxMesh->verts[i].x
&& position[1] == maxMesh->verts[i].y
&& position[2] == maxMesh->verts[i].z)
{
MaxVertexIndex.push_back(i);
break;
}
}
}
// 确定每个骨骼所影响的顶点数量
int maxVertexSize = (int)MaxVertexIndex.size();
memset(boneInfuseNumVert, 0, sizeof(int)*numSkinBone);
for (i=0; i<maxVertexSize; i++)
{
//.........这里部分代码省略.........