Add eye direction in model
Adds eye direction support in the model system and in the 'test' model.
This commit is contained in:
parent
26c11c414f
commit
09c60db8c1
Binary file not shown.
Before Width: | Height: | Size: 8.8 KiB After Width: | Height: | Size: 8.4 KiB |
BIN
models/test/face-iris.png
Normal file
BIN
models/test/face-iris.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 8.7 KiB |
|
@ -17,6 +17,14 @@ bind = "head"
|
||||||
follow = "face"
|
follow = "face"
|
||||||
factor = 0.85
|
factor = 0.85
|
||||||
|
|
||||||
|
[[part]]
|
||||||
|
texture = "face-iris.png"
|
||||||
|
bind = "head"
|
||||||
|
follow = "face"
|
||||||
|
factor = 0.85
|
||||||
|
offset_bind = "offset-eyes"
|
||||||
|
offset_factor = 0.03
|
||||||
|
|
||||||
[[part]]
|
[[part]]
|
||||||
bind = "head"
|
bind = "head"
|
||||||
follow = "face"
|
follow = "face"
|
||||||
|
|
|
@ -137,6 +137,7 @@ void cvFrame() {
|
||||||
landmarks[biggestFace][30].x * 2 / (float)frame.cols - 1,
|
landmarks[biggestFace][30].x * 2 / (float)frame.cols - 1,
|
||||||
landmarks[biggestFace][30].y * 2 / (float)frame.rows - 1
|
landmarks[biggestFace][30].y * 2 / (float)frame.rows - 1
|
||||||
);
|
);
|
||||||
|
faceData.positions[OFFSET_EYES] = eyeVector;
|
||||||
|
|
||||||
faceData.triggers[TRIGGER_NULL] = false;
|
faceData.triggers[TRIGGER_NULL] = false;
|
||||||
faceData.triggers[TRIGGER_MOUTH_OPEN] =
|
faceData.triggers[TRIGGER_MOUTH_OPEN] =
|
||||||
|
|
|
@ -122,6 +122,7 @@ Model::Model(const char* path) {
|
||||||
// rotation and scale factor
|
// rotation and scale factor
|
||||||
auto rotFacResult = partsVec[i].getDouble("rot_factor");
|
auto rotFacResult = partsVec[i].getDouble("rot_factor");
|
||||||
auto scaleFacResult = partsVec[i].getDouble("scale_factor");
|
auto scaleFacResult = partsVec[i].getDouble("scale_factor");
|
||||||
|
auto offsetFacResult = partsVec[i].getDouble("offset_factor");
|
||||||
|
|
||||||
if (rotFacResult.first) {
|
if (rotFacResult.first) {
|
||||||
newPart.rotFactor = (float)rotFacResult.second;
|
newPart.rotFactor = (float)rotFacResult.second;
|
||||||
|
@ -129,6 +130,10 @@ Model::Model(const char* path) {
|
||||||
if (scaleFacResult.first) {
|
if (scaleFacResult.first) {
|
||||||
newPart.scaleFactor = (float)scaleFacResult.second;
|
newPart.scaleFactor = (float)scaleFacResult.second;
|
||||||
}
|
}
|
||||||
|
if (offsetFacResult.first) {
|
||||||
|
newPart.offsetFactor = (float)offsetFacResult.second;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// origin
|
// origin
|
||||||
auto originArray = partsVec[i].getArray("origin");
|
auto originArray = partsVec[i].getArray("origin");
|
||||||
|
@ -154,6 +159,13 @@ Model::Model(const char* path) {
|
||||||
newPart.scaleOffset = glm::vec2((float)offsetVec[0], (float)offsetVec[1]);
|
newPart.scaleOffset = glm::vec2((float)offsetVec[0], (float)offsetVec[1]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// offset bind
|
||||||
|
auto offsetBindResult = partsVec[i].getString("offset_bind");
|
||||||
|
if (offsetBindResult.first) {
|
||||||
|
newPart.setOffsetBind(offsetBindResult.second);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// texture
|
// texture
|
||||||
auto textureSingle = partsVec[i].getString("texture");
|
auto textureSingle = partsVec[i].getString("texture");
|
||||||
|
|
||||||
|
|
|
@ -11,6 +11,7 @@ std::map<std::string, int> bindStringToNum {
|
||||||
{"null", BIND_NULL},
|
{"null", BIND_NULL},
|
||||||
{"head", BIND_HEAD},
|
{"head", BIND_HEAD},
|
||||||
{"face", BIND_FACE},
|
{"face", BIND_FACE},
|
||||||
|
{"offset-eyes", OFFSET_EYES},
|
||||||
};
|
};
|
||||||
|
|
||||||
std::map<std::string, bool> triggerStringToNum {
|
std::map<std::string, bool> triggerStringToNum {
|
||||||
|
@ -40,6 +41,10 @@ void ModelPart::setFollowTarget(std::string followTarget) {
|
||||||
follow = bindStringToNum[followTarget];
|
follow = bindStringToNum[followTarget];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ModelPart::setOffsetBind(std::string bindName) {
|
||||||
|
offsetBind = bindStringToNum[bindName];
|
||||||
|
}
|
||||||
|
|
||||||
void ModelPart::smoothTransform(glm::vec2 position, float rotation, float scale) {
|
void ModelPart::smoothTransform(glm::vec2 position, float rotation, float scale) {
|
||||||
histPositions[histI] = position;
|
histPositions[histI] = position;
|
||||||
histRotations[histI] = rotation;
|
histRotations[histI] = rotation;
|
||||||
|
@ -78,7 +83,8 @@ void ModelPart::processFaceData(struct FaceData faceData) {
|
||||||
glm::vec2 bindPosition = faceData.positions[bind];
|
glm::vec2 bindPosition = faceData.positions[bind];
|
||||||
glm::vec2 followPosition = faceData.positions[follow];
|
glm::vec2 followPosition = faceData.positions[follow];
|
||||||
glm::vec2 followDirection = followPosition - bindPosition;
|
glm::vec2 followDirection = followPosition - bindPosition;
|
||||||
glm::vec2 newPosition = bindPosition + (followDirection * factor);
|
glm::vec2 offset = faceData.positions[offsetBind] * offsetFactor;
|
||||||
|
glm::vec2 newPosition = bindPosition + offset + (followDirection * factor);
|
||||||
|
|
||||||
smoothTransform(newPosition, faceData.headRotation, faceData.scale);
|
smoothTransform(newPosition, faceData.headRotation, faceData.scale);
|
||||||
|
|
||||||
|
|
|
@ -11,6 +11,9 @@
|
||||||
#define BIND_HEAD 0x01
|
#define BIND_HEAD 0x01
|
||||||
#define BIND_FACE 0x02
|
#define BIND_FACE 0x02
|
||||||
|
|
||||||
|
#define OFFSET_EYES 0x10
|
||||||
|
|
||||||
|
|
||||||
#define TRIGGER_NULL 0x00
|
#define TRIGGER_NULL 0x00
|
||||||
#define TRIGGER_MOUTH_OPEN 0x01
|
#define TRIGGER_MOUTH_OPEN 0x01
|
||||||
|
|
||||||
|
@ -38,6 +41,8 @@ class ModelPart {
|
||||||
int bind = BIND_NULL;
|
int bind = BIND_NULL;
|
||||||
int follow = BIND_NULL;
|
int follow = BIND_NULL;
|
||||||
float factor = 0.0f; //default factor of 0 so part will not follow a null by default
|
float factor = 0.0f; //default factor of 0 so part will not follow a null by default
|
||||||
|
int offsetBind = BIND_NULL;
|
||||||
|
float offsetFactor = 0.0f;
|
||||||
|
|
||||||
float rotFactor = 1.0f;
|
float rotFactor = 1.0f;
|
||||||
float scaleFactor = 1.0f;
|
float scaleFactor = 1.0f;
|
||||||
|
@ -54,6 +59,7 @@ class ModelPart {
|
||||||
|
|
||||||
void setBind(std::string bindName);
|
void setBind(std::string bindName);
|
||||||
void setFollowTarget(std::string followTarget);
|
void setFollowTarget(std::string followTarget);
|
||||||
|
void setOffsetBind(std::string bindName);
|
||||||
|
|
||||||
void smoothTransform(glm::vec2 position, float rotation, float scale);
|
void smoothTransform(glm::vec2 position, float rotation, float scale);
|
||||||
void setTransform(glm::vec2 position, float rotation, float scale);
|
void setTransform(glm::vec2 position, float rotation, float scale);
|
||||||
|
|
Loading…
Reference in a new issue