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
|
||||
|
||||
## graphics
|
||||
- smoothing
|
||||
|
||||
## docs
|
||||
- getting started guide
|
||||
|
@ -9,3 +8,7 @@
|
|||
|
||||
## models
|
||||
- better default model
|
||||
|
||||
## vision
|
||||
- eye open/closed
|
||||
- eye look direction
|
||||
|
|
|
@ -140,7 +140,6 @@ Model::Model(const char* path) {
|
|||
}
|
||||
|
||||
// offsets
|
||||
|
||||
auto posOffsetArray = partsVec[i].getArray("pos_offset");
|
||||
if (posOffsetArray) {
|
||||
auto offsetVec = *posOffsetArray->getDoubleVector();
|
||||
|
|
|
@ -40,6 +40,31 @@ void ModelPart::setFollowTarget(std::string 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) {
|
||||
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));
|
||||
|
@ -55,7 +80,7 @@ void ModelPart::processFaceData(struct FaceData faceData) {
|
|||
glm::vec2 followDirection = followPosition - bindPosition;
|
||||
glm::vec2 newPosition = bindPosition + (followDirection * factor);
|
||||
|
||||
setTransform(newPosition, faceData.headRotation, faceData.scale);
|
||||
smoothTransform(newPosition, faceData.headRotation, faceData.scale);
|
||||
|
||||
// change textures
|
||||
selectTexture(0); // if none are triggered, use the first one
|
||||
|
|
|
@ -14,6 +14,9 @@
|
|||
#define TRIGGER_NULL 0x00
|
||||
#define TRIGGER_MOUTH_OPEN 0x01
|
||||
|
||||
// number of frames to average for smoothing
|
||||
#define SMOOTHING_FRAMES 4
|
||||
|
||||
class ModelPart {
|
||||
GLuint vao;
|
||||
|
||||
|
@ -26,6 +29,11 @@ class ModelPart {
|
|||
|
||||
bool empty = true;
|
||||
|
||||
glm::vec2 histPositions[SMOOTHING_FRAMES];
|
||||
float histRotations[SMOOTHING_FRAMES];
|
||||
float histScales[SMOOTHING_FRAMES];
|
||||
size_t histI = 0;
|
||||
|
||||
public:
|
||||
int bind = BIND_NULL;
|
||||
int follow = BIND_NULL;
|
||||
|
@ -47,6 +55,7 @@ class ModelPart {
|
|||
void setBind(std::string bindName);
|
||||
void setFollowTarget(std::string followTarget);
|
||||
|
||||
void smoothTransform(glm::vec2 position, float rotation, float scale);
|
||||
void setTransform(glm::vec2 position, float rotation, float scale);
|
||||
|
||||
void processFaceData(struct FaceData faceData);
|
||||
|
|
Loading…
Reference in a new issue