Hands: shorter recording sessions with pose sweeps

The second real session took 16 minutes, half of it 36 still poses. Labels
come from the auto-labeller, so what matters is variety, not clean holds.
A sweep step shows a strip of pose pictures and lights one every 4 s while
the hands move slowly near and far; each cue is a prompt event with
"cue": true. The core session is now 15 steps, about 5 minutes recorded.

The pose groups, the one-hand sweeps' groups and the cue order are shuffled
per session, seeded from its id and saved in session.json. A quick round
(--quick, or the checklist's choice) is about 2 minutes for extra lighting.
Touch the dot has 6 dots, the push sections two heights.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
DeeJanuzandClaude Opus 5.5 committed 2026-10-02 21:30:50 -06:00
1 parent 3ebae6a88f
commit 97b7fc837c
8 files changed
+631 -170

No files matched your search

+66 -3
View File
@@ -469,7 +469,8 @@ Kirigami.ApplicationWindow {
text: "Press Start, then put the headset on. A panel in the headset shows each step: a picture "
+ "of the hand pose, where to hold your hands, and what to do. The sections: hand poses, "
+ "gestures, typing and the mouse, your objects, touching a dot, and moves with the "
+ "controllers on and off. Each section is recorded as one take.\n\n"
+ "controllers on and off. Each section is recorded as one take. In the pose steps your "
+ "hands keep moving while a row of pictures lights up one shape after another: follow it.\n\n"
+ "Each step waits until you're ready: press the button on the right side of the headset, "
+ "or Space or Next in this window. A 3-2-1 "
+ "countdown follows, then hold the pose until the bar runs out. Nothing is recorded while "
@@ -478,6 +479,28 @@ Kirigami.ApplicationWindow {
+ "Nothing leaves the headset. Afterwards you watch the takes in Review, delete anything "
+ "you don't want to share, and only then export."
}
ColumnLayout {
Kirigami.FormData.label: "Round:"
Controls.RadioButton {
id: fullRound
text: "Full session"
checked: !backend.hasFullSession
}
Controls.RadioButton {
id: quickRound
text: "Quick round (about 3 min): hand size, poses, the dot, no hands"
checked: backend.hasFullSession
}
}
Kirigami.InlineMessage {
Layout.maximumWidth: Kirigami.Units.gridUnit * 26
Layout.fillWidth: true
visible: backend.hasFullSession
Layout.preferredHeight: visible ? implicitHeight : 0
type: Kirigami.MessageType.Information
text: "You've recorded a full session already. A quick round in a different light (dim, "
+ "daylight) adds the most now."
}
Controls.CheckBox {
id: autoAdvance
Kirigami.FormData.label: "Pace:"
@@ -490,14 +513,15 @@ Kirigami.ApplicationWindow {
text: (autoAdvance.checked
? "Each step shows for a few seconds and the next follows by itself. Quicker if you "
+ "know the steps already. "
: "") + "Length: " + backend.planText(checklist.answers(), autoAdvance.checked) + "."
: "") + "Length: " + backend.planText(checklist.answers(), autoAdvance.checked, quickRound.checked) + "."
}
Controls.Button {
text: "Start"
icon.name: "media-record"
enabled: checklist.ready && !backend.camerasBlockStart && !backend.restartingSteamVR
onClicked: {
if (backend.startSession(checklist.answers(), lighting.currentValue, autoAdvance.checked))
if (backend.startSession(checklist.answers(), lighting.currentValue, autoAdvance.checked,
quickRound.checked))
root.show(sessionPage)
}
}
@@ -778,6 +802,45 @@ Kirigami.ApplicationWindow {
font.pointSize: Kirigami.Theme.defaultFont.pointSize * 1.4
text: sessionView.st.prompt || ""
}
// A sweep's row of pictures, the lit one framed, as on the panel
Row {
visible: (sessionView.st.strip || []).length > 0
spacing: Kirigami.Units.largeSpacing
Repeater {
model: sessionView.st.strip || []
Column {
required property var modelData
required property int index
readonly property bool lit: index === sessionView.st.cue
spacing: Kirigami.Units.smallSpacing
Rectangle {
width: Kirigami.Units.gridUnit * 5.5
height: width
radius: Kirigami.Units.smallSpacing * 2
color: Qt.rgba(Kirigami.Theme.textColor.r, Kirigami.Theme.textColor.g,
Kirigami.Theme.textColor.b, 0.06)
border.width: parent.lit ? 3 : 0
border.color: "#4cd9ff"
Image {
anchors.fill: parent
anchors.margins: 4
source: modelData.image ? "file://" + modelData.image : ""
fillMode: Image.PreserveAspectFit
mirror: modelData.mode === "mirror"
opacity: parent.parent.lit ? 1 : 0.4
smooth: true
mipmap: true
}
}
Controls.Label {
anchors.horizontalCenter: parent.horizontalCenter
text: modelData.label || ""
color: parent.lit ? "#4cd9ff" : Kirigami.Theme.textColor
opacity: parent.lit ? 1 : 0.6
}
}
}
}
// The countdown's 3, 2, 1, then the hold's word, big
Controls.Label {
visible: !!sessionView.st.big && sessionView.state !== "paused"