Example
Do You Like Scary Movies?
This is amazing Jonathan_Hill. Can you share your process?
- Jonathan_Hill20 hours agoLegend
Thanks BelleHabs. Most of the footage was created using Google Flow. There are five videos in total, based on these three images:
But when the teddy bear speaks, that was created using the Articulate's AI Avatar tool. I find it produces much more consistent and expressive results than Google Flow, especially for non-human characters:The entire interaction is contained in one slide, with most of the videos stacked on top of each other on the base slide. I use the visibility settings in the layers to show / hide each each video when it's needed. In this way, there's no lag between each video, as we're not moving to another slide. It's a trick I've used for years to create short branching video experiences.
The shuffle effect on the cassettes is achieved with motion paths, variables, and JavaScript, which changes the z-index position of the three cassettes while keeping the control buttons always above them. Having the three cassettes stacked on top of one another was a great way to save space in my layout, and made the process of reviewing and selecting the answer a little more interesting.
And here's the Javascript:var player = GetPlayer(); var IDS = { A: "5vd1pYkVtu0", B: "63DH1h7iHLj", C: "6k3mzhmV3ID" }; var TOP_IDS = ["5xU0Xiccp2s", "6L8mN7guBDE"]; // PLAY, SHUFFLE var ORDERS = { 1: ["A", "B", "C"], 2: ["B", "C", "A"], 3: ["C", "A", "B"] }; var DELAY_MS = 450; var BASE_Z = 1000; var TOP_Z = BASE_Z + 100; // always above the cassettes function setZ(id, z) { var els = document.querySelectorAll('[data-model-id="' + id + '"]'); for (var j = 0; j < els.length; j++) { els[j].style.zIndex = z; } } function applyTop() { for (var t = 0; t < TOP_IDS.length; t++) { setZ(TOP_IDS[t], TOP_Z); } } function applyOrder(order) { for (var i = 0; i < order.length; i++) { setZ(IDS[order[i]], BASE_Z + (order.length - i)); } applyTop(); } if (window.cassetteWatcher) { clearInterval(window.cassetteWatcher.interval); clearTimeout(window.cassetteWatcher.timeout); window.removeEventListener("resize", window.cassetteWatcher.onResize); } var state = { last: player.GetVar("Cassette"), current: null, timeout: null }; state.onResize = function () { setTimeout(function () { if (state.current) { applyOrder(state.current); } else { applyTop(); } }, 100); }; window.addEventListener("resize", state.onResize); state.interval = setInterval(function () { var value = player.GetVar("Cassette"); if (value === state.last) { return; } state.last = value; var order = ORDERS[value]; if (!order) { return; } clearTimeout(state.timeout); state.timeout = setTimeout(function () { state.current = order; applyOrder(order); }, DELAY_MS); }, 100); applyTop(); // lift PLAY and SHUFFLE straight away window.cassetteWatcher = state;Hope that helps!
- BelleHabs2 hours agoCommunity Member
Thank you so much for sharing your process, Jonathan_Hill. This is so helpful. I had never heard of Google Flow until now.
