์์ฆ ์ธ์คํ๊ทธ๋จ์์ ๋งค์ฐ ํซํ ํํฐ๋ฅผ ๋ง๋ค์ด๋ด
์๋ค.
์ธ์คํ๊ทธ๋จ ํํฐ์ ๋ํ ์ค๋ช
์ ์ฌ๊ธฐ ์์ธํ ์ค๋ช
๋์ด์์ต๋๋ค.
์ฌ๊ธฐ๋ฅผ ๋๋ฌ Spark AR์ ๋ค์ด๋ก๋ ํฉ๋๋ค.
ํ์ด์ค๋ถ ๊ณ์ ์ผ๋ก ๋ก๊ทธ์ธ์ ํ๊ณ ์ฒซ ํ๋ฉด์์ New Project
๋ฅผ ๋๋ฌ ํ๋ก์ ํธ๋ฅผ ์์ฑํด๋ณผ๊น์?
Blank Project
๋ฅผ ์ ํํฉ๋๋ค.
์ฒซ ํ๋ก์ ํธ๋ฅผ ์์ฑํ์ต๋๋ค. ์ด์ ํํฐ๋ฅผ ๋ง๋ค์ด๋ณผ๊น์?
cmd + s
๋ฅผ ๋๋ฌ ์ ์ฅ์ ๋จผ์ ํด์ฃผ์ธ์.
ํ์์์ผ๋ก ๋ณ๊ฒฝ๋๊ฒ ํ์ธ ๋์๋์?
ํด๋น ์ด๋ฏธ์ง๋ฅผ ๋ค์ด๋ฐ์ Spark AR์ ๋๋๊ทธํด์ ๋ฃ์ด์ฃผ์ธ์.
ํ์ฌ Camera View
๋ฅผ ๋ณด๋ฉด ๊ฒ์์์ด ๊ฐ์ด ๋์ค๋๊ฑธ ๋ณผ์๊ฐ์๋๋ฐ
Blend Mode
๋ฅผ Screen
์ผ๋ก ๋ณ๊ฒฝํด์ค๋๋ค.
๋ณ๊ฒฝํ๋๋ฐ Camera View
์์ ํํฐํด์ ์ฌ์ด์ฆ๊ฐ ๋๋ฌด ์์๊ฒ ๊ฐ์ ๋ณด์
๋๋ค.
Particle System์ ๋๋ฌ Particle ๊ทธ๋ฃน์ Scale๋ฅผ ๋ณ๊ฒฝํด์ค๋๋ค. 0.01 -> 0.1
Lifespan๋ 0.4 -> 1
๋ก ๋ณ๊ฒฝ ํด์ค๋๋ค.
์ฌ๊ธฐ ๊น์ง ๋ฐ๋ผ์ค์ จ๋์? 50% ์ฑ๊ณตํ์ต๋๋ค.
cmd + option + p
๋ฅผ ๋๋ฌ Patch Editor
๋ฅผ ์ผ์ค๋๋ค.
faceTracker0
์ ๋๋๊ทธํ์ฌ Patch Editor
์์ญ ์์ ๋์์ค์๋ค.
faceTracker0
๋
ธ๋์ ์ฒซ๋ฒ์งธ Property
๋ฅผ ๋๋๊ทธํ์ฌ ๋ค์ ๋์ ์ค๋๋ค.
๋ค๋ฅธ Patch
๋ฅผ ๊ฒ์ํ ์์๋ ์ฐฝ์ด ๋จ๋๋ฐ Eyelid
๋ฅผ ์ ํํด์ค๋๋ค.
Particle System์ ์ ํํ์ฌ Transformations
๊ทธ๋ฃน์ Position
์ผ์ชฝ์ ํ์ดํ๋ฅผ ์ ํํฉ๋๋ค.
Eyelid
์ ์ฒซ๋ฒ์งธ Property
๋ฅผ ๋
ธ๋์ ํ์ดํ๊น์ง ๋๋๊ทธํ์ฌ ๋์์ค๋๋ค.
์ผ์ชฝ ๋์ ๋ถ์ด์๋๊ฒ์ ํ์ธํ๋์?
์ง๊ธ Camera View
๋ฅผ ๋ณด๋ฉด Particle์ด ๊ฐ์๊ธฐ ์ฌ๋ผ์ง๋๊ฒ ๊ฑฐ์ฌ๋ฆฝ๋๋ค. ๐ค
์ด์ ์ฝ๋๋ฅผ ์์ฑํด๋ด ์๋ค.
/**
* (c) Facebook, Inc. and its affiliates. Confidential and proprietary.
*/
//==============================================================================
// Welcome to scripting in Spark AR Studio! Helpful links:
//
// Scripting Basics - https://fb.me/spark-scripting-basics
// Reactive Programming - https://fb.me/spark-reactive-programming
// Scripting Object Reference - https://fb.me/spark-scripting-reference
// Changelogs - https://fb.me/spark-changelog
//
// For projects created with v87 onwards, JavaScript is always executed in strict mode.
//==============================================================================
// How to load in modules
import Scene from 'Scene';
import Diagnostics from 'Diagnostics';
// To use variables and functions across files, use export/import keyword
// export const animationDuration = 10;
// Use import keyword to import a symbol from another file
// import { animationDuration } from './script.js'
(async function () { // Enables async/await in JS [part 1]
// To access scene objects
// const [directionalLight] = await Promise.all([
// Scene.root.findFirst('directionalLight0')
// ]);
// To access class properties
// const directionalLightIntensity = directionalLight.intensity;
// To log messages to the console
// Diagnostics.log('Console message logged from the script.');
})(); // Enables async/await in JS [part 2]
์ด๋ ๊ฒ ์์ฑ ๋์ด์์ํ ๋ฐ ๊น๋ํ๊ฒ ์ ๋ฆฌํ๊ณ
์๊น ์์ฑํ Particle System์ ๊ฐ์ ธ์๋ด ์๋ค.
import Scene from 'Scene';
(async function () {
const particleSystem = await Scene.root.findFirst('emitter0'); // emitter0 ์ด๋ผ๋ ์ด๋ฆ์ ์ฌ์ฉํจ.
})();
Scene.root.findFirst
๋ฉ์๋๋ฅผ ํตํด Scene
์ ์กด์ฌํ๋ ์์๋ฅผ ๊ฐ์ ธ์ฌ์์์ต๋๋ค.
์ด์ ํฌ๋ช ๋์ ์ฌ์ด์ฆ๋ฅผ ์กฐ์ ํด๋ด ์๋ค.
import Scene from 'Scene';
import Animation from "Animation";
(async function () {
const emitter0 = await Scene.root.findFirst('emitter0');
emitter0.sizeModifier = Animation.samplers.easeInOutSine(0.0, -0.1);
emitter0.hsvaColorModulationModifier = Animation.samplers.HSVA([
Animation.samplers.constant(1),
Animation.samplers.constant(1),
Animation.samplers.constant(1),
Animation.samplers.easeInOutSine(1, 0),
]);
})();
ํด๋น ์ฝ๋๋ฅผ ์์ฑํ๊ณ Camera View
๋ฅผ ๋ณด๋ฉด ์๊น๋ณด๋ค ๋ ์์ฐ์ค๋ฝ๊ฒ ์ฌ๋ผ์ง๋๊ฑธ ๋ณผ์๊ฐ์์ฃ ?
์ด์ ์ค์ ๊ธฐ๊ธฐ์์ ์คํํด๋ด ์๋ค.
์ธ์คํ๊ทธ๋จ์ผ๋ก ์ ์กํด๋ด ์๋ค.
์๋ง ๋ก๊ทธ์ธ์ด ๋์ด์์ผ๋ฉด ์ด๋ ๊ฒ ๋ ธํฐ๊ฐ ์ฌํ ๋ฐ ๋ค์ด๊ฐ์ ํํฐ๋ฅผ ์ฌ์ฉํด๋ณด์๋ฉด๋ฉ๋๋ค.
์ฌ๊ธฐ๋ฅผ ๋๋ฌ ํํฐ๋ฅผ ์ง์ ์ฌ์ฉํด๋ณผ์์์ต๋๋ค. (์ต๋ 200๋ฒ ๋ณผ์์์ด์.. ๋งํฌ๊ฐ ๋ง๋ฃ๋ ์์์ต๋๋ค.)
ํ๋ก์ ํธ ํ์ผ์ ์ฌ๊ธฐ์ ์ฌ๋ ค๋์์ต๋๋ค
๊ฐ๋จํ๊ฒ ์ธ์คํ๊ทธ๋จ ํํฐ ๋ง๋ค์ด๋ณด๊ธฐ์์ต๋๋ค. ๐
๋ค์ ๊ธ์์ Shader๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ํ์ฌ ๊ธฐ์ ํด๋ณด๊ฒ ์ต๋๋ค.
๋ ํ์ฌ WE-AR์์ ์ธ์คํ๊ทธ๋จ ํํฐ ๊ฐ๋ฐ์๋ฅผ ๋ชจ์งํ๊ณ ์์ต๋๋ค. ์ฌ๊ธฐ์ ์ฑ์ฉ ๊ณต๊ณ ๊ฐ ์์ผ๋ ๋ง์ ์ง์ ๋ถํ๋๋ฆฝ๋๋ค.