diff options
author | Tom Brazier <tom_github@firstsolo.net> | 2023-06-05 15:53:14 +0100 |
---|---|---|
committer | Tom Brazier <tom_github@firstsolo.net> | 2023-07-23 14:00:51 +0100 |
commit | 89c346c1b1a7d0d395d446a2113ff5e6771441fe (patch) | |
tree | b4ddf77dcae1d1a01e82fa9e71a8cf05d255148e | |
parent | 96f51ea8a769c2f49525e2424ace165ec3c05ef8 (diff) |
Changed nm filter to use vectors and quaterions like the hamilton filter for a spherical deadzone
-rw-r--r-- | filter-nm/ftnoir_filter_nm.cpp | 43 | ||||
-rw-r--r-- | filter-nm/ftnoir_filter_nm.h | 32 | ||||
-rw-r--r-- | filter-nm/ftnoir_filter_nm_dialog.cpp | 48 | ||||
-rw-r--r-- | filter-nm/ftnoir_nm_filtercontrols.ui | 400 | ||||
-rw-r--r-- | filter-nm/lang/nl_NL.ts | 36 | ||||
-rw-r--r-- | filter-nm/lang/ru_RU.ts | 36 | ||||
-rw-r--r-- | filter-nm/lang/stub.ts | 36 | ||||
-rw-r--r-- | filter-nm/lang/zh_CN.ts | 36 |
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> |