本文整理汇总了C++中Bone::_getDerivedOrientation方法的典型用法代码示例。如果您正苦于以下问题:C++ Bone::_getDerivedOrientation方法的具体用法?C++ Bone::_getDerivedOrientation怎么用?C++ Bone::_getDerivedOrientation使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类Bone
的用法示例。
在下文中一共展示了Bone::_getDerivedOrientation方法的2个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: doAttach
void Actor::doAttach(
Actor* actor,
const Ogre::String& slot,
const Ogre::String& childSlot,
const Ogre::Vector3& offsetPosition,
const Ogre::Quaternion& offsetOrientation )
{
Ogre::Vector3 offsetPositionMod = offsetPosition;
Ogre::Quaternion offsetOrientationMod = offsetOrientation;
if( actor == NULL )
Throw(NullPointerException,
"Aktor "+mName+": Der anzufügende Aktor darf nicht NULL sein." );
if( actor->mParent != NULL )
Throw(NullPointerException,
"Aktor "+mName+": Der Aktor ist bereits an einen anderen Aktor angefügt." );
// Verschiebung durch den Child-Slot berechnen
// Ist es ein nicht Standard-Slot && Kontrolliert der Aktor ein Objekt && Ist dieses ein Mesh
if( childSlot.compare(DEFAULT_SLOT_NAME) != 0 &&
actor->getControlledObject() != NULL &&
actor->getControlledObject()->isMeshObject() )
{
Entity* ent = dynamic_cast<MeshObject*>(actor->getControlledObject())->getEntity();
// Braucht ein Skelett
if( !ent->hasSkeleton() )
Throw(IllegalArgumentException,
"Aktor "+mName+": Das kontrollierte MeshObject des ChildAktor hat kein Skeleton." );
// Der Slot muss existieren
try
{
Bone* bone = ent->getSkeleton()->getBone( childSlot );
Vector3 vec = bone->_getDerivedPosition();
Quaternion quat = bone->_getDerivedOrientation();
// Durch den Bone ExtraOffset hinzufügen
offsetOrientationMod = offsetOrientation * quat;
offsetPositionMod = ( offsetOrientationMod * (-vec) ) + offsetPosition;
}
catch (Ogre::Exception) {
Throw(IllegalArgumentException,
"Aktor "+mName+": Der geforderte Slot '"+childSlot+"' am ChildAktor existiert nicht." );
}
}
// Das wirkliche Anfügen
// Ist es ein nicht Standard-Slot && Kontrolliert der Aktor ein Objekt && Ist dieses ein Mesh
if( slot.compare(DEFAULT_SLOT_NAME) != 0 &&
getControlledObject() != NULL &&
getControlledObject()->isMeshObject() )
{
if( actor->getControlledObject() == NULL )
Throw(IllegalArgumentException,
"Aktor "+mName+": Der zu befestigende Aktor darf bei SLOTs nicht leer sein." );
MovableObject* movObj = actor->getControlledObject()->getMovableObject();
Entity* ent = dynamic_cast<MeshObject*>(getControlledObject())->getEntity();
// Braucht ein Skelett
if( !ent->hasSkeleton() )
Throw(IllegalArgumentException,
"Aktor "+mName+": Das kontrollierte MeshObject hat kein Skeleton." );
// Der Slot muss existieren
try
{
ent->getSkeleton()->getBone( slot );
}
catch (Ogre::Exception) {
Throw(IllegalArgumentException,
"Aktor "+mName+": Der geforderte Slot '"+slot+"' existiert nicht." );
}
// Am Bone befestigen
ent->attachObjectToBone( slot, movObj, offsetOrientationMod, offsetPositionMod );
// Der Aktor wurde an einem Bone befestigt
actor->mBone = ent->getSkeleton()->getBone( slot );
return;
}
// Wenn hier kein MeshObjekt dran ist, trotzdem irgendwie zusammenfügen
else
{
actor->placeIntoNode( mSceneNode, offsetPositionMod, offsetOrientationMod );
// Der Aktor wurde nicht an einem Bone befestigt
actor->mBone = 0;
return;
}
}
示例2: handleNiTriShape
//.........这里部分代码省略.........
std::vector<NiSkinData::BoneInfo> boneList = shape->skin->data->bones;
/*
Iterate through the boneList which contains what vertices are linked to
the bone (it->weights array) and at what position (it->trafo)
That position is added to every vertex.
*/
for (std::vector<NiSkinData::BoneInfo>::iterator it = boneList.begin();
it != boneList.end(); it++)
{
if(mSkel.isNull())
{
std::cout << "No skeleton for :" << shape->skin->bones[boneIndex].name.toString() << std::endl;
break;
}
//get the bone from bones array of skindata
if(!mSkel->hasBone(shape->skin->bones[boneIndex].name.toString()))
std::cout << "We don't have this bone";
bonePtr = mSkel->getBone(shape->skin->bones[boneIndex].name.toString());
// final_vector = old_vector + old_rotation*new_vector*old_scale
Nif::NiSkinData::BoneInfoCopy boneinfocopy;
boneinfocopy.trafo.rotation = convertRotation(it->trafo->rotation);
boneinfocopy.trafo.trans = convertVector3(it->trafo->trans);
boneinfocopy.bonename = shape->skin->bones[boneIndex].name.toString();
boneinfocopy.bonehandle = bonePtr->getHandle();
copy.boneinfo.push_back(boneinfocopy);
for (unsigned int i=0; i<it->weights.length; i++)
{
vecPos = bonePtr->_getDerivedPosition() +
bonePtr->_getDerivedOrientation() * convertVector3(it->trafo->trans);
vecRot = bonePtr->_getDerivedOrientation() * convertRotation(it->trafo->rotation);
unsigned int verIndex = (it->weights.ptr + i)->vertex;
//boneinfo.weights.push_back(*(it->weights.ptr + i));
Nif::NiSkinData::IndividualWeight ind;
ind.weight = (it->weights.ptr + i)->weight;
ind.boneinfocopyindex = copy.boneinfo.size() - 1;
if(copy.vertsToWeights.find(verIndex) == copy.vertsToWeights.end())
{
std::vector<Nif::NiSkinData::IndividualWeight> blank;
blank.push_back(ind);
copy.vertsToWeights[verIndex] = blank;
}
else
{
copy.vertsToWeights[verIndex].push_back(ind);
}
//Check if the vertex is relativ, FIXME: Is there a better solution?
if (vertexPosAbsolut[verIndex] == false)
{
//apply transformation to the vertices
Vector3 absVertPos = vecPos + vecRot * Vector3(ptr + verIndex *3);
absVertPos = absVertPos * (it->weights.ptr + i)->weight;
vertexPosOriginal[verIndex] = Vector3(ptr + verIndex *3);
mBoundingBox.merge(absVertPos);
//convert it back to float *
for (int j=0; j<3; j++)
(ptr + verIndex*3)[j] = absVertPos[j];
//apply rotation to the normals (not every vertex has a normal)