이 글은 Today I Learn 시리즈의 148번째 기록입니다. (총 213개)

파티클의 “폭”과 “높이” 슬라이더를 만들어 실제로 돌려 보며 나온 것들.

효과를 무엇으로 표현할 것인가

무엇을 흔드느냐가 형태를 정한다

“넓게 퍼지게”를 처음엔 좌우로 왔다 갔다 흔드는 움직임으로 냈다. 폭이 작을 땐 멀쩡했는데 크게 하니 파티클이 올라가면서 빙빙 도는 나선이 됐다. 좌우로 오가는 사인 운동에 위로 올라가는 등속 운동이 겹치면 궤적이 나선(헬릭스)이 되기 때문이다.

폭이 작을 땐 안 보이다가 크게 해야 드러난다는 게 함정이다. 슬라이더를 만들면 반드시 양 끝까지 밀어 보고 확인해야 한다. 기본값 근처에서만 보면 멀쩡해 보인다.

가져갈 건 이것이다 — 원하는 인상(“넓게”)을 어떤 움직임으로 표현할지 고르는 순간, 그 움직임이 다른 움직임과 겹쳐서 만들 형태까지 같이 고른 것이다. 넓게 퍼지는 인상은 흔드는 대신 시작 위치를 넓게 흩뿌리는 쪽이 맞았다. 흩뿌림은 다른 움직임과 겹쳐도 새 형태를 안 만든다.

같은 슬라이더가 대상마다 다르게 먹는다

폭을 “시작 위치 흩뿌림”으로만 냈더니, 사방으로 터지는 모션에서는 폭을 최대로 해도 좁게 갇혔다. 그 모션은 원래 자기 힘으로 크게 퍼지는데, 시작 위치를 조금 흩뿌린 것쯤은 거기 묻혀 안 보였다.

그래서 폭이 퍼지는 힘에도 곱해지게 했더니 이번엔 그 모션만 조금 올려도 과하게 퍼졌다. 원래 큰 값에 배율을 곱하니 증폭된 것이다. 반대로 잔잔한 모션은 곱해도 티가 안 났다.

하나의 슬라이더가 성격이 다른 여러 대상에 걸릴 때, “무엇을 곱할지”로 정의하면 대상마다 결과가 제각각이 된다. 정의는 결과 쪽에서 해야 한다 — “이 값이면 이만큼 퍼져 보인다”를 먼저 정하고, 대상마다 거기 닿는 계산을 따로 준다. 계산이 통일돼야 하는 게 아니라 보이는 결과가 통일돼야 한다.


슬라이더가 지켜야 할 약속

최대값은 실제로 닿을 수 있어야 한다

높이 슬라이더를 끝까지 올렸는데 파티클이 화면 위까지 안 올라갔다. 항력(속도에 비례해 감속시키는 저항)을 받으며 올라가는 것은 아무리 오래 살아도 어느 높이에서 멈춘다 — 속도가 줄다가 사실상 서 버려서, 수명을 늘려도 더는 안 올라간다. 시스템에 상한이 내장돼 있었던 것이다.

사용자는 슬라이더를 끝까지 올렸는데 반응이 없으면 고장으로 읽는다. 실제 상한이 슬라이더 최대보다 낮으면, 슬라이더 범위를 줄이든 상한을 걷어내든 둘을 맞춰야 한다. 여기서는 올라가는 구간의 항력을 없애 등속으로 올리는 쪽을 택했다.

슬라이더의 양 끝은 사용자에게 하는 약속이다. “여기까지 된다”고 그려 놓고 안 되면 그건 눈금이 거짓말을 한 것이다.

어디까지와 얼마나 빨리를 분리한다

높이와 속도가 엉켜 있었다. 속도를 올리면 더 높이 올라가서, 원하는 높이를 맞추려면 속도를 포기해야 했다.

앞선 TIL 15에서 나선 모션에 쓴 방식을 모든 모션으로 넓혀, 목표 높이에 닿는 순간을 수명으로 삼았다. 속도를 바꿔도 도달 높이는 그대로다.

“어디까지”와 “얼마나 빨리”는 사용자가 머릿속에서 이미 나눠서 생각하는 두 가지다. 코드에서 엉켜 있으면 사용자가 그 엉킴을 대신 풀어야 한다.


통일한다는 것

한 이름의 컨트롤을 대상마다 다르게 해석해도 된다

결국 “높이” 하나를 모션마다 다르게 적용했다. 위로 솟는 모션은 그 높이에 닿으면 사라지고, 분수는 포물선 꼭대기가 그 높이를 넘지 않게 눌러 담고, 사방으로 터지거나 떠도는 모션은 높이 개념이 잘 안 맞아 원래 수명을 유지한다.

통일이라고 하면 같은 계산을 쓰는 걸로 생각하기 쉬운데, 사용자가 느끼는 통일은 “높이를 올리면 다 위로 커진다”는 것이다. 성격이 다른 대상에 같은 계산을 억지로 씌우면 오히려 어떤 모션은 이상해진다. 이름과 방향만 같으면 속은 갈라도 된다.


요약

  • 인상을 어떤 움직임으로 표현할지 고르면 그 움직임이 만들 형태까지 같이 고른 것이다
  • 슬라이더는 양 끝까지 밀어 봐야 한다 — 기본값 근처에서는 문제가 안 보인다
  • 하나의 슬라이더가 여러 대상에 걸리면 계산이 아니라 보이는 결과를 통일한다
  • 슬라이더의 최대값은 실제로 닿을 수 있어야 한다. 못 닿으면 눈금이 거짓말이다
  • “어디까지”와 “얼마나 빨리”는 사용자가 이미 나눠 생각한다 — 코드에서도 나눠 둔다
  • 통일은 같은 계산이 아니라 같은 방향이다. 속은 대상마다 갈라도 된다

Series: Today I Learn

1 C++ 자료형(Data Type) 2 MD5 vs pHash 3 C++에서 함수의 선언과 정의 4 Tkinter padx, pady 5 메모리와 포인터 변수 6 Call by Value, Call by Reference, Call by Pointer 비교 7 const 8 Gemfile — Jekyll 프로젝트의 의존성 파일 9 kramdown-parser-gfm — Jekyll의 GFM 파서 10 파서(Parser) 11 AHU vs OHU 12 I might try it vs I'll try it 뉘앙스 차이 13 SESSION_EXPIRE_AT_BROWSER_CLOSE=True 14 configuration key 15 Git stash vs discard 16 subprocess.Popen으로 Windows 탐색기에 명령어를 전달 17 Post 잔디 분석하기 18 Google Sheets Sync 최적화 19 DSL (Domain Specific Language)과 GPL (General Purpose Language) 20 마크다운 표 그리는 방법 21 쿼리 파라미터(Query Parameter). 기존 QR코드 재활용 22 Django 보안 취약점 점검 및 수정 23 OOP Object-Oriented Programming 객체 지향 프로그래밍 24 Fernet 대칭 암호화 25 Jekyll 코드블록 안의 Liquid 태그 26 습관만들기 Pawbit TIL 1 27 insertOnConflictUpdate vs DoUpdate(target) 28 세션 필터 29 아코디언(Accordiaon) UI를 펼친상태로 만들기 30 input의 step 31 습관만들기 Pawbit TIL 2 32 습관만들기 Pawbit TIL 3 33 Word Cloud 34 Google Sheets를 데이터 버스로(with AppSheet) 35 Django 모델 텍스트 필드 자동 수집 패턴 36 localStorage로 섹션 토글 상태 유지 37 순차 ID 생성(`select_for_update()` + `max()` 조합) 38 역참조 검색과 distinct() 39 xlsx 다운로드와 로딩 오버레이 충돌 40 Android 파일 공유 MIME 타입 41 AssetManifest — Flutter 빌드 타임 asset 목록 런타임 조회 42 크레센도 Phaser + TypeScript TIL 1 43 크레센도 Phaser + TypeScript TIL 2 44 크레센도 Phaser + TypeScript TIL 3 45 크레센도 Phaser + TypeScript TIL 4 46 크레센도 Phaser + TypeScript TIL 5 47 여둘까 Office Layout TIL 1 48 습관만들기 Pawbit TIL 4 49 여둘까 Office Layout TIL 2 50 여둘까 Office Layout TIL 3 51 크레센도 Phaser + TypeScript TIL 6 52 UTF-8 BOM과 PowerShell 파일 쓰기 53 소리꽃 KeyBloom TIL 1 54 습관만들기 Pawbit TIL 5 55 여둘까 Office Layout TIL 4 56 소리꽃 KeyBloom TIL 2 57 소리꽃 KeyBloom TIL 3 58 메트로놈 Simple Metronome TIL 1 59 소리꽃 KeyBloom TIL 4 60 메트로놈 Simple Metronome TIL 2 61 소리꽃 KeyBloom TIL 5 62 습관만들기 Pawbit TIL 6 63 크레센도 Phaser + TypeScript TIL 7 64 메트로놈 Simple Metronome TIL 3 65 소설 타임라인 관리 도구 Lumior TIL 1 66 습관만들기 Pawbit TIL 7 67 정적 블로그 SEO 정비와 Pagefind 검색 도입 68 크레센도 Phaser + TypeScript TIL 8 69 메트로놈 Simple Metronome TIL 4 70 습관만들기 Pawbit TIL 8 71 안드로이드 AudioTrack 연속 재생, 실측 피커 정렬, 카메라 토치 플래시 72 메트로놈 Simple Metronome TIL 5 73 모래게임 Sandrop TIL 1 74 습관만들기 Pawbit TIL 9 75 메트로놈 Simple Metronome TIL 6 76 모래게임 Sandrop TIL 2 77 모래게임 Sandrop TIL 3 78 습관만들기 Pawbit TIL 10 79 습관만들기 Pawbit TIL 11 80 메트로놈 Simple Metronome TIL 7 81 모래게임 Sandrop TIL 5 82 모래게임 Sandrop TIL 4 83 습관만들기 Pawbit TIL 12 84 모래게임 Sandrop TIL 6 85 소리꽃 KeyBloom TIL 6 86 모래게임 Sandrop TIL 7 87 모래게임 Sandrop TIL 8 88 소리꽃 KeyBloom TIL 7 89 모래게임 Sandrop TIL 9 90 소리꽃 KeyBloom TIL 8 91 모래게임 Sandrop TIL 10 92 소리꽃 KeyBloom TIL 9 93 콘티온 ContiOn TIL 1 94 소리꽃 KeyBloom TIL 10 95 콘티온 ContiOn TIL 2 96 습관만들기 Pawbit TIL 13 97 콘티온 ContiOn TIL 3 98 모래게임 Sandrop TIL 11 99 소리꽃 KeyBloom TIL 11 100 여둘까 Office Layout TIL 5 101 모래게임 Sandrop TIL 12 102 모래게임 Sandrop TIL 13 103 콘티온 ContiOn TIL 4 104 모래게임 Sandrop TIL 14 105 소리꽃 KeyBloom TIL 12 106 습관만들기 Pawbit TIL 14 107 모래게임 Sandrop TIL 15 108 모래게임 Sandrop TIL 16 109 소리꽃 KeyBloom TIL 13 110 온실 GreenHouse TIL 1 111 콘티온 ContiOn TIL 5 112 모래게임 Sandrop TIL 17 113 소리꽃 KeyBloom TIL 14 114 온실 GreenHouse TIL 2 115 콘티온 ContiOn TIL 6 116 모래게임 Sandrop TIL 18 117 콘티온 ContiOn TIL 7 118 모래게임 Sandrop TIL 19 119 소리꽃 KeyBloom TIL 15 120 모래게임 Sandrop TIL 20 121 모래게임 Sandrop TIL 21 122 소리꽃 KeyBloom TIL 16 123 소리꽃 KeyBloom TIL 17 124 소리꽃 KeyBloom TIL 18 125 여둘까 Office Layout TIL 6 126 소리꽃 KeyBloom TIL 19 127 소리꽃 KeyBloom TIL 20 128 콘티온 ContiOn TIL 8 129 콘티온 ContiOn TIL 9 130 로그스톤 상표 셀프 출원 TIL 1 131 소리꽃 KeyBloom TIL 21 132 로그스톤 샵 LogStone Shop TIL 1 133 소리꽃 KeyBloom TIL 22 134 로그스톤 샵 LogStone Shop TIL 2 135 소리꽃 KeyBloom TIL 23 136 모래게임 Sandrop TIL 22 137 모래게임 Sandrop TIL 23 138 소리꽃 KeyBloom TIL 24 139 로그스톤 샵 LogStone Shop TIL 3 140 모래게임 Sandrop TIL 24 141 소리꽃 KeyBloom TIL 25 142 모래게임 Sandrop TIL 25 143 MiniMacro TIL 1 144 모래게임 Sandrop TIL 26 145 콘티온 ContiOn TIL 10 146 Astro가 무엇인지, 왜 옮기는지 147 모래게임 Sandrop TIL 27 148 소리꽃 KeyBloom TIL 26 읽는 중 149 MiniMacro TIL 2 150 로그스톤 샵 LogStone Shop TIL 4 151 메트로놈 Simple Metronome TIL 8 152 모래게임 Sandrop TIL 28 153 여둘까 Office Layout TIL 7 154 메트로놈 Simple Metronome TIL 9 155 블로그 Astro 이관 TIL 156 여둘까 Office Layout TIL 8 157 로그스톤 샵 LogStone Shop TIL 5 158 모래게임 Sandrop TIL 29 159 오픈데이 Openday TIL 1 160 로그스톤 샵 LogStone Shop TIL 6 161 모래게임 Sandrop TIL 30 162 오픈데이 Openday TIL 2 163 모래게임 Sandrop TIL 31 164 Unreal Engine MCP TIL 1 165 모래게임 Sandrop TIL 32 166 소리꽃 KeyBloom TIL 27 167 콘티온 ContiOn TIL 11 168 오픈데이 Openday TIL 3 169 로그스톤 샵 LogStone Shop TIL 7 170 모래게임 Sandrop TIL 33 171 소리꽃 KeyBloom TIL 28 172 오픈데이 Openday TIL 4 173 여둘까 Office Layout TIL 9 174 오픈데이 Openday TIL 5 175 ScorePlayer TIL 1 176 모래게임 Sandrop TIL 34 177 BuildingHub TIL 1 178 ScorePlayer TIL 2 179 여둘까 Office Layout TIL 10 180 BuildingHub TIL 2 181 ScorePlayer TIL 3 182 Unreal Engine MCP TIL 2 183 궁 미로 PalaceMaze TIL 1 184 메트로놈 Simple Metronome TIL 10 185 메트로놈 Simple Metronome TIL 11 186 오픈데이 Openday TIL 6 187 BuildingHub TIL 3 188 Obsidian vault에서 코드만 빼기 — directory junction 189 ScorePlayer TIL 4 190 여둘까 Office Layout TIL 11 191 오픈데이 Openday TIL 7 192 URL은 바뀔 수 있는 것에 묶지 않는다 193 도구는 기능이 아니라 내 일에 맞는지로 고른다 194 돌이키기 힘든 변경은 작게 먼저 확인한다 195 궁 미로 PalaceMaze TIL 2 196 궁 미로 PalaceMaze TIL 3 197 소리꽃 KeyBloom TIL 29 198 오픈데이 Openday TIL 8 199 BuildingHub TIL 4 200 ScorePlayer TIL 5 201 로그스톤 샵 LogStone Shop TIL 8 202 여둘까 Office Layout TIL 12 203 오픈데이 Openday TIL 9 204 BuildingHub TIL 5 205 MiniMacro TIL 3 206 소리꽃 KeyBloom TIL 30 207 오픈데이 Openday TIL 10 208 여둘까 Office Layout TIL 13 209 소리꽃 KeyBloom TIL 31 210 궁 미로 PalaceMaze TIL 4 211 로그스톤 샵 LogStone Shop TIL 9 212 로그스톤 샵 LogStone Shop TIL 10 213 소리꽃 KeyBloom TIL 32