ARKit Face Tracking - juniverse1103/ARKitStudy GitHub Wiki

ARFaceTrackingConfiguration

TrueDepth ์นด๋ฉ”๋ผ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž์˜ ์–ผ๊ตด ์›€์ง์ž„ ๋˜๋Š” ํ‘œ์ •์„ ์ถ”์ ํ•˜๋Š” configuration.


Overview

Face Tracking Configuration ์€ ์žฅ์น˜์˜ ์ „๋ฉด์นด๋ฉ”๋ผ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ทฐ ๋‚ด์˜ ์‚ฌ์šฉ์ž์˜ ์–ผ๊ตด์„ ์ธ์‹ํ•ฉ๋‹ˆ๋‹ค. Configuration์ด ์‹คํ–‰๋˜๊ณ  ์žˆ๋Š” ์ค‘์—, AR ์„ธ์…˜์€ ์‚ฌ์šฉ์ž์˜ ์–ผ๊ตด์„ ์ธ์‹ํ•˜๊ณ (์ „๋ฉด ์นด๋ฉ”๋ผ ์ด๋ฏธ์ง€ ๋‚ด์—์„œ ๋ณด์ผ ๊ฒฝ์šฐ), ์„ธ์…˜ ๋‚ด์˜ anchor ๋ฆฌ์ŠคํŠธ์— ๊ทธ ์–ผ๊ตด์„ ๋‚˜ํƒ€๋‚ด๋Š” ARFaceAnchor ๊ฐ์ฒด๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ๊ฐ์˜ face anchor๋Š” ์–ผ๊ตด์˜ ์œ„์น˜์™€ ๋ฐฉํ–ฅ์— ๋Œ€ํ•œ ์ •๋ณด, ์–ผ๊ตด์˜ ์œ„์ƒ, ๊ทธ๋ฆฌ๊ณ  ํ‘œ์ •์„ ๋‚˜ํƒ€๋‚ด๋Š” ํŠน์ง•์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์ค‘์š”

Face tracking์€ ์ „๋ฉด TrueDepth ์นด๋ฉ”๋ผ๋ฅผ ์ง€์›ํ•˜๋Š” iOS ์žฅ์น˜์—์„œ๋งŒ ์ง€์›๋ฉ๋‹ˆ๋‹ค(iOS Device Compability Reference๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”). ์‚ฌ์šฉ์ž์—๊ฒŒ face tracking์„ ํ•„์š”๋กœ ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๊ธฐ ์ „์— ARFaceTrackingConfiguration์˜ isSupported ํ”„๋กœํผํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ face tracking์ด ํ˜„์žฌ ์žฅ์น˜์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ์ง€ ํ™•์ธํ•˜์„ธ์š”.

ARFaceTrackingConfiguration ํด๋ž˜์Šค๋Š” ์–ด๋–ค ๋ฉ”์†Œ๋“œ๋‚˜ ํ”„๋กœํผํ‹ฐ๋„ ์ œ๊ณตํ•˜์ง€ ์•Š์ง€๋งŒ, ์ƒ์œ„ํด๋ž˜์Šค์ธ ARConfiguration์œผ๋กœ๋ถ€ํ„ฐ ์ƒ์†๋ฐ›์€ ๋ชจ๋“  ํ”„๋กœํผํ‹ฐ๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ์ถ”๊ฐ€์ ์œผ๋กœ, isLightEstimationEnabled ์„ค์ •์„ ํ—ˆ์šฉํ•˜๋ฉด, face tracking configuration์€ ์ธ์‹๋œ ์–ผ๊ตด์„ ๋ผ์ดํŠธ ํ”„๋กœ๋ธŒ๋กœ ์‚ฌ์šฉํ•ด ์ถ”์ •๋œ ๋ฐฉํ–ฅ์ ์ธ, ํ˜น์€ ํ™˜๊ฒฝ์ ์ธ ์กฐ๋ช…(ARDirectionalLightEstimate ๊ฐ์ฒด)์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

Note

Face tracking์€ ์•ฑ์— ๊ฐœ์ธ์ ์ธ ์–ผ๊ตด ์ •๋ณด๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์ผ ARKit face tracking ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด, ์•ฑ์€ ๋ฐ˜๋“œ์‹œ ๊ฐœ๋ฐœ์ž๊ฐ€ ์–ด๋–ค ์˜๋„๋กœ ์‚ฌ์šฉ์ž์˜ ์–ผ๊ตด ๋ฐ์ดํ„ฐ์™€ face tracking๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ• ์ง€ ๋ช…์‹œํ•˜๋Š” ๊ฐœ์ธ ์ •๋ณด ์ •์ฑ…์„ ํฌํ•จํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ARFaceAnchor

Face-tracking AR ์„ธ์…˜์—์„œ ์ธ์‹๋œ ์–ผ๊ตด์˜ ์ž์„ธ(pose), ์œ„์ƒ(topology), ๊ทธ๋ฆฌ๊ณ  ํ‘œ์ •(expression)์— ๋Œ€ํ•œ ์ •๋ณด์ž…๋‹ˆ๋‹ค.


Overview

Face-tracking AR ์„ธ์…˜์„ ์‹คํ–‰ํ•˜์—ฌ(ARFaceTrackingConfiguration์„ ๋ณด์‹ญ์‹œ์˜ค), ์ „๋ฉด ์นด๋ฉ”๋ผ๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉ์ž์˜ ์–ผ๊ตด์ด ์ธ์‹๋˜์—ˆ์„ ๋•Œ, ์„ธ์…˜์€ ์ž๋™์œผ๋กœ ์„ธ์…˜์˜ anchor ๋ฆฌ์ŠคํŠธ์— ARFaceAnchor ๊ฐ์ฒด๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ๊ฐ์˜ face anchor๋Š” ์–ผ๊ตด์˜ ํ˜„์žฌ ์œ„์น˜์™€ ๋ฐฉํ–ฅ(position and orientation), ์œ„์ƒ(topology), ๊ทธ๋ฆฌ๊ณ  ํ‘œ์ •(facial expression)์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

Tracking Face Position and Orientation

์ƒ์†๋œ transform ํ”„๋กœํผํ‹ฐ๋Š” world coordinates ๋‚ด์—์„œ์˜ ํ˜„์žฌ ์–ผ๊ตด์˜ ์œ„์น˜์™€ ๋ฐฉํ–ฅ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ํ‘œํ˜„ํ•ฉ๋‹ˆ๋‹ค; ์ด๋Š”, ์ขŒํ‘œ๊ณต๊ฐ„ ๋‚ด์—์„œ ์„ธ์…˜ configuration์˜ worldAlignment ํ”„๋กœํผํ‹ฐ์— ์˜ํ•ด ์ƒ๋Œ€์ ์œผ๋กœ ํŠน์ •๋ฉ๋‹ˆ๋‹ค. ์ด ๋ณ€ํ™˜ ํ–‰๋ ฌ์„ ์‚ฌ์šฉํ•˜์—ฌ AR scene ๋‚ด์˜ ์–ผ๊ตด์— "๋ถ€์ฐฉ" ํ•˜๊ณ  ์‹ถ์€ ๊ฐ€์ƒ์˜ ์ปจํ…์ธ ๋ฅผ ์œ„์น˜์‹œํ‚ค์„ธ์š”.

transform

A matrix encoding the position, orientation, and scale of the anchor relative to the world coordinate space of the AR session the anchor is placed in.

Anchor๊ฐ€ ๋†“์—ฌ์ง„ AR ์„ธ์…˜์˜ world coordinate space ์— ์ƒ๋Œ€์ ์œผ๋กœ anchor์˜ ์œ„์น˜, ๋ฐฉํ–ฅ, ๊ทธ๋ฆฌ๊ณ  ํฌ๊ธฐ๋ฅผ ์ธ์ฝ”๋”ฉํ•˜๋Š” ํ–‰๋ ฌ์ž…๋‹ˆ๋‹ค.

var transfrom: simd_float4x4{get}

worldAlignment

A value specifying how the session maps real-world device motion into a 3D scene coordinate system.

์‹ค์ œ-์„ธ๊ณ„์˜ ์žฅ์น˜ ์›€์ง์ž„์„ 3D scene ์ขŒํ‘œ ์‹œ์Šคํ…œ ๋‚ด์— ์–ด๋–ป๊ฒŒ ๋งตํ•‘ํ• ์ง€ ํŠน์ •ํ•˜๋Š” ๊ฐ’์ž…๋‹ˆ๋‹ค.

var worldAlignment: ARConfiguration.WorldAlignment{get set}

Discussion

AR ๊ฒฝํ—˜์„ ๋งŒ๋“œ๋Š” ์ผ์€ ์‹ค์ œ ์„ธ๊ณ„์˜ ์œ„์น˜์™€ ์žฅ์น˜์˜ ์›€์ง์ž„์— ๋Œ€ํ•ด ๋งตํ•‘๋˜๋Š” ๊ฐ€์ƒ์˜ 3D ๊ณต๊ฐ„ ๋‚ด์— ์ขŒํ‘œ๊ณ„๋ฅผ ๊ตฌ์„ฑํ•˜๊ณ , ๋ฌผ์ฒด๋ฅผ ์œ„์น˜์‹œํ‚ค๋Š” ๊ฒƒ์— ์˜์กดํ•ฉ๋‹ˆ๋‹ค. ์„ธ์…˜ configuration์„ ์‹คํ–‰ํ•  ๋•Œ, ARKit์€ ์žฅ์น˜์˜ ์œ„์น˜์™€ ๋ฐฉํ–ฅ์— ๊ธฐ์ดˆํ•œ ์žฅ๋ฉด ์ขŒํ‘œ๊ณ„๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค; ๊ฐœ๋ฐœ์ž๊ฐ€ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ AR ์„ธ์…˜์ด ์ธ์‹ํ•œ ๋ชจ๋“  ARAnchor ๊ฐ์ฒด๋Š” ๊ทธ ์ขŒํ‘œ๊ณ„์— ์ƒ๋Œ€์ ์œผ๋กœ ์œ„์น˜๋ฉ๋‹ˆ๋‹ค.

๊ฐ€๋Šฅํ•œ ๊ฐ’์„ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ARConfiguration.WorldAlignment๋ฅผ ๋ณด์‹ญ์‹œ์˜ค.

ARConfiguration.WorldAlignment

ARKit์ด ์‹ค์ œ ์„ธ๊ณ„์˜ ์žฅ์น˜ ์›€์ง์ž„์— ๊ธฐ์ดˆํ•ด์„œ ์–ด๋–ป๊ฒŒ ์žฅ๋ฉด ์ขŒํ‘œ๊ณ„๋ฅผ ์ƒ์„ฑํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ์˜ต์…˜๋“ค์ž…๋‹ˆ๋‹ค.

Declaration

enum WorldAlignment : Int

Alignments

case gravity

  • ์ขŒํ‘œ๊ณ„์˜ y์ถ•์€ ์ค‘๋ ฅ ๋ฐฉํ–ฅ๊ณผ ํ‰ํ–‰ํ•ฉ๋‹ˆ๋‹ค, ๊ทธ๋ฆฌ๊ณ  ์ค‘๋ ฅ์˜ ์›์ ์€ ์žฅ์น˜์˜ ์ดˆ๊ธฐ ์œ„์น˜์ž…๋‹ˆ๋‹ค.

case gravityAndHeading

  • ์ขŒํ‘œ๊ณ„์˜ y์ถ•์€ ์ค‘๋ ฅ ๋ฐฉํ–ฅ๊ณผ ํ‰ํ–‰ํ•˜๋ฉฐ, ์ขŒํ‘œ๊ณ„์˜ x ์ถ•๊ณผ z ์ถ•์€ ๋‚˜์นจ๋ฐ˜์˜ ๋จธ๋ฆฌ ๋ฐฉํ–ฅ์„ ํ–ฅํ•ฉ๋‹ˆ๋‹ค, ๊ทธ๋ฆฌ๊ณ  ๊ทธ ์›์ ์€ ์žฅ์น˜์˜ ์ดˆ๊ธฐ ์œ„์น˜ ์ž…๋‹ˆ๋‹ค.

case camera

  • ์žฅ๋ฉด ์ขŒํ‘œ๊ณ„๋Š” ์นด๋ฉ”๋ผ์˜ ๋ฐฉํ–ฅ๊ณผ ๋งž์ถ”๊ธฐ ์œ„ํ•ด์„œ ๊ณ ์ •๋ฉ๋‹ˆ๋‹ค.

์ด ๋ณ€ํ™˜ ํ–‰๋ ฌ์€ ์–ผ๊ตด์— ๋Œ€ํ•ด ์ƒ๋Œ€์ ์œผ๋กœ ๋‹ค๋ฅธ ๊ตฌ์„ฑ ์š”์†Œ๋“ค์„ ์œ„์น˜์‹œํ‚ค๊ธฐ ์œ„ํ•˜์—ฌ ์–ผ๊ตด ์ขŒํ‘œ๊ณ„๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

์–ผ๊ตด ์ขŒํ‘œ๊ณต๊ฐ„์˜ ๋‹จ์œ„๋Š” ๋ฏธํ„ฐ ๋‹จ์œ„์ด๋ฉฐ, ์›์ ์€ ์•„๋ž˜์— ๋ณด์—ฌ์ง€๋Š” ๋ชจ์Šต๊ณผ ๊ฐ™์ด ์–ผ๊ตด ๋’ท๋ฉด์— ์œ„์น˜ํ•ฉ๋‹ˆ๋‹ค.

์ด ์ขŒํ‘œ๊ณ„๋Š” ์‹œ๊ณ„๋ฐฉํ–ฅ(right-handed)์ž…๋‹ˆ๋‹ค-์–‘์˜ x๋ฐฉํ–ฅ์ด ๊ด€์ฐฐ์ž์˜ ์˜ค๋ฅธ์ชฝ์„ ๊ฐ€๋ฆฌํ‚ค๋ฉฐ(์–ผ๊ตด์˜ ๊ด€์ ์—์„œ๋Š” ์™ผ์ชฝ), ์–‘์˜ y๋ฐฉํ–ฅ์€ ์œ„๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ณ (์–ผ๊ตด ์ž์ฒด์— ์ƒ๋Œ€์ ์ธ ๊ธฐ์ค€์ด๋ฉฐ, ์„ธ๊ณ„์™€๋Š” ๊ด€๊ณ„๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค), ์–‘์˜ z ๋ฐฉํ–ฅ์€ ์–ผ๊ตด์„ ๋šซ๊ณ  ์•ž์œผ๋กœ ๋‚˜์˜ค๋Š” ๋ฐฉํ–ฅ์ž…๋‹ˆ๋‹ค(๊ด€์ฐฐ์ž๋ฅผ ํ–ฅํ•ด์„œ).

Using Face Topology

geometry ํ”„๋กœํผํ‹ฐ๋Š” ์ผ๋ฐ˜์ ์ธ ์–ผ๊ตด ๋ชจ๋ธ์„ ์ธ์‹๋œ ์–ผ๊ตด์˜ ์น˜์ˆ˜, ๋ชจ์–‘, ๊ทธ๋ฆฌ๊ณ  ํ˜„์žฌ ์–ผ๊ตด ํ‘œ์ •์— ์ผ์น˜์‹œํ‚ค๋Š” ๊ฒƒ์„ ํ™•์ธํ•˜๋Š” ์ž์„ธํ•œ ์œ„์ƒ ์ •๋ณด๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ARFaceGeometry ๊ฐ์ฒด๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

geometry

์ธ์‹๋œ ์–ผ๊ตด์˜ ์œ„์ƒ์„ ๋‚˜ํƒ€๋‚ด๋Š” ๋Œ€๊ฐ•์˜(coarse) ์‚ผ๊ฐํ˜• ๋ฉ”์‰ฌ์ž…๋‹ˆ๋‹ค.

Declaration
var geometry: ARFaceGeometry{get}
Discussion

์ด ๋ฉ”์‰ฌ๋Š” ์ผ๋ฐ˜์ ์ธ ์–ผ๊ตด ๋ชจ๋ธ์„ ์ธ์‹๋œ ์–ผ๊ตด์˜ ์น˜์ˆ˜, ๋ชจ์–‘, ๊ทธ๋ฆฌ๊ณ  ํ˜„์žฌ ์–ผ๊ตด ํ‘œ์ •์— ์ผ์น˜์‹œํ‚ค๋Š” ๊ฒƒ์„ ํ™•์ธํ•˜๋Š” ๊ผญ์ง€์ (vertex), ์ง€ํ‘œ(index), ๊ทธ๋ฆฌ๊ณ  ์–ผ๊ตด์˜ 3D ๋ชจ์–‘์„ ๋‚˜ํƒ€๋‚ด๋Š” ํ…์Šค์ฒ˜ ์ขŒํ‘œ ๋ฒ„ํผ(texture coordinate buffers)๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์ด ๋ฒ„ํผ๋“ค์„ ์„ ํ˜ธํ•˜๋Š” ๋ Œ๋”๋ง ์—”์ง„์— ๋„˜๊ฒจ์ฃผ๋Š” ๊ฒƒ์œผ๋กœ face geometry๋ฅผ ์‹œ๊ฐํ™” ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด face geometry๋ฅผ ์‹œ๊ฐํ™” ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” SceneKit์„ ์‚ฌ์šฉํ•˜์—ฌ, ARSCNFaceGeometry ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ๊ทธ๊ฒƒ์˜ update(from: ) ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ธ์‹๋œ face geometry์™€ ์ผ์น˜๋˜๋„๋ก ์—…๋ฐ์ดํŠธํ•˜์‹ญ์‹œ์˜ค.

์ด ๋ชจ๋ธ์€ ์‚ฌ์šฉ์ž์˜ ์–ผ๊ตด ๋ชจ์–‘์— ๋”ฐ๋ผ ์ปจํ…์ธ ๋ฅผ ๋ฎ์–ด์”Œ์šฐ๋Š” ์šฉ๋„์˜ ๊ธฐ์ค€์œผ๋กœ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค- ์˜ˆ๋ฅผ๋“ค์–ด, ๊ฐ€์ƒ ํ™”์žฅ ๋˜๋Š” ํƒ€ํˆฌ๋ฅผ ์ ์šฉํ•˜๋Š” ๊ฒƒ๋“ค์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ์ด ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•˜์—ฌ occlusion geometry๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค-์–ด๋– ํ•œ ์‹œ๊ฐ์ ์ธ ์ปจํ…์ธ ๋„ ๋ Œ๋”ํ•˜์ง€ ์•Š์ง€๋งŒ(์นด๋ฉ”๋ผ ์ด๋ฏธ์ง€๊ฐ€ ๊ทธ๋Œ€๋กœ ๋ณด์—ฌ์ง€๋Š” ๊ฒƒ์„ ํ—ˆ์šฉํ•˜์—ฌ), ์žฅ๋ฉด ๋‚ด์˜ ๋‹ค๋ฅธ ๊ฐ€์ƒ ์ปจํ…์ธ ์˜ ์นด๋ฉ”๋ผ์˜ ๋ทฐ๋ฅผ ๊ฐ€๋กœ๋ง‰๋Š” 3D ๋ชจ๋ธ์ž…๋‹ˆ๋‹ค.

Tracking Facial Expressions

blendShapes ํ”„๋กœํผํ‹ฐ๋Š” ํ˜„์žฌ ์–ผ๊ตด ํ‘œ์ •์— ๋Œ€ํ•œ ๋†’์€-๋ ˆ๋ฒจ์˜ ๋ชจ๋ธ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ชจ๋ธ์€ ๋งŽ์€ ๊ณ ์œ ํ•œ ๊ณ„์ˆ˜๋“ค์˜ ์—ฐ์†์„ ํ†ตํ•ด์„œ ๋‚˜ํƒ€๋‚ด์–ด์ง„ ํŠน์ •ํ•œ ์–ผ๊ตด ๋ชจ์–‘์˜ ์›€์ง์ž„๊ณผ ์ค‘๋ฆฝ์ ์ธ ์กฐ์ • ์‚ฌ์ด์˜ ์ƒ๋Œ€์ ์ธ ๊ด€๊ณ„๋ฅผ ํ†ตํ•ด์„œ ํ‘œํ˜„๋ฉ๋‹ˆ๋‹ค.

์ด blend shape ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์บ๋ฆญํ„ฐ๋‚˜ ์•„๋ฐ”ํƒ€์™€ ๊ฐ™์€ 2D ๋˜๋Š” 3D ์ปจํ…์ธ ๋ฅผ ์‚ฌ์šฉ์ž์˜ ์–ผ๊ตด ํ‘œ์ •์— ๋”ฐ๋ผ์„œ ์›€์ง์ด๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

blendShapes

ํŠน์ •ํ•œ ์–ผ๊ตด ๋ชจ์–‘์˜ ์›€์ง์ž„์˜ ํ˜•ํƒœ๋กœ ์ธ์‹๋œ ์–ผ๊ตด ํ‘œ์ •์„ ๋‚˜ํƒ€๋‚ด๋Š” ์ง€๋ช…๋œ ๊ณ„์ˆ˜๋“ค์˜ ๋”•์…”๋„ˆ๋ฆฌ ์ž…๋‹ˆ๋‹ค.

Declaration

var blendShapes: [ARFaceAnchor.BlendShapeLocation : NSNumber]{get}

Discussion

๋”•์…”๋„ˆ๋ฆฌ์— ์กด์žฌํ•˜๋Š” ๊ฐ๊ฐ์˜ ํ‚ค๋Š”(ARFaceAnchor.BlendShapeLocation ์ƒ์ˆ˜) ARKit์— ์˜ํ•ด์„œ ์ธ์‹๋˜๋Š” ๋งŽ์€ ํŠน์ •ํ•œ ์–ผ๊ตด์˜ ํŠน์ง•๋“ค ์ค‘ ํ•˜๋‚˜๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ๊ฐ๊ฐ์˜ ํ‚ค์— ๋Œ€์‘๋˜๋Š” ๋ฐธ๋ฅ˜๋Š” ๊ทธ ํŠน์ง•์ด ์ค‘๋ฆฝ ์ƒํƒœ์— ๋น„ํ•ด ์ƒ๋Œ€์ ์œผ๋กœ ์–ผ๋งˆ๋‚˜ ์›€์ง์ด๋Š”์ง€๋ฅผ 0.0(์ค‘๋ฆฝ)์—์„œ 1.0(์ตœ๋Œ€ ์›€์ง์ž„) ๊นŒ์ง€์˜ ํ”Œ๋กœํŒ… ์†Œ์ˆ˜๋กœ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

Blend shape ๊ณ„์ˆ˜๋“ค์€ 2D ๋˜๋Š” 3D ์บ๋ฆญํ„ฐ๊ฐ€ ์‚ฌ์šฉ์ž์˜ ์–ผ๊ตด ํ‘œ์ •์„ ๋”ฐ๋ผ ์›€์ง์ด๋„๋ก ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ARKit์€ ์ž์„ธํ•œ ์–ผ๊ตด ํ‘œ์ • ๋ชจ๋ธ์„ ์œ„ํ•ด์„œ ๋งŽ์€ ์ข…๋ฅ˜์˜ blend shap coefficients๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค; ์›ํ•˜๋Š” ์‹œ๊ฐ ํšจ๊ณผ๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋งŽ๊ฑฐ๋‚˜ ์ ์€ ์ˆ˜์˜ ๊ณ„์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ์˜ค์ง jawOpen, eyeBlinkleft, eyeBlinkRight ๊ณ„์ˆ˜ ๋งŒ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ„๋‹จํ•œ ๋งŒํ™” ์บ๋ฆญํ„ฐ๋ฅผ ์›€์ง์ด๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ „๋ฌธ์ ์ธ 3D ์•„ํ‹ฐ์ŠคํŠธ๋Š” ๊ทธ๋ณด๋‹ค ๋” ํฐ ์„ธํŠธ์˜, ๋˜๋Š” ์„ธํŠธ ์ „๋ถ€๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ณด๋‹ค ๋” ์‹ค์ œ์ ์ธ ์บ๋ฆญํ„ฐ ๋ชจ๋ธ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Blend shape ๊ณ„์ˆ˜๋“ค์„ ์‚ฌ์šฉํ•˜์—ฌ ํŠน์ •ํ•œ ์–ผ๊ตด ํ‘œ์ •์„ ๊ธฐ๋กํ•˜๊ฑฐ๋‚˜ ์ถ”ํ›„์— ์‚ฌ์šฉํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ARFaceGeometry init(blendShapes:) ์ƒ์„ฑ์ž๋Š” ์ด ํ”„๋กœํผํ‹ฐ์˜ ๊ฐ’์— ํ•ด๋‹นํ•˜๋Š” ์ƒ์„ธํ•œ 3D ๋ฉ”์‰ฌ๋ฅผ ๋”•์…”๋„ˆ๋ฆฌ๋กœ๋ถ€ํ„ฐ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค; blend shape dictionary์˜ ์—ฐ์†๋œ ํ˜•ํƒœ๋Š” ๊ทธ ๊ณ„์ˆ˜๋“ค์ด ๋‚˜ํƒ€๋‚ด๋Š” ์–ผ๊ตด ๋ฉ”์‰ฌ๋ณด๋‹ค ์ข€ ๋” ๊ด€๋ฆฌํ•˜๊ธฐ ํŽธ๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

Note

Blend Shape ๊ณ„์ˆ˜๋“ค์˜ ์ด๋ฆ„์—์„œ ์™ผ์ชฝ๊ณผ ์˜ค๋ฅธ์ชฝ์€ ์–ผ๊ตด์— ์ƒ๋Œ€์ ์ž…๋‹ˆ๋‹ค. ์ฆ‰, eyeBlinkingRight ๊ณ„์ˆ˜๋Š” ์–ผ๊ตด์˜ ์˜ค๋ฅธ์ชฝ ๋ˆˆ์„ ๋œปํ•ฉ๋‹ˆ๋‹ค. face-tracking ์„ธ์…˜์ด ์ง„ํ–‰๋˜๋Š” ARKit ๋ทฐ๋Š” ์นด๋ฉ”๋ผ ์ด๋ฏธ์ง€๋ฅผ ๋Œ€์นญ์‹œํ‚ค๊ธฐ ๋•Œ๋ฌธ์—, ์–ผ๊ตด์˜ ์˜ค๋ฅธ์ชฝ ๋ˆˆ์ด ๋ทฐ์˜ ์˜ค๋ฅธ์ชฝ์— ๋‚˜ํƒ€๋‚˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

Topics


Using Face Geometry

  • var geometry: ARFaceGeometry
    • ์ธ์‹๋œ ์–ผ๊ตด์˜ ์œ„์ƒ์„ ๋‚˜ํƒ€๋‚ด๋Š” ๋Œ€๊ฐ•์˜ ์‚ผ๊ฐํ˜• ๋ฉ”์‰ฌ์ž…๋‹ˆ๋‹ค.
  • class ARFaceGeometry
    • Face-tracking AR ์„ธ์…˜ ๋‚ด์—์„œ ์–ผ๊ตด ์œ„์ƒ์„ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” 3D ๋ฉ”์‰ฌ์ž…๋‹ˆ๋‹ค.
  • class ARSCNFaceGeometry
    • AR ์„ธ์…˜์— ์˜ํ•ด์„œ ์ œ๊ณต๋œ ์–ผ๊ตด ์ •๋ณด์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ์–ผ๊ตด ์œ„์ƒ์˜ SceneKit ํ‘œ์ƒ์ž…๋‹ˆ๋‹ค.

Using Blend Shapes

  • var blendShapes: [ARFaceAnchor.BlendShapeLocation: NSNumber]
    • ํŠน์ •ํ•œ ์–ผ๊ตด ๋ชจ์–‘์˜ ์›€์ง์ž„์˜ ํ˜•ํƒœ๋กœ ์ธ์‹๋œ ์–ผ๊ตด ํ‘œ์ •์„ ๋‚˜ํƒ€๋‚ด๋Š” ์ง€๋ช…๋œ ๊ณ„์ˆ˜๋“ค์˜ ๋”•์…”๋„ˆ๋ฆฌ ์ž…๋‹ˆ๋‹ค.
  • struct ARFaceAnchor.BlendShapeLocatoin
    • ๊ณ„์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŠน์ • ์–ผ๊ตด ๋ชจ์–‘์˜ ์ƒ๋Œ€์ ์ธ ์›€์ง์ž„์„ ๋‚˜ํƒ€๋‚ด๊ธฐ ์œ„ํ•œ ์‹๋ณ„์ž์ž…๋‹ˆ๋‹ค.

Tracking Eye Movement

  • var leftEyeTransform: simd_float4x4
    • ์–ผ๊ตด์˜ ์™ผ์ชฝ ๋ˆˆ์˜ ์œ„์น˜์™€ ๋ฐฉํ–ฅ์„ ๋‚˜ํƒ€๋‚ด๊ธฐ ์œ„ํ•œ ๋ณ€ํ™˜ ํ–‰๋ ฌ์ž…๋‹ˆ๋‹ค.
  • var rightEyeTransform: simd_float4x4
    • ์–ผ๊ตด์˜ ์˜ค๋ฅธ์ชฝ ๋ˆˆ์˜ ์œ„์น˜์™€ ๋ฐฉํ–ฅ์„ ๋‚˜ํƒ€๋‚ด๊ธฐ ์œ„ํ•œ ๋ณ€ํ™˜ ํ–‰๋ ฌ์ž…๋‹ˆ๋‹ค.
  • var lookAtPoint: simd_float3
    • ์–ผ๊ตด์ด ๋ฐ”๋ผ๋ณด๊ณ  ์žˆ๋Š” ๋ฐฉํ–ฅ์„ ์ถ”์ •ํ•˜๊ธฐ ์œ„ํ•œ ์–ผ๊ตด ๋‚ด์˜ ๊ณต๊ฐ„์ขŒํ‘œ ๋ฒกํ„ฐ์ž…๋‹ˆ๋‹ค.