public static float GetAngleForCoreEmotion(CoreEmotion e) { float quarterPI = Mathf.PI / 4f; switch (e) { case CoreEmotion.Joy: return(quarterPI * 2f); case CoreEmotion.Trust: return(quarterPI * 1f); case CoreEmotion.Fear: return(0f); case CoreEmotion.Surprise: return(quarterPI * 7f); case CoreEmotion.Sadness: return(quarterPI * 6f); case CoreEmotion.Disgust: return(quarterPI * 5f); case CoreEmotion.Anger: return(quarterPI * 4f); case CoreEmotion.Anticipation: return(quarterPI * 3f); } return(0f); }
// Eh, this is a very simplistic way of approaching the problem public static CoreEmotion FindMainEmotion(EmotionSpectrum e) { CoreEmotion maxEmotion = CoreEmotion.Anger; float maxEmotionValue = 0f; // TODO: Add some fuzziness by picking the best 3 emotions found, or something foreach (CoreEmotion core in System.Enum.GetValues(typeof(CoreEmotion))) { float dot = new EmotionSpectrum(EmotionVector.GetCoreEmotion(core)).Dot(e); if (dot > maxEmotionValue) { maxEmotion = core; maxEmotionValue = dot; } } return(maxEmotion); }
/// <summary> /// This method doesn't say the specific cut, but it constraints /// the time for searching interesting events. It is mostly /// dependent on current emotion. /// </summary> public CutRange EvaluateCutRangeForEvent(EmotionEvent e) { CutRange range = new CutRange(); EmotionSpectrum emotionAtEventTime = emotionEngine.GetSpectrum(e.timestamp); CoreEmotion coreEmotion = EmotionEngine.FindMainEmotion(emotionAtEventTime); // In seconds switch (coreEmotion) { case CoreEmotion.Joy: range.minCutTime = ProceduralEngine.RandomRange(1f, 2f); range.maxCutTime = ProceduralEngine.RandomRange(7f, 8f); break; case CoreEmotion.Trust: range.minCutTime = ProceduralEngine.RandomRange(2f, 5f); range.maxCutTime = ProceduralEngine.RandomRange(7f, 10f); break; case CoreEmotion.Fear: range.minCutTime = ProceduralEngine.RandomRange(1f, 2f); range.maxCutTime = ProceduralEngine.RandomRange(4f, 6f); break; case CoreEmotion.Surprise: range.minCutTime = ProceduralEngine.RandomRange(1.5f, 2f); range.maxCutTime = ProceduralEngine.RandomRange(2f, 4f); break; case CoreEmotion.Sadness: range.minCutTime = ProceduralEngine.RandomRange(1f, 1.5f); range.maxCutTime = ProceduralEngine.RandomRange(2f, 4f); break; case CoreEmotion.Disgust: range.minCutTime = ProceduralEngine.RandomRange(1f, 2f); range.maxCutTime = ProceduralEngine.RandomRange(3f, 4f); break; case CoreEmotion.Anger: range.minCutTime = ProceduralEngine.RandomRange(.3f, 1f); range.maxCutTime = ProceduralEngine.RandomRange(1f, 3f); break; case CoreEmotion.Anticipation: range.minCutTime = ProceduralEngine.RandomRange(2f, 4f); range.maxCutTime = ProceduralEngine.RandomRange(4f, 5f); break; } switch (e.type) { case EmotionEvent.EmotionEventType.Start: // Longer cuts when showing for first time range.minCutTime *= e.chunkDelimitsSegment ? 1f : .75f; range.maxCutTime *= e.chunkDelimitsSegment ? 1f : .75f; break; case EmotionEvent.EmotionEventType.End: // Longer cuts when something disappears for good range.minCutTime *= e.chunkDelimitsSegment ? 1.5f : 1f; range.maxCutTime *= e.chunkDelimitsSegment ? 1.5f : 1f; break; case EmotionEvent.EmotionEventType.LocalMaximum: range.minCutTime *= 1f; range.maxCutTime *= 1f; break; case EmotionEvent.EmotionEventType.LocalMinimum: range.minCutTime *= 2f; range.maxCutTime *= 2f; break; } TrackChunkData structureData = emotionEngine.GetCurrentStructureData(e.timestamp); if (structureData != null) { // More intense -> shorter float normalizedStructuralIntensity = Mathf.Pow(structureData.GetIntensity(e.timestamp), 2f); range.minCutTime *= 1.35f - normalizedStructuralIntensity * .5f; range.maxCutTime *= 1.35f - normalizedStructuralIntensity * .5f; // TODO: decide if we need further modifications of cut time based on type. // Intensity curve should cover most I think StructureType currentStructure = emotionEngine.GetStructureAtTime(e.timestamp); switch (currentStructure) { case StructureType.None: break; case StructureType.Sustain: break; case StructureType.Increasing: break; case StructureType.Decreasing: break; } } range.minCutTime = Mathf.Max(0.01f, range.minCutTime); range.maxCutTime = Mathf.Max(0.02f, range.maxCutTime); float tmp = range.minCutTime; range.minCutTime = Mathf.Min(range.minCutTime, range.maxCutTime); range.maxCutTime = Mathf.Max(tmp, range.maxCutTime); // Normalize times range.minCutTime /= ProceduralEngine.Instance.Duration; range.maxCutTime /= ProceduralEngine.Instance.Duration; return(range); }
public static EmotionVector GetCoreEmotion(CoreEmotion e) { return(new EmotionVector(GetAngleForCoreEmotion(e), 1f)); }