Commit e3c9a72d by Kai Westerkamp

start & ende

parent 6cba67dc
......@@ -118,7 +118,7 @@ Mesh::Mesh(QOpenGLFunctions_4_3_Core *f,QString fileName)
}
qDebug()<<"Mesh Read";
//TODO init Nodes
//init Nodes
if(scene->mRootNode != NULL)
{
initNode(scene, scene->mRootNode, rootNode, QString());
......@@ -138,22 +138,55 @@ Mesh::Mesh(QOpenGLFunctions_4_3_Core *f,QString fileName)
globalInverseTransform = rootNode.transformation.inverted();
//Test Interpolation:
if(false){
const aiAnimation* animation = scene->mAnimations[0];
const aiNodeAnim *nodeAnimation = findAnimOfNode(animation,"upperarm.R");
qDebug()<<"KeyFrames";
for(uint i = 0; i < nodeAnimation->mNumPositionKeys; i++){
qDebug()<<nodeAnimation->mPositionKeys[i].mTime<<convert(nodeAnimation->mPositionKeys[i].mValue);
}
qDebug()<<"Interpolated";
for(float f = 0.0; f < (float)animation->mDuration; f += 0.5f){
qDebug()<<f<<calcInterpolatedTranslation(f,nodeAnimation);
}
}
//Todo read skeleton
// //Test Interpolation:
// if(false){
// const aiAnimation* animation = scene->mAnimations[0];
// const aiNodeAnim *nodeAnimation = findAnimOfNode(animation,"upperarm.R");
// qDebug()<<"KeyFrames";
// for(uint i = 0; i < nodeAnimation->mNumPositionKeys; i++){
// qDebug()<<nodeAnimation->mPositionKeys[i].mTime<<convert(nodeAnimation->mPositionKeys[i].mValue);
// }
// qDebug()<<"Interpolated";
// for(float f = 0.0; f < (float)animation->mDuration; f += 0.5f){
// qDebug()<<f<<calcInterpolatedTranslation(f,nodeAnimation);
// }
// }
// for (int i = 0; i < scene->mNumAnimations; ++i) {
// const aiAnimation* animation = scene->mAnimations[i];
// qDebug()<<"Animation"<<animation->mName.C_Str();
// switch (animation->mChannels[0]->mPreState) {
// case aiAnimBehaviour_CONSTANT:
// qDebug()<<"Pre"<<"aiAnimBehaviour_CONSTANT";
// break;
// case aiAnimBehaviour_REPEAT: // use start or end
// qDebug()<<"Pre"<<"aiAnimBehaviour_REPEAT";
// break;
// case aiAnimBehaviour_LINEAR: // linear interpolate
// qDebug()<<"Pre"<<"aiAnimBehaviour_LINEAR";
// break;
// case aiAnimBehaviour_DEFAULT: // take default node transformation
// qDebug()<<"Pre"<<"aiAnimBehaviour_DEFAULT";
// break;
// default:
// qDebug()<<"Pre"<<"not";
// }
// switch (animation->mChannels[0]->mPostState) {
// case aiAnimBehaviour_CONSTANT:
// qDebug()<<"Post"<<"aiAnimBehaviour_CONSTANT";
// break;
// case aiAnimBehaviour_REPEAT: // use start or end
// qDebug()<<"Post"<<"aiAnimBehaviour_REPEAT";
// break;
// case aiAnimBehaviour_LINEAR: // linear interpolate
// qDebug()<<"Post"<<"aiAnimBehaviour_LINEAR";
// break;
// case aiAnimBehaviour_DEFAULT: // take default node transformation
// qDebug()<<"Post"<<"aiAnimBehaviour_DEFAULT";
// break;
// default:
// qDebug()<<"Post"<<"not";
// }
// }
loaded = true;
}
......@@ -168,6 +201,7 @@ Mesh::~Mesh()
void Mesh::initNode(const aiScene *scene, aiNode *node, Node &newNode,QString debugoffset){
newNode.name = node->mName.length != 0 ? node->mName.C_Str() : "";
newNode.transformation = QMatrix4x4(node->mTransformation[0]);
newNode.meshes.resize(node->mNumMeshes);
bool debug = false;
if(debug) qDebug()<<debugoffset.toStdString().c_str() << "NodeName" << newNode.name;
......@@ -400,7 +434,6 @@ void Mesh::updateBoneTransform(float TimeInSeconds, int animIndex){
float TimeInTicks = TimeInSeconds * TicksPerSecond;
float AnimationTime = fmod(TimeInTicks, (float)animation->mDuration);
//TODO calc time and get Anaimation;
updateBoneHeirachy(AnimationTime,animation,this->rootNode,QMatrix4x4());
......@@ -417,18 +450,9 @@ void Mesh::updateBoneHeirachy(float AnimTime,const aiAnimation* animation, Node
//calc Tcurrent Trasnformation;
if (nodeAnimation) {
// if(node.name.endsWith("upperarm.L")){
// qDebug()<<node.name;
// for (uint i = 0 ; i < nodeAnimation->mNumPositionKeys ; i++) {
// qDebug()<<convert(nodeAnimation->mPositionKeys[i].mValue)<<nodeAnimation->mPositionKeys[i].mTime;
// }
// }
QVector3D scale = calcInterpolatedScaling(AnimTime,nodeAnimation);
QVector3D scale = calcInterpolatedScaling(AnimTime,nodeAnimation,node);
QQuaternion rot = calcInterpolatedRotation(AnimTime,nodeAnimation);
QVector3D trans = calcInterpolatedTranslation(AnimTime,nodeAnimation);
QVector3D trans = calcInterpolatedTranslation(AnimTime,nodeAnimation,node);
//qDebug()<<"calc"<<scale<<rot<<trans;
nodeTransformation.setToIdentity();
......@@ -527,27 +551,35 @@ QVector3D Mesh::calcInterpolatedVectorKey(float AnimTime,const aiNodeAnim *nodeA
return start;
}
if(index == 0 ){
if(linear){
return linInterpolate(start,end,Factor);
}
if(index == 0 ){ //Start
switch (nodeAnimation->mPreState) {
case aiAnimBehaviour_CONSTANT: // nearest Key
return Factor <0.5f ? start : end;
break;
case aiAnimBehaviour_REPEAT: // use start or end
//TODO
QVector3D before = convert(keys[index-1].mValue);
QVector3D after = convert(keys[numberOfKeys - 1].mValue);
return Catmul(before,start,end,after,Factor);
case aiAnimBehaviour_LINEAR: // linear interpolate
return linInterpolate(start,end,Factor);
case aiAnimBehaviour_DEFAULT: // take default node transformation
//TODO
//TODO aiNodes haben nur translation rotation und scalierung nicht getrennt gespeichert
default:
return linInterpolate(start,end,Factor);
}
} else if((index+2)== numberOfKeys){
} else if((index+2)== numberOfKeys){ // Ende
switch (nodeAnimation->mPostState) {
case aiAnimBehaviour_CONSTANT: // nearest Key
return Factor <0.5f ? start : end;
break;
case aiAnimBehaviour_REPEAT: // use start or end
//TODO
QVector3D before = convert(keys[index-1].mValue);
QVector3D after = convert(keys[0].mValue);
return Catmul(before,start,end,after,Factor);
case aiAnimBehaviour_LINEAR: // linear interpolate
return linInterpolate(start,end,Factor);
case aiAnimBehaviour_DEFAULT: // take default node transformation
......@@ -555,23 +587,10 @@ QVector3D Mesh::calcInterpolatedVectorKey(float AnimTime,const aiNodeAnim *nodeA
default:
return linInterpolate(start,end,Factor);
}
} else{
if(linear)
return linInterpolate(start,end,Factor);
QVector3D before = convert(keys[index-1].mValue);
QVector3D after = convert(keys[index+2].mValue);
// if(before.distanceToPoint(start) == 0|| end.distanceToPoint(after) == 0){
// qDebug()<<"Zeror before or after"<<AnimTime;
// return linInterpolate(start,end,Factor);
// }
QVector3D interpolated = Catmul(before,start,end,after,Factor);
//qDebug()<<nodeAnimation->mNodeName.C_Str()<<AnimTime<<start<<end<<interpolated;
return interpolated;
return Catmul(before,start,end,after,Factor);
}
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment