From 09c60db8c1eac4eb37399677f7ec802af7872795 Mon Sep 17 00:00:00 2001 From: Epicalert Date: Tue, 8 Jun 2021 10:53:59 +0800 Subject: [PATCH] Add eye direction in model Adds eye direction support in the model system and in the 'test' model. --- models/test/face-eyes.png | Bin 9011 -> 8611 bytes models/test/face-iris.png | Bin 0 -> 8922 bytes models/test/model.toml | 8 ++++++++ src/cv.cpp | 1 + src/model.cpp | 12 ++++++++++++ src/modelpart.cpp | 8 +++++++- src/modelpart.hpp | 6 ++++++ 7 files changed, 34 insertions(+), 1 deletion(-) create mode 100644 models/test/face-iris.png diff --git a/models/test/face-eyes.png b/models/test/face-eyes.png index 218153c3f4d8438a7cb519561b31526dafbbb0b4..0d71201cb71826dc3df9d5213e13bcd56db7678f 100644 GIT binary patch delta 4637 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 Iu=T(Ff3q~L4*&oF delta 5040 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 diff --git a/models/test/face-iris.png b/models/test/face-iris.png new file mode 100644 index 0000000000000000000000000000000000000000..0b01c66495af4e826302eb706359a30ed6ec4cbc GIT binary patch literal 8922 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 literal 0 HcmV?d00001 diff --git a/models/test/model.toml b/models/test/model.toml index 1557b8f..6338d35 100644 --- a/models/test/model.toml +++ b/models/test/model.toml @@ -17,6 +17,14 @@ bind = "head" follow = "face" factor = 0.85 +[[part]] +texture = "face-iris.png" +bind = "head" +follow = "face" +factor = 0.85 +offset_bind = "offset-eyes" +offset_factor = 0.03 + [[part]] bind = "head" follow = "face" diff --git a/src/cv.cpp b/src/cv.cpp index df49863..2ad7d48 100644 --- a/src/cv.cpp +++ b/src/cv.cpp @@ -137,6 +137,7 @@ void cvFrame() { landmarks[biggestFace][30].x * 2 / (float)frame.cols - 1, landmarks[biggestFace][30].y * 2 / (float)frame.rows - 1 ); + faceData.positions[OFFSET_EYES] = eyeVector; faceData.triggers[TRIGGER_NULL] = false; faceData.triggers[TRIGGER_MOUTH_OPEN] = diff --git a/src/model.cpp b/src/model.cpp index 4b0e876..de0ba3f 100644 --- a/src/model.cpp +++ b/src/model.cpp @@ -122,6 +122,7 @@ Model::Model(const char* path) { // rotation and scale factor auto rotFacResult = partsVec[i].getDouble("rot_factor"); auto scaleFacResult = partsVec[i].getDouble("scale_factor"); + auto offsetFacResult = partsVec[i].getDouble("offset_factor"); if (rotFacResult.first) { newPart.rotFactor = (float)rotFacResult.second; @@ -129,6 +130,10 @@ Model::Model(const char* path) { if (scaleFacResult.first) { newPart.scaleFactor = (float)scaleFacResult.second; } + if (offsetFacResult.first) { + newPart.offsetFactor = (float)offsetFacResult.second; + } + // 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]); } + // offset bind + auto offsetBindResult = partsVec[i].getString("offset_bind"); + if (offsetBindResult.first) { + newPart.setOffsetBind(offsetBindResult.second); + } + + // texture auto textureSingle = partsVec[i].getString("texture"); diff --git a/src/modelpart.cpp b/src/modelpart.cpp index d5001b6..7073771 100644 --- a/src/modelpart.cpp +++ b/src/modelpart.cpp @@ -11,6 +11,7 @@ std::map bindStringToNum { {"null", BIND_NULL}, {"head", BIND_HEAD}, {"face", BIND_FACE}, + {"offset-eyes", OFFSET_EYES}, }; std::map triggerStringToNum { @@ -40,6 +41,10 @@ void ModelPart::setFollowTarget(std::string followTarget) { follow = bindStringToNum[followTarget]; } +void ModelPart::setOffsetBind(std::string bindName) { + offsetBind = bindStringToNum[bindName]; +} + void ModelPart::smoothTransform(glm::vec2 position, float rotation, float scale) { histPositions[histI] = position; histRotations[histI] = rotation; @@ -78,7 +83,8 @@ void ModelPart::processFaceData(struct FaceData faceData) { glm::vec2 bindPosition = faceData.positions[bind]; glm::vec2 followPosition = faceData.positions[follow]; 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); diff --git a/src/modelpart.hpp b/src/modelpart.hpp index 63db13e..9f5a6a0 100644 --- a/src/modelpart.hpp +++ b/src/modelpart.hpp @@ -11,6 +11,9 @@ #define BIND_HEAD 0x01 #define BIND_FACE 0x02 +#define OFFSET_EYES 0x10 + + #define TRIGGER_NULL 0x00 #define TRIGGER_MOUTH_OPEN 0x01 @@ -38,6 +41,8 @@ class ModelPart { int bind = BIND_NULL; int follow = BIND_NULL; 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 scaleFactor = 1.0f; @@ -54,6 +59,7 @@ class ModelPart { void setBind(std::string bindName); void setFollowTarget(std::string followTarget); + void setOffsetBind(std::string bindName); void smoothTransform(glm::vec2 position, float rotation, float scale); void setTransform(glm::vec2 position, float rotation, float scale);