jonigata commited on
Commit
61dfb1b
1 Parent(s): 5b63955

add translate/rotate/scale

Browse files
Files changed (2) hide show
  1. app.py +1 -0
  2. static/poseEditor.js +39 -8
app.py CHANGED
@@ -53,6 +53,7 @@ with gr.Blocks() as demo:
53
  height = gr.Slider(label="Height", mininmum=512, maximum=1024, step=64, value=512, key="Height", interactive=True)
54
  startBtn = gr.Button(value="Start edit")
55
  with gr.Column(scale=2):
 
56
  html = gr.HTML(html_text)
57
  saveBtn = gr.Button(value="Save")
58
 
 
53
  height = gr.Slider(label="Height", mininmum=512, maximum=1024, step=64, value=512, key="Height", interactive=True)
54
  startBtn = gr.Button(value="Start edit")
55
  with gr.Column(scale=2):
56
+ gr.HTML("<ul><li>ctrl + drag to scale</li><li>alt + drag to translate</li><li>shift + drag to rotate(move right first, then up or down)</li></ul>")
57
  html = gr.HTML(html_text)
58
  saveBtn = gr.Button(value="Save")
59
 
static/poseEditor.js CHANGED
@@ -109,8 +109,9 @@ function getNearestCandidateIndex(x, y) {
109
  // ドラッグ中に座標を保持するための変数
110
  let isDragging = false;
111
  let dragIndex = -1;
112
- let dragOffsetX = 0;
113
- let dragOffsetY = 0;
 
114
 
115
  function getCanvasPosition(event) {
116
  const rect = canvas.getBoundingClientRect();
@@ -125,11 +126,12 @@ function handleMouseDown(event) {
125
  const index = getNearestCandidateIndex(x, y);
126
 
127
  // ドラッグ処理の開始
128
- if (0 <= index) {
129
  isDragging = true;
130
  dragIndex = index;
131
- dragOffsetX = x - candidate[index][0];
132
- dragOffsetY = y - candidate[index][1];
 
133
  }
134
  }
135
 
@@ -141,9 +143,38 @@ function handleMouseMove(event) {
141
 
142
  const [x, y] = getCanvasPosition(event);
143
 
144
- // candidateの座標を更新
145
- candidate[dragIndex][0] = x - dragOffsetX;
146
- candidate[dragIndex][1] = y - dragOffsetY;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
147
 
148
  clearCanvas();
149
  drawBodyPose(candidate, subset);
 
109
  // ドラッグ中に座標を保持するための変数
110
  let isDragging = false;
111
  let dragIndex = -1;
112
+ let dragStartX = 0;
113
+ let dragStartY = 0;
114
+ let draggingCandidate = null;
115
 
116
  function getCanvasPosition(event) {
117
  const rect = canvas.getBoundingClientRect();
 
126
  const index = getNearestCandidateIndex(x, y);
127
 
128
  // ドラッグ処理の開始
129
+ if (0 <= index || event.altKey || event.ctrlKey || event.shiftKey) {
130
  isDragging = true;
131
  dragIndex = index;
132
+ dragStartX = x;
133
+ dragStartY = y;
134
+ draggingCandidate = JSON.parse(JSON.stringify(candidate))
135
  }
136
  }
137
 
 
143
 
144
  const [x, y] = getCanvasPosition(event);
145
 
146
+ const dragOffsetX = x - dragStartX;
147
+ const dragOffsetY = y - dragStartY;
148
+
149
+
150
+ if (event.ctrlKey) {
151
+ let xScale = 1 + dragOffsetX / canvas.width;
152
+ let yScale = 1 + dragOffsetY / canvas.height;
153
+ for (let i = 0 ; i < candidate.length; i++) {
154
+ candidate[i][0] = (draggingCandidate[i][0] - dragStartX) * xScale + dragStartX;
155
+ candidate[i][1] = (draggingCandidate[i][1] - dragStartY) * yScale + dragStartY;
156
+ }
157
+ } else if (event.shiftKey) {
158
+ // rotate
159
+ let angle = Math.atan2(dragOffsetY, dragOffsetX);
160
+ for (let i = 0 ; i < candidate.length; i++) {
161
+ let x = draggingCandidate[i][0] - dragStartX;
162
+ let y = draggingCandidate[i][1] - dragStartY;
163
+ candidate[i][0] = x * Math.cos(angle) - y * Math.sin(angle) + dragStartX;
164
+ candidate[i][1] = x * Math.sin(angle) + y * Math.cos(angle) + dragStartY;
165
+ }
166
+
167
+ } else if (event.altKey) {
168
+ // 全体移動
169
+ for (let i = 0 ; i < candidate.length; i++) {
170
+ candidate[i][0] = draggingCandidate[i][0] + dragOffsetX;
171
+ candidate[i][1] = draggingCandidate[i][1] + dragOffsetY;
172
+ }
173
+ } else {
174
+ // 個別移動
175
+ candidate[dragIndex][0] = draggingCandidate[dragIndex][0] + dragOffsetX;
176
+ candidate[dragIndex][1] = draggingCandidate[dragIndex][1] + dragOffsetY;
177
+ }
178
 
179
  clearCanvas();
180
  drawBodyPose(candidate, subset);