Add smoothing
Transform of each part is now smoothed over 4 frames to stop shaking.
This commit is contained in:
parent
a58e7d9428
commit
47c64e3bf3
5
TODO.md
5
TODO.md
|
@ -1,7 +1,6 @@
|
||||||
# Before 1.0
|
# Before 1.0
|
||||||
|
|
||||||
## graphics
|
## graphics
|
||||||
- smoothing
|
|
||||||
|
|
||||||
## docs
|
## docs
|
||||||
- getting started guide
|
- getting started guide
|
||||||
|
@ -9,3 +8,7 @@
|
||||||
|
|
||||||
## models
|
## models
|
||||||
- better default model
|
- better default model
|
||||||
|
|
||||||
|
## vision
|
||||||
|
- eye open/closed
|
||||||
|
- eye look direction
|
||||||
|
|
|
@ -140,7 +140,6 @@ Model::Model(const char* path) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// offsets
|
// offsets
|
||||||
|
|
||||||
auto posOffsetArray = partsVec[i].getArray("pos_offset");
|
auto posOffsetArray = partsVec[i].getArray("pos_offset");
|
||||||
if (posOffsetArray) {
|
if (posOffsetArray) {
|
||||||
auto offsetVec = *posOffsetArray->getDoubleVector();
|
auto offsetVec = *posOffsetArray->getDoubleVector();
|
||||||
|
|
|
@ -40,6 +40,31 @@ void ModelPart::setFollowTarget(std::string followTarget) {
|
||||||
follow = bindStringToNum[followTarget];
|
follow = bindStringToNum[followTarget];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ModelPart::smoothTransform(glm::vec2 position, float rotation, float scale) {
|
||||||
|
histPositions[histI] = position;
|
||||||
|
histRotations[histI] = rotation;
|
||||||
|
histScales[histI] = scale;
|
||||||
|
|
||||||
|
histI++;
|
||||||
|
histI = histI % SMOOTHING_FRAMES;
|
||||||
|
|
||||||
|
glm::vec2 smoothedPosition(0,0);
|
||||||
|
float smoothedRotation = 0;
|
||||||
|
float smoothedScale = 0;
|
||||||
|
|
||||||
|
for(size_t i = 0; i < SMOOTHING_FRAMES; i++) {
|
||||||
|
smoothedPosition += histPositions[i];
|
||||||
|
smoothedRotation += histRotations[i];
|
||||||
|
smoothedScale += histScales[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
smoothedPosition /= SMOOTHING_FRAMES;
|
||||||
|
smoothedRotation /= SMOOTHING_FRAMES;
|
||||||
|
smoothedScale /= SMOOTHING_FRAMES;
|
||||||
|
|
||||||
|
setTransform(smoothedPosition, smoothedRotation, smoothedScale);
|
||||||
|
}
|
||||||
|
|
||||||
void ModelPart::setTransform(glm::vec2 position, float rotation, float scale) {
|
void ModelPart::setTransform(glm::vec2 position, float rotation, float scale) {
|
||||||
transMatrix = glm::ortho(-windowAspectRatio, windowAspectRatio, -1.0f, 1.0f);
|
transMatrix = glm::ortho(-windowAspectRatio, windowAspectRatio, -1.0f, 1.0f);
|
||||||
transMatrix = glm::translate(transMatrix, glm::vec3(position.x, -position.y, 0.0f) + glm::vec3(posOffset, 0.0f));
|
transMatrix = glm::translate(transMatrix, glm::vec3(position.x, -position.y, 0.0f) + glm::vec3(posOffset, 0.0f));
|
||||||
|
@ -55,7 +80,7 @@ void ModelPart::processFaceData(struct FaceData faceData) {
|
||||||
glm::vec2 followDirection = followPosition - bindPosition;
|
glm::vec2 followDirection = followPosition - bindPosition;
|
||||||
glm::vec2 newPosition = bindPosition + (followDirection * factor);
|
glm::vec2 newPosition = bindPosition + (followDirection * factor);
|
||||||
|
|
||||||
setTransform(newPosition, faceData.headRotation, faceData.scale);
|
smoothTransform(newPosition, faceData.headRotation, faceData.scale);
|
||||||
|
|
||||||
// change textures
|
// change textures
|
||||||
selectTexture(0); // if none are triggered, use the first one
|
selectTexture(0); // if none are triggered, use the first one
|
||||||
|
|
|
@ -14,6 +14,9 @@
|
||||||
#define TRIGGER_NULL 0x00
|
#define TRIGGER_NULL 0x00
|
||||||
#define TRIGGER_MOUTH_OPEN 0x01
|
#define TRIGGER_MOUTH_OPEN 0x01
|
||||||
|
|
||||||
|
// number of frames to average for smoothing
|
||||||
|
#define SMOOTHING_FRAMES 4
|
||||||
|
|
||||||
class ModelPart {
|
class ModelPart {
|
||||||
GLuint vao;
|
GLuint vao;
|
||||||
|
|
||||||
|
@ -25,6 +28,11 @@ class ModelPart {
|
||||||
glm::mat4 transMatrix = glm::mat4(1.0f);
|
glm::mat4 transMatrix = glm::mat4(1.0f);
|
||||||
|
|
||||||
bool empty = true;
|
bool empty = true;
|
||||||
|
|
||||||
|
glm::vec2 histPositions[SMOOTHING_FRAMES];
|
||||||
|
float histRotations[SMOOTHING_FRAMES];
|
||||||
|
float histScales[SMOOTHING_FRAMES];
|
||||||
|
size_t histI = 0;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
int bind = BIND_NULL;
|
int bind = BIND_NULL;
|
||||||
|
@ -47,6 +55,7 @@ class ModelPart {
|
||||||
void setBind(std::string bindName);
|
void setBind(std::string bindName);
|
||||||
void setFollowTarget(std::string followTarget);
|
void setFollowTarget(std::string followTarget);
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
void processFaceData(struct FaceData faceData);
|
void processFaceData(struct FaceData faceData);
|
||||||
|
|
Loading…
Reference in a new issue