revamped Y axis orientation method

assignment of animated model bone axis
pose orientaion axis retrieved from bone axis
This commit is contained in:
devZoGok
2021-10-19 19:06:41 +03:00
parent a09a4f548a
commit 66f3adfb4e
6 changed files with 53 additions and 33 deletions
+1 -12
View File
@@ -9,7 +9,7 @@ namespace vb01{
this->length = length;
}
void Bone::lookAt(Vector3 newDir, Vector3 newUp, Node *par){
void Bone::lookAt(Vector3 newDir, Vector3 newUp){
Node::lookAt(newDir, newUp);
for(int i = 0; i < 3; i++)
this->initAxis[i] = globalAxis[i];
@@ -18,17 +18,6 @@ namespace vb01{
restScale = scale;
}
/*
void Bone::lookAt(Vector3 newDir, Node *par){
Node::lookAt(newDir, par);
for(int i = 0; i < 3; i++)
this->initAxis[i] = globalAxis[i];
restPos = pos;
restRot = orientation;
restScale = scale;
}
*/
Vector3 Bone::getModelSpacePos(){
Vector3 modelSpacePos = Vector3::VEC_ZERO;
Bone *rootBone = skeleton->getRootBone();
+1 -2
View File
@@ -13,8 +13,7 @@ namespace vb01{
void setPosePos(Vector3 p);
void setPoseRot(Quaternion r);
void setPoseScale(Vector3 s);
void lookAt(Vector3, Vector3, Node*);
//void lookAt(Vector3, Node*);
void lookAt(Vector3, Vector3);
Vector3 getModelSpacePos();
inline Bone* getIkTarget(){return ikTarget;}
inline void setIkTarget(Bone *target){this->ikTarget = target;}
+3 -1
View File
@@ -169,6 +169,8 @@ namespace vb01{
};
Vector3 posePos = bone->getPosePos();
Quaternion poseRot = bone->getPoseRot();
Vector3 rotAxis = poseRot.getAxis();
rotAxis = boneAxis[0] * rotAxis.x + boneAxis[1] * rotAxis.y + boneAxis[2] * rotAxis.z;
Vector3 trans = boneAxis[0] * posePos.x + boneAxis[1] * posePos.y + boneAxis[2] * posePos.z;
Vector3 scale = bone->getPoseScale();
Vector3 bonePos = bone->getModelSpacePos();
@@ -185,7 +187,7 @@ namespace vb01{
shader->setVec3(bonePos, "bones[" + to_string(i) + "].pos");
shader->setVec3(trans, "bones[" + to_string(i) + "].trans");
shader->setVec3(poseRot.getAxis(), "bones[" + to_string(i) + "].rotAxis");
shader->setVec3(rotAxis, "bones[" + to_string(i) + "].rotAxis");
shader->setFloat(poseRot.getAngle(), "bones[" + to_string(i) + "].angle");
shader->setVec3(scale, "bones[" + to_string(i) + "].scale");
shader->setInt(vertGroupId, "bones[" + to_string(i) + "].vertGroup");
+25 -14
View File
@@ -120,23 +120,34 @@ namespace vb01{
}
void Node::adjustUp(Vector3 newUp){
Vector3 xDir =
parent->globalToLocalPosition(localToGlobalPosition(Vector3::VEC_I)) -
parent->globalToLocalPosition(localToGlobalPosition(Vector3::VEC_ZERO));
Vector3 yDir =
parent->globalToLocalPosition(localToGlobalPosition(Vector3::VEC_J)) -
parent->globalToLocalPosition(localToGlobalPosition(Vector3::VEC_ZERO));
Vector3 zDir = xDir.cross(yDir).norm();
mat3 mat;
mat[0][0] = 1;
mat[1][0] = 0;
mat[2][0] = 0;
mat[0][1] = 0;
mat[1][1] = 1;
mat[2][1] = 0;
mat[0][2] = 0;
mat[1][2] = 0;
mat[2][2] = 1;
mat = inverse(mat);
mat[0][0] = xDir.x;
mat[1][0] = xDir.y;
mat[2][0] = xDir.z;
mat[0][1] = yDir.x;
mat[1][1] = yDir.y;
mat[2][1] = yDir.z;
mat[0][2] = zDir.x;
mat[1][2] = zDir.y;
mat[2][2] = zDir.z;
vec3 nu = vec3(newUp.x, newUp.y, newUp.z) * mat;
newUp = (Vector3(1, 0, 0) * nu.x + Vector3(0, 1, 0) * nu.y).norm();
float angle = Vector3(0, 1, 0).getAngleBetween(newUp);
vec3 nu = vec3(newUp.x, newUp.y, newUp.z) * inverse(mat);
newUp = (xDir * nu.x + yDir * nu.y).norm();
if(newUp != Vector3::VEC_ZERO){
float angle = yDir.getAngleBetween(newUp);
setOrientation(Quaternion(angle * (nu.x < 0 ? 1 : -1), Vector3::VEC_K));
setOrientation(Quaternion(angle * (nu.x < 0 ? 1 : -1), zDir) * orientation);
}
}
void Node::getDescendants(vector<Node*> &descendants){
+3
View File
@@ -256,6 +256,9 @@ namespace vb01{
Vector3 upClamped = Vector3(up[i].x, up[i].y, 0).norm();
CPPUNIT_ASSERT(lookNode->getGlobalAxis(1).getAngleBetween(upClamped) < maxAngle);
}
lookNode->setOrientation(Quaternion::QUAT_W);
lookNode->lookAt(Vector3::VEC_K, Vector3::VEC_K);
CPPUNIT_ASSERT(lookNode->getGlobalAxis(1) == Vector3::VEC_J);
Quaternion rotQuat = Quaternion(.707, Vector3(1, 0 ,0));
lookNodeParent->setOrientation(rotQuat);
+20 -4
View File
@@ -9,6 +9,7 @@
#include"animationController.h"
#include<vector>
#include<algorithm>
#include<fstream>
using namespace std;
@@ -117,11 +118,26 @@ namespace vb01{
float length = atof(data[1].c_str());
Vector3 head = Vector3(atof(data[2].c_str()), atof(data[3].c_str()), atof(data[4].c_str()));
Vector3 xAxis = Vector3(atof(data[5].c_str()), atof(data[6].c_str()), atof(data[7].c_str()));
Vector3 yAxis = Vector3(atof(data[8].c_str()), atof(data[9].c_str()), atof(data[10].c_str()));
Vector3 xAxis = Vector3(atof(data[5].c_str()), atof(data[6].c_str()), atof(data[7].c_str())).norm();
Vector3 yAxis = Vector3(atof(data[8].c_str()), atof(data[9].c_str()), atof(data[10].c_str())).norm();
float eps = pow(10, -2);
if(fabs(xAxis.x) < eps)
xAxis.x = 0;
if(fabs(xAxis.y) < eps)
xAxis.y = 0;
if(fabs(xAxis.z) < eps)
xAxis.z = 0;
if(fabs(yAxis.x) < eps)
yAxis.x = 0;
if(fabs(yAxis.y) < eps)
yAxis.y = 0;
if(fabs(yAxis.z) < eps)
yAxis.z = 0;
string ikTarget = data[11].c_str();
int ikChainLength = atoi(data[12].c_str());
Vector3 zAxis = xAxis.cross(yAxis);
Vector3 zAxis = xAxis.cross(yAxis).norm();
Vector3 pos = head;
string parName = string(data[0].c_str());
@@ -143,7 +159,7 @@ namespace vb01{
Bone *bone = new Bone(preColon, length, pos);
bone->setIkChainLength(ikChainLength);
skeleton->addBone(bone, (Bone*)parent);
bone->lookAt(zAxis, yAxis, parent);
bone->lookAt(zAxis, yAxis);
if(ikTarget != "-")
ikRelationships.emplace(preColon, ikTarget);
}