Files
explorer-monorepo/virtual-banker/avatar/animation/expressions.go

69 lines
1.6 KiB
Go

package animation
// ExpressionMapping maps emotion values to facial expressions
type ExpressionMapping struct {
Valence float64 // -1.0 to 1.0
Arousal float64 // 0.0 to 1.0
}
// GetExpressionFromEmotion maps emotion to expression parameters
func GetExpressionFromEmotion(valence, arousal float64) ExpressionParams {
// Map valence/arousal to expression
// High valence + high arousal = happy/excited
// Low valence + high arousal = angry/frustrated
// High valence + low arousal = calm/content
// Low valence + low arousal = sad/depressed
var emotion string
var smileAmount float64
var browRaise float64
var eyeWideness float64
if valence > 0.5 && arousal > 0.5 {
emotion = "happy"
smileAmount = 0.8
browRaise = 0.3
eyeWideness = 0.6
} else if valence < -0.5 && arousal > 0.5 {
emotion = "angry"
smileAmount = -0.5
browRaise = -0.7
eyeWideness = 0.8
} else if valence > 0.3 && arousal < 0.3 {
emotion = "calm"
smileAmount = 0.3
browRaise = 0.0
eyeWideness = 0.4
} else if valence < -0.3 && arousal < 0.3 {
emotion = "sad"
smileAmount = -0.3
browRaise = 0.2
eyeWideness = 0.3
} else {
emotion = "neutral"
smileAmount = 0.0
browRaise = 0.0
eyeWideness = 0.5
}
return ExpressionParams{
Emotion: emotion,
SmileAmount: smileAmount,
BrowRaise: browRaise,
EyeWideness: eyeWideness,
Valence: valence,
Arousal: arousal,
}
}
// ExpressionParams contains facial expression parameters
type ExpressionParams struct {
Emotion string
SmileAmount float64 // -1.0 to 1.0
BrowRaise float64 // -1.0 to 1.0
EyeWideness float64 // 0.0 to 1.0
Valence float64
Arousal float64
}