|
| 1 | +<!doctype html> |
| 2 | +<html lang="en"> |
| 3 | + <head> |
| 4 | + <meta charset="UTF-8" /> |
| 5 | + <meta name="viewport" content="width=device-width, initial-scale=1.0" /> |
| 6 | + <title>Seated torso twist: Posecode Movement Example | Posecode</title> |
| 7 | + <link rel="icon" type="image/png" sizes="192x192" href="/favicon-192.png" /> |
| 8 | + <link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png" /> |
| 9 | + <meta name="description" content="Seated torso twist is a beginner-level desk & posture Posecode example with 3 inspectable phases and a link to live 3D playback." /> |
| 10 | + <link rel="canonical" href="https://www.posecode.org/moves/seated-torso-twist.html" /> |
| 11 | + <meta name="theme-color" content="#0a0d12" /> |
| 12 | + <meta property="og:title" content="Seated torso twist: Posecode Movement Example | Posecode" /> |
| 13 | + <meta property="og:description" content="Seated torso twist is a beginner-level desk & posture Posecode example with 3 inspectable phases and a link to live 3D playback." /> |
| 14 | + <meta property="og:type" content="website" /> |
| 15 | + <meta property="og:url" content="https://www.posecode.org/moves/seated-torso-twist.html" /> |
| 16 | + <meta property="og:site_name" content="Posecode" /> |
| 17 | + <meta property="og:image" content="https://www.posecode.org/og.png" /> |
| 18 | + <meta name="twitter:image" content="https://www.posecode.org/og.png" /> |
| 19 | + <meta name="twitter:card" content="summary_large_image" /> |
| 20 | + <link rel="preconnect" href="https://fonts.googleapis.com" /> |
| 21 | + <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin /> |
| 22 | + <link |
| 23 | + href="https://fonts.googleapis.com/css2?family=Hanken+Grotesk:wght@400;500;600;700;800;900&family=JetBrains+Mono:wght@400;500;700&display=swap" |
| 24 | + rel="stylesheet" |
| 25 | + /> |
| 26 | + <style> |
| 27 | +:root{--bg:#0a0d12;--panel:#0f141b;--panel-2:#141a23;--border:#1e2530;--border-2:#2a323f; |
| 28 | +--text:#e9eef4;--text-2:#9aa6b4;--muted:#616d7c;--accent:#c6f24a;--accent-2:#a9e02f; |
| 29 | +--accent-ink:#0a0d12;--accent-glow:rgba(198,242,74,.45);--accent-wash:rgba(198,242,74,.1); |
| 30 | +--accent-line:rgba(198,242,74,.35);--mono:"JetBrains Mono",ui-monospace,"SF Mono",Menlo,monospace; |
| 31 | +--sans:"Hanken Grotesk",system-ui,-apple-system,"Segoe UI",sans-serif;--radius:10px;} |
| 32 | +*{box-sizing:border-box} |
| 33 | +html,body{margin:0} |
| 34 | +body{background:var(--bg);color:var(--text);font-family:var(--sans);line-height:1.6; |
| 35 | +-webkit-font-smoothing:antialiased;} |
| 36 | +a{color:var(--accent);text-decoration:none} |
| 37 | +a:hover{text-decoration:underline} |
| 38 | +.wrap{max-width:840px;margin:0 auto;padding:0 24px} |
| 39 | +header.site-nav{border-bottom:1px solid var(--border);padding:16px 0;margin-bottom:8px} |
| 40 | +header.site-nav .wrap{display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:10px} |
| 41 | +.brand{display:flex;align-items:center;gap:9px;color:var(--text);font-weight:800;font-size:18px} |
| 42 | +.brand .logo{color:var(--accent)} |
| 43 | +nav.links{display:flex;gap:18px;font-size:13.5px;font-weight:600;flex-wrap:wrap} |
| 44 | +nav.links a{color:var(--text-2)} |
| 45 | +nav.links a:hover{color:var(--text)} |
| 46 | +main{padding:36px 0 64px} |
| 47 | +.eyebrow{font-family:var(--mono);font-size:12px;font-weight:600;letter-spacing:2px; |
| 48 | +text-transform:uppercase;color:var(--accent);margin:0 0 12px} |
| 49 | +h1{font-size:clamp(28px,4.5vw,42px);font-weight:900;letter-spacing:-1px;line-height:1.1;margin:0 0 14px} |
| 50 | +h2{font-size:22px;font-weight:800;letter-spacing:-.3px;margin:36px 0 12px} |
| 51 | +h3{font-size:17px;font-weight:700;margin:24px 0 8px} |
| 52 | +h4{font-size:14px;font-weight:700;margin:18px 0 6px} |
| 53 | +p{color:var(--text-2);margin:0 0 14px} |
| 54 | +.meta-line{font-family:var(--mono);font-size:12.5px;color:var(--muted);margin:0 0 22px; |
| 55 | +letter-spacing:.2px} |
| 56 | +.meta-line b{color:var(--text-2);font-weight:600} |
| 57 | +code{font-family:var(--mono);font-size:.92em;background:var(--panel-2);border:1px solid var(--border); |
| 58 | +padding:1px 6px;border-radius:5px;color:var(--text)} |
| 59 | +pre.code-block{font-family:var(--mono);font-size:12.5px;line-height:1.55;color:var(--text-2); |
| 60 | +background:var(--panel);border:1px solid var(--border-2);border-radius:var(--radius); |
| 61 | +padding:16px 18px;overflow:auto;margin:0 0 18px} |
| 62 | +pre.code-block code{background:none;border:none;padding:0;color:inherit} |
| 63 | +.table-wrap{overflow-x:auto;margin:0 0 18px} |
| 64 | +table{border-collapse:collapse;width:100%;font-size:13.5px} |
| 65 | +th,td{text-align:left;padding:8px 12px;border-bottom:1px solid var(--border)} |
| 66 | +th{color:var(--text);font-weight:700;background:var(--panel-2)} |
| 67 | +td{color:var(--text-2)} |
| 68 | +ul,ol{color:var(--text-2);padding-left:22px;margin:0 0 16px} |
| 69 | +li{margin-bottom:6px} |
| 70 | +hr{border:none;border-top:1px solid var(--border);margin:28px 0} |
| 71 | +.card{border:1px solid var(--border);border-radius:var(--radius); |
| 72 | +background:linear-gradient(180deg,var(--panel),transparent);padding:20px 22px;margin:0 0 16px} |
| 73 | +.btn{display:inline-flex;align-items:center;gap:8px;font-weight:700;font-size:14px; |
| 74 | +color:var(--accent-ink);background:linear-gradient(180deg,var(--accent),var(--accent-2)); |
| 75 | +border-radius:8px;padding:11px 18px;text-decoration:none} |
| 76 | +.btn:hover{filter:brightness(1.06);text-decoration:none} |
| 77 | +.steps{list-style:none;padding:0;margin:0 0 22px;display:flex;flex-direction:column;gap:12px} |
| 78 | +.steps li{border:1px solid var(--border);border-radius:var(--radius);padding:16px 18px; |
| 79 | +background:var(--panel)} |
| 80 | +.steps .step-name{font-weight:700;color:var(--text);display:block;margin-bottom:4px} |
| 81 | +.steps .step-cue{color:var(--text-2);font-size:13.5px} |
| 82 | +.steps .step-dur{font-family:var(--mono);font-size:11px;color:var(--muted);margin-left:8px} |
| 83 | +.chip-list{display:flex;flex-wrap:wrap;gap:8px;margin:0 0 8px} |
| 84 | +.chip-list a{font-size:12.5px;font-weight:600;color:var(--text-2);background:var(--panel-2); |
| 85 | +border:1px solid var(--border-2);border-radius:999px;padding:5px 12px} |
| 86 | +.chip-list a:hover{color:var(--text);text-decoration:none;border-color:var(--accent-line)} |
| 87 | +.domain-group{margin-bottom:26px} |
| 88 | +.domain-group h2{margin-top:0} |
| 89 | +.move-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(220px,1fr));gap:10px} |
| 90 | +.move-card{display:block;border:1px solid var(--border);border-radius:var(--radius); |
| 91 | +padding:13px 15px;background:var(--panel)} |
| 92 | +.move-card:hover{border-color:var(--accent-line);text-decoration:none} |
| 93 | +.move-card .mc-name{display:block;font-weight:700;color:var(--text);font-size:13.5px} |
| 94 | +.move-card .mc-meta{display:block;font-size:11.5px;color:var(--muted);margin-top:2px} |
| 95 | +footer.site-footer{border-top:1px solid var(--border);padding:26px 0 40px;margin-top:20px} |
| 96 | +footer.site-footer p{font-size:12.5px;color:var(--muted);margin:0 0 6px;max-width:70ch} |
| 97 | +@media(max-width:600px){.wrap{padding:0 18px}} |
| 98 | +</style> |
| 99 | + <link rel="stylesheet" href="/content-theme.css" /> |
| 100 | + <script type="application/ld+json">{"@context":"https://schema.org","@type":"TechArticle","headline":"Seated torso twist: a Posecode movement example","description":"Seated torso twist is a beginner-level desk & posture Posecode example with 3 inspectable phases and a link to live 3D playback."}</script> |
| 101 | + <script> |
| 102 | + window.va = window.va || function () { (window.vaq = window.vaq || []).push(arguments); }; |
| 103 | + </script> |
| 104 | + <script defer src="/_vercel/insights/script.js"></script> |
| 105 | + </head> |
| 106 | + <body> |
| 107 | + <header class="site-nav"> |
| 108 | + <div class="wrap"> |
| 109 | + <a class="brand" href="/"><svg class="logo" aria-hidden="true" viewBox="0 0 100 100" width="18" height="18" fill="none"><g stroke="currentColor" stroke-width="8" stroke-linecap="round" stroke-linejoin="round"><path d="M50 34V55"/><path d="M50 35L34 26L23 15"/><path d="M50 35L66 26L77 15"/><path d="M50 54L36 72L28 88"/><path d="M50 54L64 72L72 88"/></g><circle cx="50" cy="20" r="10" fill="currentColor"/></svg> Posecode</a> |
| 110 | + <nav class="links" aria-label="Primary"> |
| 111 | + <a href="/play">Playground</a> |
| 112 | + <a href="/moves/">Movement library</a> |
| 113 | + <a href="/spec.html">Language spec</a> |
| 114 | + <a href="/llm-guide.html">LLM guide</a> |
| 115 | + <a href="mailto:hello@posecode.org?subject=Posecode%20Feedback">Feedback</a> |
| 116 | + <a href="https://github.com/posecode-dev/posecode" target="_blank" rel="noopener">GitHub</a> |
| 117 | + </nav> |
| 118 | + </div> |
| 119 | + </header> |
| 120 | + <main class="wrap"> |
| 121 | + |
| 122 | + <p class="eyebrow">Desk & posture · Core</p> |
| 123 | + <h1>Seated torso twist</h1> |
| 124 | + <p class="meta-line"><b>Target</b> Obliques · <b>Equipment</b> Chair |
| 125 | + · <b>Level</b> Beginner · <b>Reps</b> 3</p> |
| 126 | + <p>Seated torso twist is a beginner-level desk & posture movement targeting the |
| 127 | + obliques, written in <a href="/">Posecode</a>, a small open-source language |
| 128 | + that capable language models can use to describe human movement as text. |
| 129 | + Authored joint targets and reach-IK solves are constrained to Posecode's configured |
| 130 | + per-axis bounds. Those bounds constrain the visualization, but they do not certify |
| 131 | + that a complete movement is safe or clinically correct. |
| 132 | + This page documents a code example; it is not exercise instruction.</p> |
| 133 | + |
| 134 | + <a class="btn" href="/play/seated-torso-twist">▶ Open Seated torso twist in the playground →</a> |
| 135 | + |
| 136 | + <h2>Movement phases</h2> |
| 137 | + <p>Phase cues are display-only coaching text. The executable joint and |
| 138 | + contact directives in the source below determine the animation.</p> |
| 139 | + <ol class="steps"> |
| 140 | +<li> |
| 141 | + <span class="step-name">Twist right<span class="step-dur">2.6s · flow</span></span> |
| 142 | + <span class="step-cue">Sit tall, then rotate the ribs and gaze to the right</span> |
| 143 | + </li> |
| 144 | +<li> |
| 145 | + <span class="step-name">Twist left<span class="step-dur">3s · flow</span></span> |
| 146 | + <span class="step-cue">Pass through center and rotate to the left</span> |
| 147 | + </li> |
| 148 | +<li> |
| 149 | + <span class="step-name">Center<span class="step-dur">1.8s · settle</span></span> |
| 150 | + <span class="step-cue">Unwind back to a tall, neutral seat</span> |
| 151 | + </li> |
| 152 | + </ol> |
| 153 | + |
| 154 | + <h2>The .posecode source</h2> |
| 155 | + <p>This is the exact text used by the linked playground animation: phases and joint |
| 156 | + angles, not 3D transforms.</p> |
| 157 | + <pre class="code-block"><code>posecode stretch "Seated torso twist" |
| 158 | + rig humanoid |
| 159 | + pose start = seated |
| 160 | + |
| 161 | + step "Twist right" 2.6s flow: |
| 162 | + spine: twist-right 35 |
| 163 | + chest: twist-right 30 |
| 164 | + neck: twist-right 40 |
| 165 | + shoulders: abduct 30 |
| 166 | + elbows: flex 45 |
| 167 | + cue "Sit tall, then rotate the ribs and gaze to the right" |
| 168 | + |
| 169 | + step "Twist left" 3s flow: |
| 170 | + spine: twist-left 35 |
| 171 | + chest: twist-left 30 |
| 172 | + neck: twist-left 40 |
| 173 | + shoulders: abduct 30 |
| 174 | + elbows: flex 45 |
| 175 | + cue "Pass through center and rotate to the left" |
| 176 | + |
| 177 | + step "Center" 1.8s settle: |
| 178 | + spine: twist-left 0 |
| 179 | + chest: twist-left 0 |
| 180 | + neck: twist-left 0 |
| 181 | + shoulders: abduct 0 |
| 182 | + elbows: flex 0 |
| 183 | + cue "Unwind back to a tall, neutral seat" |
| 184 | + |
| 185 | + repeat 3 |
| 186 | +</code></pre> |
| 187 | + |
| 188 | + <h2>More desk & posture movements</h2> |
| 189 | + <div class="chip-list"><a href="/moves/chest-opener.html">Chest opener</a><a href="/moves/posture.html">Desk posture reset</a><a href="/moves/twist.html">Standing spinal twist</a><a href="/moves/neck-side-stretch.html">Neck side stretch</a><a href="/moves/shoulder-blade-retraction.html">Shoulder blade retractions</a><a href="/moves/wrist-forearm-rolls.html">Wrist & forearm rolls</a></div> |
| 190 | + </main> |
| 191 | + <footer class="site-footer"> |
| 192 | + <div class="wrap"> |
| 193 | + <p>Range-of-motion values are general literature data, not medical advice. Consult a |
| 194 | + qualified professional for physiotherapy or exercise prescription.</p> |
| 195 | + <p> |
| 196 | + <a href="/">Posecode</a>, open source under Apache-2.0 and AGPL-3.0 · |
| 197 | + <a href="https://github.com/posecode-dev/posecode/blob/main/docs/legal/LICENSING.md" target="_blank" rel="noopener">Licensing</a> · |
| 198 | + <a href="mailto:hello@posecode.org?subject=Posecode%20Feedback">Feedback</a> · |
| 199 | + <a href="https://github.com/posecode-dev/posecode/issues" target="_blank" rel="noopener">GitHub Issues</a> |
| 200 | + </p> |
| 201 | + </div> |
| 202 | + </footer> |
| 203 | + </body> |
| 204 | +</html> |
0 commit comments