summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--filter-nm/ftnoir_filter_nm.cpp43
-rw-r--r--filter-nm/ftnoir_filter_nm.h32
-rw-r--r--filter-nm/ftnoir_filter_nm_dialog.cpp48
-rw-r--r--filter-nm/ftnoir_nm_filtercontrols.ui400
-rw-r--r--filter-nm/lang/nl_NL.ts36
-rw-r--r--filter-nm/lang/ru_RU.ts36
-rw-r--r--filter-nm/lang/stub.ts36
-rw-r--r--filter-nm/lang/zh_CN.ts36
8 files changed, 136 insertions, 531 deletions
diff --git a/filter-nm/ftnoir_filter_nm.cpp b/filter-nm/ftnoir_filter_nm.cpp
index cd395f1b..5d274790 100644
--- a/filter-nm/ftnoir_filter_nm.cpp
+++ b/filter-nm/ftnoir_filter_nm.cpp
@@ -19,32 +19,47 @@ filter_nm::filter_nm()
void filter_nm::filter(const double* input, double* output)
{
+ tVector position = { input[TX], input[TY], input[TZ] };
+ tQuat rotation = QuatFromYPR(input + Yaw);
+
// order of axes: x, y, z, yaw, pitch, roll
if (unlikely(first_run))
{
first_run = false;
t.start();
- std::fill(speeds, speeds + 6, 0.0);
- std::copy(input, input + 6, filtered_output);
+ last_pos_speed = tVector();
+ last_rot_speed = tQuat();
+ last_pos_out = position;
+ last_rot_out = rotation;
}
else
{
const double dt = t.elapsed_seconds();
t.start();
- for (int i = 0; i < 6; i++)
- {
- double speed = (input[i] - last_input[i]) / dt;
- double timescale = 1. / *(s.responsiveness[i]);
- double alpha = dt / (dt + timescale);
- speeds[i] += alpha * (speed - speeds[i]); // EWA
- filtered_output[i] += alpha * min(1.0, abs(speeds[i]) / *(s.drift_speeds[i])) * (input[i] - filtered_output[i]);
- }
- }
-
- std::copy(input, input + 6, last_input);
- std::copy(filtered_output, filtered_output + 6, output);
+ const tVector pos_speed = (position - last_pos_in) / dt;
+ const double pos_tau = 1. / *s.pos_responsiveness;
+ double alpha = dt / (dt + pos_tau);
+ last_pos_speed += (pos_speed - last_pos_speed) * alpha;
+ alpha *= min(1.0, VectorLength(last_pos_speed) / *s.pos_drift_speed);
+ last_pos_out += (position - last_pos_out) * alpha;
+
+ const tQuat rot_delta = QuatDivide(rotation, last_rot_in);
+ const double ms_per_s = 1000.0; // angular speed quaternions need to be small to work so use °/ms
+ const tQuat rot_speed = Slerp(tQuat(), rot_delta, 1.0 / dt / ms_per_s);
+ const double rot_tau = 1. / *s.rot_responsiveness;
+ alpha = dt / (dt + rot_tau);
+ last_rot_speed = Slerp(last_rot_speed, rot_speed, alpha);
+ const double angular_speed = AngleBetween(tQuat(), last_rot_speed) * ms_per_s;
+ alpha *= min(1.0, angular_speed / *s.rot_drift_speed);
+ last_rot_out = Slerp(last_rot_out, rotation, alpha);
+ }
+
+ last_pos_in = position;
+ last_rot_in = rotation;
+ std::copy(last_pos_out.v, last_pos_out.v + 3, output + TX);
+ QuatToYPR(last_rot_out, &output[Yaw]);
}
OPENTRACK_DECLARE_FILTER(filter_nm, dialog_nm, nmDll)
diff --git a/filter-nm/ftnoir_filter_nm.h b/filter-nm/ftnoir_filter_nm.h
index d2eae43d..7bf012a6 100644
--- a/filter-nm/ftnoir_filter_nm.h
+++ b/filter-nm/ftnoir_filter_nm.h
@@ -10,29 +10,24 @@
#include "api/plugin-api.hpp"
#include "compat/timer.hpp"
+#include "compat/hamilton-tools.h"
#include "options/options.hpp"
using namespace options;
struct settings_nm : opts
{
- value<slider_value> responsiveness[6];
- value<slider_value> drift_speeds[6];
+ value<slider_value> pos_responsiveness;
+ value<slider_value> rot_responsiveness;
+ value<slider_value> pos_drift_speed;
+ value<slider_value> rot_drift_speed;
settings_nm() :
opts("nm-filter"),
- responsiveness{ value<slider_value>(b, "x-responsiveness", { 10.0, .0, 20.0 }),
- value<slider_value>(b, "y-responsiveness", { 10.0, .0, 20.0 }),
- value<slider_value>(b, "z-responsiveness", { 10.0, .0, 20.0 }),
- value<slider_value>(b, "yaw-responsiveness", { 10.0, .0, 20.0 }),
- value<slider_value>(b, "pitch-responsiveness", { 10.0, .0, 20.0 }),
- value<slider_value>(b, "roll-responsiveness", { 10.0, .0, 20.0 }) },
- drift_speeds{ value<slider_value>(b, "x-drift-speed", { 50.0, 1.0, 200.0 }),
- value<slider_value>(b, "y-drift-speed", { 50.0, 1.0, 200.0 }),
- value<slider_value>(b, "z-drift-speed", { 50.0, 1.0, 200.0 }),
- value<slider_value>(b, "yaw-drift-speed", { 100.0, 1.0, 400.0 }),
- value<slider_value>(b, "pitch-drift-speed", { 100.0, 1.0, 400.0 }),
- value<slider_value>(b, "roll-drift-speed", { 100.0, 1.0, 400.0 }) }
+ pos_responsiveness(value<slider_value>(b, "pos-responsiveness", { 15.0, .0, 20.0 })),
+ rot_responsiveness(value<slider_value>(b, "rot-responsiveness", { 18.0, .0, 20.0 })),
+ pos_drift_speed(value<slider_value>(b, "pos-drift-speed", { 30.0, 1.0, 200.0 })),
+ rot_drift_speed(value<slider_value>(b, "rot-drift-speed", { 45.0, 1.0, 400.0 }))
{
}
};
@@ -45,9 +40,12 @@ struct filter_nm : IFilter
module_status initialize() override { return status_ok(); }
private:
- double last_input[6]{};
- double speeds[6]{};
- double filtered_output[6]{};
+ tVector last_pos_in;
+ tQuat last_rot_in;
+ tVector last_pos_out;
+ tQuat last_rot_out;
+ tVector last_pos_speed;
+ tQuat last_rot_speed;
Timer t;
settings_nm s;
bool first_run = true;
diff --git a/filter-nm/ftnoir_filter_nm_dialog.cpp b/filter-nm/ftnoir_filter_nm_dialog.cpp
index ccf894db..f3626cae 100644
--- a/filter-nm/ftnoir_filter_nm_dialog.cpp
+++ b/filter-nm/ftnoir_filter_nm_dialog.cpp
@@ -12,52 +12,20 @@ dialog_nm::dialog_nm()
{
ui.setupUi(this);
- tie_setting(s.responsiveness[0], ui.x_responsiveness_slider);
- tie_setting(s.responsiveness[0], ui.x_responsiveness, [](double x)
+ tie_setting(s.pos_responsiveness, ui.pos_responsiveness_slider);
+ tie_setting(s.pos_responsiveness, ui.pos_responsiveness, [](double x)
{ return QStringLiteral("%1").arg(x, 0, 'f', 2); });
- tie_setting(s.responsiveness[1], ui.y_responsiveness_slider);
- tie_setting(s.responsiveness[1], ui.y_responsiveness, [](double x)
+ tie_setting(s.rot_responsiveness, ui.rot_responsiveness_slider);
+ tie_setting(s.rot_responsiveness, ui.rot_responsiveness, [](double x)
{ return QStringLiteral("%1").arg(x, 0, 'f', 2); });
- tie_setting(s.responsiveness[2], ui.z_responsiveness_slider);
- tie_setting(s.responsiveness[2], ui.z_responsiveness, [](double x)
+ tie_setting(s.pos_drift_speed, ui.pos_drift_speed_slider);
+ tie_setting(s.pos_drift_speed, ui.pos_drift_speed, [](double x)
{ return QStringLiteral("%1").arg(x, 0, 'f', 2); });
- tie_setting(s.responsiveness[3], ui.yaw_responsiveness_slider);
- tie_setting(s.responsiveness[3], ui.yaw_responsiveness, [](double x)
- { return QStringLiteral("%1").arg(x, 0, 'f', 2); });
-
- tie_setting(s.responsiveness[4], ui.pitch_responsiveness_slider);
- tie_setting(s.responsiveness[4], ui.pitch_responsiveness, [](double x)
- { return QStringLiteral("%1").arg(x, 0, 'f', 2); });
-
- tie_setting(s.responsiveness[5], ui.roll_responsiveness_slider);
- tie_setting(s.responsiveness[5], ui.roll_responsiveness, [](double x)
- { return QStringLiteral("%1").arg(x, 0, 'f', 2); });
-
- tie_setting(s.drift_speeds[0], ui.x_drift_speed_slider);
- tie_setting(s.drift_speeds[0], ui.x_drift_speed, [](double x)
- { return QStringLiteral("%1").arg(x, 0, 'f', 2); });
-
- tie_setting(s.drift_speeds[1], ui.y_drift_speed_slider);
- tie_setting(s.drift_speeds[1], ui.y_drift_speed, [](double x)
- { return QStringLiteral("%1").arg(x, 0, 'f', 2); });
-
- tie_setting(s.drift_speeds[2], ui.z_drift_speed_slider);
- tie_setting(s.drift_speeds[2], ui.z_drift_speed, [](double x)
- { return QStringLiteral("%1").arg(x, 0, 'f', 2); });
-
- tie_setting(s.drift_speeds[3], ui.yaw_drift_speed_slider);
- tie_setting(s.drift_speeds[3], ui.yaw_drift_speed, [](double x)
- { return QStringLiteral("%1").arg(x, 0, 'f', 2); });
-
- tie_setting(s.drift_speeds[4], ui.pitch_drift_speed_slider);
- tie_setting(s.drift_speeds[4], ui.pitch_drift_speed, [](double x)
- { return QStringLiteral("%1").arg(x, 0, 'f', 2); });
-
- tie_setting(s.drift_speeds[5], ui.roll_drift_speed_slider);
- tie_setting(s.drift_speeds[5], ui.roll_drift_speed, [](double x)
+ tie_setting(s.rot_drift_speed, ui.rot_drift_speed_slider);
+ tie_setting(s.rot_drift_speed, ui.rot_drift_speed, [](double x)
{ return QStringLiteral("%1").arg(x, 0, 'f', 2); });
}
diff --git a/filter-nm/ftnoir_nm_filtercontrols.ui b/filter-nm/ftnoir_nm_filtercontrols.ui
index 93f3cb91..ad307daf 100644
--- a/filter-nm/ftnoir_nm_filtercontrols.ui
+++ b/filter-nm/ftnoir_nm_filtercontrols.ui
@@ -20,15 +20,15 @@
<string>Responsiveness</string>
</property>
<layout class="QGridLayout" name="gridLayout">
- <item row="0" column="0">
- <widget class="QLabel" name="label">
+ <item row="1" column="0">
+ <widget class="QLabel" name="label_7">
<property name="text">
- <string>X</string>
+ <string>Rotation</string>
</property>
</widget>
</item>
<item row="0" column="1">
- <widget class="QLabel" name="x_responsiveness">
+ <widget class="QLabel" name="pos_responsiveness">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Preferred">
<horstretch>0</horstretch>
@@ -49,31 +49,8 @@
</property>
</widget>
</item>
- <item row="0" column="2">
- <widget class="QSlider" name="x_responsiveness_slider">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Expanding" vsizetype="Maximum">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="maximum">
- <number>40</number>
- </property>
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- </widget>
- </item>
- <item row="1" column="0">
- <widget class="QLabel" name="label_3">
- <property name="text">
- <string>Y</string>
- </property>
- </widget>
- </item>
<item row="1" column="1">
- <widget class="QLabel" name="y_responsiveness">
+ <widget class="QLabel" name="rot_responsiveness">
<property name="minimumSize">
<size>
<width>30</width>
@@ -89,7 +66,7 @@
</widget>
</item>
<item row="1" column="2">
- <widget class="QSlider" name="y_responsiveness_slider">
+ <widget class="QSlider" name="rot_responsiveness_slider">
<property name="maximum">
<number>40</number>
</property>
@@ -98,97 +75,14 @@
</property>
</widget>
</item>
- <item row="2" column="0">
- <widget class="QLabel" name="label_5">
- <property name="text">
- <string>Z</string>
- </property>
- </widget>
- </item>
- <item row="2" column="1">
- <widget class="QLabel" name="z_responsiveness">
- <property name="minimumSize">
- <size>
- <width>30</width>
- <height>0</height>
- </size>
- </property>
- <property name="text">
- <string>10.0</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
- </property>
- </widget>
- </item>
- <item row="2" column="2">
- <widget class="QSlider" name="z_responsiveness_slider">
- <property name="maximum">
- <number>40</number>
- </property>
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- </widget>
- </item>
- <item row="3" column="0">
- <widget class="QLabel" name="label_7">
- <property name="text">
- <string>Yaw</string>
- </property>
- </widget>
- </item>
- <item row="3" column="1">
- <widget class="QLabel" name="yaw_responsiveness">
- <property name="minimumSize">
- <size>
- <width>30</width>
- <height>0</height>
- </size>
- </property>
- <property name="text">
- <string>10.0</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
- </property>
- </widget>
- </item>
- <item row="3" column="2">
- <widget class="QSlider" name="yaw_responsiveness_slider">
- <property name="maximum">
- <number>40</number>
- </property>
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- </widget>
- </item>
- <item row="4" column="0">
- <widget class="QLabel" name="label_9">
- <property name="text">
- <string>Pitch</string>
- </property>
- </widget>
- </item>
- <item row="4" column="1">
- <widget class="QLabel" name="pitch_responsiveness">
- <property name="minimumSize">
- <size>
- <width>30</width>
- <height>0</height>
- </size>
- </property>
- <property name="text">
- <string>10.0</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+ <item row="0" column="2">
+ <widget class="QSlider" name="pos_responsiveness_slider">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="Maximum">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
</property>
- </widget>
- </item>
- <item row="4" column="2">
- <widget class="QSlider" name="pitch_responsiveness_slider">
<property name="maximum">
<number>40</number>
</property>
@@ -197,36 +91,10 @@
</property>
</widget>
</item>
- <item row="5" column="0">
- <widget class="QLabel" name="label_11">
- <property name="text">
- <string>Roll</string>
- </property>
- </widget>
- </item>
- <item row="5" column="1">
- <widget class="QLabel" name="roll_responsiveness">
- <property name="minimumSize">
- <size>
- <width>30</width>
- <height>0</height>
- </size>
- </property>
+ <item row="0" column="0">
+ <widget class="QLabel" name="label">
<property name="text">
- <string>10.0</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
- </property>
- </widget>
- </item>
- <item row="5" column="2">
- <widget class="QSlider" name="roll_responsiveness_slider">
- <property name="maximum">
- <number>40</number>
- </property>
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
+ <string>Position</string>
</property>
</widget>
</item>
@@ -261,85 +129,28 @@
<string>Drift speeds</string>
</property>
<layout class="QGridLayout" name="gridLayout_3">
- <item row="4" column="0">
- <widget class="QLabel" name="label_6">
- <property name="text">
- <string>Z</string>
- </property>
- </widget>
- </item>
- <item row="2" column="3">
- <widget class="QSlider" name="y_drift_speed_slider">
- <property name="minimum">
- <number>1</number>
- </property>
- <property name="maximum">
- <number>200</number>
- </property>
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- </widget>
- </item>
- <item row="11" column="0">
- <widget class="QLabel" name="label_12">
- <property name="text">
- <string>Roll</string>
- </property>
- </widget>
- </item>
- <item row="2" column="1">
- <widget class="QLabel" name="y_drift_speed">
- <property name="minimumSize">
- <size>
- <width>40</width>
- <height>0</height>
- </size>
- </property>
- <property name="text">
- <string>50</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
- </property>
- </widget>
- </item>
- <item row="6" column="2">
- <widget class="QLabel" name="label_24">
- <property name="text">
- <string>°/s</string>
- </property>
- </widget>
- </item>
- <item row="4" column="2">
- <widget class="QLabel" name="label_23">
+ <item row="0" column="2">
+ <widget class="QLabel" name="label_14">
<property name="text">
<string>mm/s</string>
</property>
</widget>
</item>
- <item row="9" column="2">
- <widget class="QLabel" name="label_25">
+ <item row="0" column="0">
+ <widget class="QLabel" name="label_4">
<property name="text">
- <string>°/s</string>
+ <string>Position</string>
</property>
</widget>
</item>
- <item row="4" column="3">
- <widget class="QSlider" name="z_drift_speed_slider">
- <property name="minimum">
- <number>1</number>
- </property>
- <property name="maximum">
- <number>200</number>
- </property>
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
+ <item row="0" column="1">
+ <widget class="QLabel" name="pos_drift_speed">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
</property>
- </widget>
- </item>
- <item row="4" column="1">
- <widget class="QLabel" name="z_drift_speed">
<property name="minimumSize">
<size>
<width>40</width>
@@ -354,54 +165,8 @@
</property>
</widget>
</item>
- <item row="11" column="1">
- <widget class="QLabel" name="roll_drift_speed">
- <property name="minimumSize">
- <size>
- <width>40</width>
- <height>0</height>
- </size>
- </property>
- <property name="text">
- <string>100</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
- </property>
- </widget>
- </item>
- <item row="2" column="0">
- <widget class="QLabel" name="label_13">
- <property name="text">
- <string>Y</string>
- </property>
- </widget>
- </item>
- <item row="9" column="1">
- <widget class="QLabel" name="pitch_drift_speed">
- <property name="minimumSize">
- <size>
- <width>40</width>
- <height>0</height>
- </size>
- </property>
- <property name="text">
- <string>100</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
- </property>
- </widget>
- </item>
- <item row="9" column="0">
- <widget class="QLabel" name="label_10">
- <property name="text">
- <string>Pitch</string>
- </property>
- </widget>
- </item>
- <item row="9" column="3">
- <widget class="QSlider" name="pitch_drift_speed_slider">
+ <item row="4" column="3">
+ <widget class="QSlider" name="rot_drift_speed_slider">
<property name="minimum">
<number>1</number>
</property>
@@ -413,15 +178,15 @@
</property>
</widget>
</item>
- <item row="0" column="0">
- <widget class="QLabel" name="label_4">
+ <item row="4" column="0">
+ <widget class="QLabel" name="label_8">
<property name="text">
- <string>X</string>
+ <string>Rotation</string>
</property>
</widget>
</item>
- <item row="6" column="1">
- <widget class="QLabel" name="yaw_drift_speed">
+ <item row="4" column="1">
+ <widget class="QLabel" name="rot_drift_speed">
<property name="minimumSize">
<size>
<width>40</width>
@@ -436,29 +201,15 @@
</property>
</widget>
</item>
- <item row="0" column="2">
- <widget class="QLabel" name="label_14">
- <property name="text">
- <string>mm/s</string>
- </property>
- </widget>
- </item>
- <item row="2" column="2">
- <widget class="QLabel" name="label_22">
- <property name="text">
- <string>mm/s</string>
- </property>
- </widget>
- </item>
- <item row="6" column="0">
- <widget class="QLabel" name="label_8">
+ <item row="4" column="2">
+ <widget class="QLabel" name="label_24">
<property name="text">
- <string>Yaw</string>
+ <string>°/s</string>
</property>
</widget>
</item>
<item row="0" column="3">
- <widget class="QSlider" name="x_drift_speed_slider">
+ <widget class="QSlider" name="pos_drift_speed_slider">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Maximum">
<horstretch>0</horstretch>
@@ -476,61 +227,6 @@
</property>
</widget>
</item>
- <item row="11" column="2">
- <widget class="QLabel" name="label_26">
- <property name="text">
- <string>°/s</string>
- </property>
- </widget>
- </item>
- <item row="6" column="3">
- <widget class="QSlider" name="yaw_drift_speed_slider">
- <property name="minimum">
- <number>1</number>
- </property>
- <property name="maximum">
- <number>400</number>
- </property>
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- </widget>
- </item>
- <item row="11" column="3">
- <widget class="QSlider" name="roll_drift_speed_slider">
- <property name="minimum">
- <number>1</number>
- </property>
- <property name="maximum">
- <number>400</number>
- </property>
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- </widget>
- </item>
- <item row="0" column="1">
- <widget class="QLabel" name="x_drift_speed">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Fixed" vsizetype="Preferred">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="minimumSize">
- <size>
- <width>40</width>
- <height>0</height>
- </size>
- </property>
- <property name="text">
- <string>50</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
- </property>
- </widget>
- </item>
</layout>
</widget>
</item>
@@ -547,7 +243,7 @@
<item row="4" column="0">
<widget class="QLabel" name="label_15">
<property name="text">
- <string>Instructions: Set all sliders to minimum. Then on an axis by axis basis: First, increase responsiveness until the filter only just cancels jerkiness for faster head movements. Second, increase drift speed until the filter only just cancels drift movement when your head is still.</string>
+ <string>Instructions: Set all sliders to minimum. Then for each of rotation and position: First, increase responsiveness until the filter only just cancels jerkiness for faster head movements. Second, increase drift speed until the filter only just cancels drift movement when your head is still.</string>
</property>
<property name="alignment">
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
@@ -573,18 +269,10 @@
</layout>
</widget>
<tabstops>
- <tabstop>x_responsiveness_slider</tabstop>
- <tabstop>y_responsiveness_slider</tabstop>
- <tabstop>z_responsiveness_slider</tabstop>
- <tabstop>yaw_responsiveness_slider</tabstop>
- <tabstop>pitch_responsiveness_slider</tabstop>
- <tabstop>roll_responsiveness_slider</tabstop>
- <tabstop>x_drift_speed_slider</tabstop>
- <tabstop>y_drift_speed_slider</tabstop>
- <tabstop>z_drift_speed_slider</tabstop>
- <tabstop>yaw_drift_speed_slider</tabstop>
- <tabstop>pitch_drift_speed_slider</tabstop>
- <tabstop>roll_drift_speed_slider</tabstop>
+ <tabstop>pos_responsiveness_slider</tabstop>
+ <tabstop>rot_responsiveness_slider</tabstop>
+ <tabstop>pos_drift_speed_slider</tabstop>
+ <tabstop>rot_drift_speed_slider</tabstop>
</tabstops>
<resources/>
<connections>
diff --git a/filter-nm/lang/nl_NL.ts b/filter-nm/lang/nl_NL.ts
index d68712e9..540e2d51 100644
--- a/filter-nm/lang/nl_NL.ts
+++ b/filter-nm/lang/nl_NL.ts
@@ -8,30 +8,6 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source>X</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Y</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Z</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Yaw</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Pitch</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Roll</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>°/s</source>
<translation type="unfinished"></translation>
</message>
@@ -60,11 +36,19 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source>Instructions: Set all sliders to minimum. Then on an axis by axis basis: First, increase responsiveness until the filter only just cancels jerkiness for faster head movements. Second, increase drift speed until the filter only just cancels drift movement when your head is still.</source>
+ <source>Natural movement filter by Tom Brazier: Cancels higher frequency noise and the natural tendency for our heads to drift even when we think we are sitting still.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Natural movement filter by Tom Brazier: Cancels higher frequency noise and the natural tendency for our heads to drift even when we think we are sitting still.</source>
+ <source>Rotation</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Position</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Instructions: Set all sliders to minimum. Then for each of rotation and position: First, increase responsiveness until the filter only just cancels jerkiness for faster head movements. Second, increase drift speed until the filter only just cancels drift movement when your head is still.</source>
<translation type="unfinished"></translation>
</message>
</context>
diff --git a/filter-nm/lang/ru_RU.ts b/filter-nm/lang/ru_RU.ts
index 9ea3d158..31e5d5cc 100644
--- a/filter-nm/lang/ru_RU.ts
+++ b/filter-nm/lang/ru_RU.ts
@@ -8,30 +8,6 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source>X</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Y</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Z</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Yaw</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Pitch</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Roll</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>°/s</source>
<translation type="unfinished"></translation>
</message>
@@ -60,11 +36,19 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source>Instructions: Set all sliders to minimum. Then on an axis by axis basis: First, increase responsiveness until the filter only just cancels jerkiness for faster head movements. Second, increase drift speed until the filter only just cancels drift movement when your head is still.</source>
+ <source>Natural movement filter by Tom Brazier: Cancels higher frequency noise and the natural tendency for our heads to drift even when we think we are sitting still.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Natural movement filter by Tom Brazier: Cancels higher frequency noise and the natural tendency for our heads to drift even when we think we are sitting still.</source>
+ <source>Rotation</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Position</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Instructions: Set all sliders to minimum. Then for each of rotation and position: First, increase responsiveness until the filter only just cancels jerkiness for faster head movements. Second, increase drift speed until the filter only just cancels drift movement when your head is still.</source>
<translation type="unfinished"></translation>
</message>
</context>
diff --git a/filter-nm/lang/stub.ts b/filter-nm/lang/stub.ts
index 61c1f5bc..3b960804 100644
--- a/filter-nm/lang/stub.ts
+++ b/filter-nm/lang/stub.ts
@@ -8,30 +8,6 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source>X</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Y</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Z</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Yaw</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Pitch</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Roll</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>°/s</source>
<translation type="unfinished"></translation>
</message>
@@ -60,11 +36,19 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source>Instructions: Set all sliders to minimum. Then on an axis by axis basis: First, increase responsiveness until the filter only just cancels jerkiness for faster head movements. Second, increase drift speed until the filter only just cancels drift movement when your head is still.</source>
+ <source>Natural movement filter by Tom Brazier: Cancels higher frequency noise and the natural tendency for our heads to drift even when we think we are sitting still.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Natural movement filter by Tom Brazier: Cancels higher frequency noise and the natural tendency for our heads to drift even when we think we are sitting still.</source>
+ <source>Rotation</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Position</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Instructions: Set all sliders to minimum. Then for each of rotation and position: First, increase responsiveness until the filter only just cancels jerkiness for faster head movements. Second, increase drift speed until the filter only just cancels drift movement when your head is still.</source>
<translation type="unfinished"></translation>
</message>
</context>
diff --git a/filter-nm/lang/zh_CN.ts b/filter-nm/lang/zh_CN.ts
index d6490d99..92521e0f 100644
--- a/filter-nm/lang/zh_CN.ts
+++ b/filter-nm/lang/zh_CN.ts
@@ -8,30 +8,6 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source>X</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Y</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Z</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Yaw</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Pitch</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Roll</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>°/s</source>
<translation type="unfinished"></translation>
</message>
@@ -60,11 +36,19 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source>Instructions: Set all sliders to minimum. Then on an axis by axis basis: First, increase responsiveness until the filter only just cancels jerkiness for faster head movements. Second, increase drift speed until the filter only just cancels drift movement when your head is still.</source>
+ <source>Natural movement filter by Tom Brazier: Cancels higher frequency noise and the natural tendency for our heads to drift even when we think we are sitting still.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Natural movement filter by Tom Brazier: Cancels higher frequency noise and the natural tendency for our heads to drift even when we think we are sitting still.</source>
+ <source>Rotation</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Position</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Instructions: Set all sliders to minimum. Then for each of rotation and position: First, increase responsiveness until the filter only just cancels jerkiness for faster head movements. Second, increase drift speed until the filter only just cancels drift movement when your head is still.</source>
<translation type="unfinished"></translation>
</message>
</context>