本文整理汇总了C++中ISkin::GetNumBones方法的典型用法代码示例。如果您正苦于以下问题:C++ ISkin::GetNumBones方法的具体用法?C++ ISkin::GetNumBones怎么用?C++ ISkin::GetNumBones使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类ISkin
的用法示例。
在下文中一共展示了ISkin::GetNumBones方法的4个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: FindSkinModifier
//// FindSkinModifier ///////////////////////////////////////////////////////
// Given an INode, gets the ISkin object of that node, or nil if there is
// none. Taken from the Max4 SDK, ISkin.h
ISkin* plMaxNodeBase::FindSkinModifier()
{
int modStackIndex;
// Get object from node. Abort if no object.
Object *pObj = GetObjectRef();
if( pObj == nil )
return nil;
// Is derived object ?
while( pObj->SuperClassID() == GEN_DERIVOB_CLASS_ID )
{
IDerivedObject *pDerObj = (IDerivedObject *)pObj;
// Iterate over all entries of the modifier stack.
for( modStackIndex = 0; modStackIndex < pDerObj->NumModifiers(); modStackIndex++ )
{
// Get current modifier.
Modifier *mod = pDerObj->GetModifier( modStackIndex );
// Is this Skin ?
if( mod->ClassID() == SKIN_CLASSID )
{
ISkin* skin = (ISkin*)mod->GetInterface(I_SKIN);
if( skin->GetNumBones() > 0 )
return skin;
}
}
pObj = pDerObj->GetObjRef();
}
// Not found.
return nil;
}
示例2: 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];
//.........这里部分代码省略.........
示例3: extractTriangleGeometry
static void extractTriangleGeometry( GmModel* gm, INode* node, Mesh* mesh, Mtl* material )
{
#ifdef SGEXPORT_PHYSIQUE
Modifier* phyMod = 0;
IPhysiqueExport* phyExport = 0;
IPhyContextExport* mcExport = 0;
#endif
Modifier* skinMod = 0;
ISkin* skin = 0;
String nodeName ( node->GetName() );
try
{
// vertex transform to left-handed system
Matrix3 pivot = TmUtil::getPivotTransform( node );
Matrix3 vertexTM = pivot * s_convtm;
bool insideOut = TmUtil::hasNegativeParity( pivot );
/*Matrix4x4 pm = TmUtil::toLH( vertexTM );
Debug::println( "Object {0} vertex local TM is", nodeName );
Debug::println( " {0,#.###} {1,#.###} {2,#.###} {3,#.###}", pm(0,0), pm(0,1), pm(0,2), pm(0,3) );
Debug::println( " {0,#.###} {1,#.###} {2,#.###} {3,#.###}", pm(1,0), pm(1,1), pm(1,2), pm(1,3) );
Debug::println( " {0,#.###} {1,#.###} {2,#.###} {3,#.###}", pm(2,0), pm(2,1), pm(2,2), pm(2,3) );
Debug::println( " {0,#.###} {1,#.###} {2,#.###} {3,#.###}", pm(3,0), pm(3,1), pm(3,2), pm(3,3) );*/
// add vertex positions
int vertices = mesh->getNumVerts();
for ( int vi = 0 ; vi < vertices ; ++vi )
{
Point3 v = vertexTM * mesh->verts[vi];
mb::Vertex* vert = gm->addVertex();
vert->setPosition( v.x, v.y, v.z );
}
// add vertex weights (from Physique modifier)
#ifdef SGEXPORT_PHYSIQUE
phyMod = PhyExportUtil::findPhysiqueModifier( node );
if ( phyMod )
{
Debug::println( " Found Physique modifier: {0}", gm->name );
// get (possibly shared) Physique export interface
phyExport = (IPhysiqueExport*)phyMod->GetInterface( I_PHYINTERFACE );
if( !phyExport )
throw Exception( Format("No Physique modifier export interface") );
// export from initial pose?
phyExport->SetInitialPose( false );
// get (unique) context dependent export inteface
mcExport = (IPhyContextExport*)phyExport->GetContextInterface( node );
if( !mcExport )
throw Exception( Format("No Physique modifier context export interface") );
// convert to rigid for time independent vertex assignment
mcExport->ConvertToRigid( true );
// allow blending to export multi-link assignments
mcExport->AllowBlending( true );
// list bones
Vector<INode*> bones( Allocator<INode*>(__FILE__,__LINE__) );
PhyExportUtil::listBones( mcExport, bones );
// add vertex weight maps
for ( int i = 0 ; i < bones.size() ; ++i )
{
INode* bone = bones[i];
String name = bone->GetName();
mb::VertexMap* vmap = gm->addVertexMap( 1, name, mb::VertexMapFormat::VERTEXMAP_WEIGHT );
PhyExportUtil::addWeights( vmap, bone, mcExport );
}
}
#endif // SGEXPORT_PHYSIQUE
// add vertex weights (from Skin modifier)
skinMod = SkinExportUtil::findSkinModifier( node );
if ( skinMod )
{
skin = (ISkin*)skinMod->GetInterface(I_SKIN);
require( skin );
ISkinContextData* skincx = skin->GetContextInterface( node );
require( skincx );
Debug::println( " Found Skin modifier: {0} ({1} bones, {2} points)", gm->name, skin->GetNumBones(), skincx->GetNumPoints() );
if ( skincx->GetNumPoints() != gm->vertices() )
throw Exception( Format("Only some vertices ({0}/{1}) of {2} are skinned", skincx->GetNumPoints(), gm->vertices(), gm->name) );
// list bones
Vector<INode*> bones( Allocator<INode*>(__FILE__,__LINE__) );
SkinExportUtil::listBones( skin, bones );
// add vertex weight maps
for ( int i = 0 ; i < bones.size() ; ++i )
{
INode* bone = bones[i];
String name = bone->GetName();
mb::VertexMap* vmap = gm->addVertexMap( 1, name, mb::VertexMapFormat::VERTEXMAP_WEIGHT );
SkinExportUtil::addWeights( vmap, bone, skin, skincx );
//Debug::println( " Bone {0} is affecting {1} vertices", name, vmap->size() );
//.........这里部分代码省略.........
示例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++)
{
//.........这里部分代码省略.........