summaryrefslogtreecommitdiffhomepage
path: root/filter-hamilton
diff options
context:
space:
mode:
Diffstat (limited to 'filter-hamilton')
-rw-r--r--filter-hamilton/CMakeLists.txt1
-rw-r--r--filter-hamilton/ReadMe.txt13
-rw-r--r--filter-hamilton/ftnoir_filter_hamilton.cpp80
-rw-r--r--filter-hamilton/ftnoir_filter_hamilton.h74
-rw-r--r--filter-hamilton/ftnoir_filter_hamilton_dialog.cpp64
-rw-r--r--filter-hamilton/ftnoir_hamilton_filtercontrols.ui819
-rw-r--r--filter-hamilton/lang/de_DE.ts78
-rw-r--r--filter-hamilton/lang/nl_NL.ts78
-rw-r--r--filter-hamilton/lang/ru_RU.ts78
-rw-r--r--filter-hamilton/lang/stub.ts78
-rw-r--r--filter-hamilton/lang/zh_CN.ts78
11 files changed, 1441 insertions, 0 deletions
diff --git a/filter-hamilton/CMakeLists.txt b/filter-hamilton/CMakeLists.txt
new file mode 100644
index 00000000..8d4d71b0
--- /dev/null
+++ b/filter-hamilton/CMakeLists.txt
@@ -0,0 +1 @@
+otr_module(filter-hamilton)
diff --git a/filter-hamilton/ReadMe.txt b/filter-hamilton/ReadMe.txt
new file mode 100644
index 00000000..bdd476da
--- /dev/null
+++ b/filter-hamilton/ReadMe.txt
@@ -0,0 +1,13 @@
+Add a new Hamilton filter.
+
+Hamilton Filter Key Features:
+- Instead of square, round (spherical) floating dead zones and smoothing areas are applied. Due to this, the angular size of these zones does not change when the Pitch angle changes. Diagonally rotations is as easy as moving along the Yaw and Pitch axes.
+- Rotations are not filtered by independent coordinates, but comprehensively, in 3D space. Rotations and movements are more natural. There are no view jumps at the borders of +/- 180 degrees.
+- The possibility of increasing the smoothing of rotations when zooming (when the head is approaching the monitor, that is, when increasing the -Z coordinate) is introduced. This makes it possible to more accurately aim and monitor remote targets.
+
+A full description of the Hamilton filter is available in Russian here:
+https://sites.google.com/site/diyheadtracking/home/opentrack/opentrack-hamilton-filter
+
+The Hamilton filter was tested by the Russian community, received positive reviews:
+https://forum.il2sturmovik.ru/topic/5061-opentrack-------/page/24/
+https://forums.eagle.ru/showthread.php?t=23280&page=249
diff --git a/filter-hamilton/ftnoir_filter_hamilton.cpp b/filter-hamilton/ftnoir_filter_hamilton.cpp
new file mode 100644
index 00000000..c4429ecc
--- /dev/null
+++ b/filter-hamilton/ftnoir_filter_hamilton.cpp
@@ -0,0 +1,80 @@
+/* Copyright (c) 2020, GO63-samara <go1@list.ru>
+ *
+ * Permission to use, copy, modify, and/or distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ */
+
+#include "ftnoir_filter_hamilton.h"
+#include <cmath>
+#include <QMutexLocker>
+#include "api/plugin-api.hpp"
+#include "compat/hamilton-tools.h"
+
+hamilton::hamilton() = default;
+
+void hamilton::filter(const double *input, double *output)
+{
+ tQuat quat_input = QuatFromYPR( &input[Yaw] );
+
+ if (first_run)
+ {
+ first_run = false;
+ quat_last = quat_input;
+ pos_last = {input[TX], input[TY], input[TZ]};
+ for (int i=0; i<6; i++) output[i] = input[i];
+ return;
+ }
+
+ // positions:
+ const double pos_max {s.kMaxDist};
+ const double pos_deadzone{s.kDeadZoneDist};
+ const double pos_pow {s.kPowDist};
+
+ double dist = VectorDistance( &input[TX], pos_last);
+
+ double alpha = (dist - pos_deadzone) / (pos_max + pos_deadzone + EPSILON);
+ alpha = std::min(1.0, std::max(0.0, alpha));
+ if (alpha > 0.0)
+ alpha = pow(alpha, pos_pow);
+ // Scale alpha so that alpha * dist <= dist - pos_deadzone. This ensures that
+ // the center of the deadzone will never move closer to the input position than
+ // distance dist. And this ensures that the view never jumps ahead of head
+ // movements.
+ alpha *= (dist - pos_deadzone) / (dist + EPSILON);
+
+ pos_last = Lerp(pos_last, input, alpha);
+
+ output[TX] = pos_last.v[0];
+ output[TY] = pos_last.v[1];
+ output[TZ] = pos_last.v[2];
+
+ // zoom smoothing:
+ const double pow_zoom {s.kPowZoom};
+ const double max_z {s.kMaxZ};
+ double rot_zoom = pow_zoom;
+
+ if (output[TZ] > 0) rot_zoom = 0;
+ else rot_zoom *= -output[TZ] / (max_z + EPSILON);
+ rot_zoom = fmin( rot_zoom, pow_zoom );
+
+ // rotations:
+ const double rot_max {s.kMaxRot};
+ const double rot_pow {s.kPowRot};
+ const double rot_deadzone{s.kDeadZoneRot};
+
+ double angle = AngleBetween(quat_input, quat_last);
+
+ alpha = (angle - rot_deadzone) / (rot_max + rot_deadzone + EPSILON);
+ alpha = std::min(1.0, std::max(0.0, alpha));
+ if (alpha > 0.0)
+ alpha = pow(alpha, rot_pow + rot_zoom);
+ // see comment in earlier alpha calculation above
+ alpha *= (angle - rot_deadzone) / (angle + EPSILON);
+
+ quat_last = Slerp(quat_last, quat_input, alpha);
+
+ QuatToYPR(quat_last, &output[Yaw] );
+}
+
+OPENTRACK_DECLARE_FILTER(hamilton, dialog_hamilton, hamiltonDll)
diff --git a/filter-hamilton/ftnoir_filter_hamilton.h b/filter-hamilton/ftnoir_filter_hamilton.h
new file mode 100644
index 00000000..199eef80
--- /dev/null
+++ b/filter-hamilton/ftnoir_filter_hamilton.h
@@ -0,0 +1,74 @@
+/* Copyright (c) 2020, GO63-samara <go1@list.ru>
+ *
+ * Permission to use, copy, modify, and/or distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ */
+
+#pragma once
+
+#include "api/plugin-api.hpp"
+#include "ui_ftnoir_hamilton_filtercontrols.h"
+#include <QWidget>
+#include <QMutex>
+#include "options/options.hpp"
+//#include "compat/timer.hpp"
+#include "compat/hamilton-tools.h"
+
+using namespace options;
+
+struct settings : opts {
+ value<slider_value> kMaxRot, kPowRot, kDeadZoneRot,
+ kMaxDist, kPowDist, kDeadZoneDist,
+ kPowZoom, kMaxZ;
+ settings() :
+ opts ("hamilton-filter"),
+ kMaxRot (b, "max-radius-smoothing", { .01, .001, 25.0 }),
+ kPowRot (b, "smoothing-power-rot", { .01, .001, 4.0 }),
+ kDeadZoneRot (b, "dead-zone-radius-rot", { .01, .001, 0.5 }),
+ kMaxDist (b, "max-distance-smoothing",{ .01, .001, 20.0 }),
+ kPowDist (b, "smoothing-power-dist", { .01, .001, 4.0 }),
+ kDeadZoneDist(b, "dead-zone-radius-dist", { .01, .001, 0.5 }),
+ kPowZoom (b, "smoothing-power-zoom", { .01, .001, 4.0 }),
+ kMaxZ (b, "max-z", { .01, .001, 100.0 })
+ {}
+};
+
+class hamilton : public IFilter
+{
+public:
+ hamilton();
+ void filter(const double *input, double *output) override;
+ void center() override { first_run = true; }
+ module_status initialize() override { return status_ok(); }
+private:
+ tQuat quat_last;
+ tVector pos_last;
+ settings s;
+ bool first_run = true;
+};
+
+class dialog_hamilton: public IFilterDialog
+{
+ Q_OBJECT
+public:
+ dialog_hamilton();
+ void register_filter(IFilter*) override {}
+ void unregister_filter() override {}
+
+private:
+ Ui::UICdialog_hamilton ui;
+ settings s;
+
+private slots:
+ void doOK();
+ void doCancel();
+};
+
+class hamiltonDll : public Metadata
+{
+ Q_OBJECT
+
+ QString name() { return tr("Hamilton"); }
+ QIcon icon() { return QIcon(":/images/filter-16.png"); }
+};
diff --git a/filter-hamilton/ftnoir_filter_hamilton_dialog.cpp b/filter-hamilton/ftnoir_filter_hamilton_dialog.cpp
new file mode 100644
index 00000000..11f4c067
--- /dev/null
+++ b/filter-hamilton/ftnoir_filter_hamilton_dialog.cpp
@@ -0,0 +1,64 @@
+/* Copyright (c) 2020, GO63-samara <go1@list.ru>
+ *
+ * Permission to use, copy, modify, and/or distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ */
+
+#include "ftnoir_filter_hamilton.h"
+#include <cmath>
+#include <QDebug>
+#include <QString>
+#include "api/plugin-api.hpp"
+#include "ui_ftnoir_hamilton_filtercontrols.h"
+
+dialog_hamilton::dialog_hamilton()
+{
+ ui.setupUi(this);
+
+ connect(ui.buttonBox, SIGNAL(accepted()), this, SLOT(doOK()));
+ connect(ui.buttonBox, SIGNAL(rejected()), this, SLOT(doCancel()));
+
+ tie_setting(s.kMaxRot, ui.maxRot);
+ tie_setting(s.kMaxRot, ui.lbMaxRot, [](double x)
+ { return QStringLiteral("%1\xB0").arg(x, 0, 'f', 2);});
+
+ tie_setting(s.kPowRot, ui.powRot);
+ tie_setting(s.kPowRot, ui.lbPowRot, [](double x)
+ { return QStringLiteral("%1").arg(x, 0, 'f', 2);});
+
+ tie_setting(s.kDeadZoneRot, ui.dzRot);
+ tie_setting(s.kDeadZoneRot, ui.lbDZRot, [](double x)
+ { return QStringLiteral("%1\xB0").arg(x, 0, 'f', 2);});
+
+ tie_setting(s.kPowZoom, ui.powZoom);
+ tie_setting(s.kPowZoom, ui.lbPowZoom, [](double x)
+ { return QStringLiteral("%1").arg(x, 0, 'f', 2);});
+
+ tie_setting(s.kMaxZ, ui.maxZ);
+ tie_setting(s.kMaxZ, ui.lbMaxZ, [](double x)
+ { return QStringLiteral("%1").arg(x, 0, 'f', 2);});
+
+ tie_setting(s.kMaxDist, ui.maxDist);
+ tie_setting(s.kMaxDist, ui.lbMaxDist, [](double x)
+ { return QStringLiteral("%1cm").arg(x, 0, 'f', 2);});
+
+ tie_setting(s.kPowDist, ui.powDist);
+ tie_setting(s.kPowDist, ui.lbPowDist, [](double x)
+ { return QStringLiteral("%1").arg(x, 0, 'f', 2);});
+
+ tie_setting(s.kDeadZoneDist, ui.dzDist);
+ tie_setting(s.kDeadZoneDist, ui.lbDZDist, [](double x)
+ { return QStringLiteral("%1cm").arg(x, 0, 'f', 2);});
+}
+
+void dialog_hamilton::doOK()
+{
+ s.b->save();
+ close();
+}
+
+void dialog_hamilton::doCancel()
+{
+ close();
+}
diff --git a/filter-hamilton/ftnoir_hamilton_filtercontrols.ui b/filter-hamilton/ftnoir_hamilton_filtercontrols.ui
new file mode 100644
index 00000000..4c8b1536
--- /dev/null
+++ b/filter-hamilton/ftnoir_hamilton_filtercontrols.ui
@@ -0,0 +1,819 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>UICdialog_hamilton</class>
+ <widget class="QWidget" name="UICdialog_hamilton">
+ <property name="windowModality">
+ <enum>Qt::NonModal</enum>
+ </property>
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>514</width>
+ <height>563</height>
+ </rect>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>0</width>
+ <height>485</height>
+ </size>
+ </property>
+ <property name="font">
+ <font>
+ <weight>50</weight>
+ <bold>false</bold>
+ </font>
+ </property>
+ <property name="windowTitle">
+ <string>Hamilton filter settings</string>
+ </property>
+ <property name="windowIcon">
+ <iconset resource="../gui/opentrack-res.qrc">
+ <normaloff>:/images/filter-16.png</normaloff>:/images/filter-16.png</iconset>
+ </property>
+ <property name="layoutDirection">
+ <enum>Qt::LeftToRight</enum>
+ </property>
+ <property name="autoFillBackground">
+ <bool>false</bool>
+ </property>
+ <property name="styleSheet">
+ <string notr="true"/>
+ </property>
+ <layout class="QGridLayout" name="gridLayout_2">
+ <item row="2" column="0">
+ <widget class="QGroupBox" name="groupBox">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>496</width>
+ <height>150</height>
+ </size>
+ </property>
+ <property name="title">
+ <string>Rotations: </string>
+ </property>
+ <property name="flat">
+ <bool>false</bool>
+ </property>
+ <layout class="QGridLayout" name="gridLayout">
+ <item row="8" column="2">
+ <widget class="QSlider" name="powRot">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="focusPolicy">
+ <enum>Qt::StrongFocus</enum>
+ </property>
+ <property name="autoFillBackground">
+ <bool>false</bool>
+ </property>
+ <property name="minimum">
+ <number>0</number>
+ </property>
+ <property name="maximum">
+ <number>400</number>
+ </property>
+ <property name="singleStep">
+ <number>1</number>
+ </property>
+ <property name="pageStep">
+ <number>50</number>
+ </property>
+ <property name="value">
+ <number>200</number>
+ </property>
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="tickPosition">
+ <enum>QSlider::TicksBothSides</enum>
+ </property>
+ <property name="tickInterval">
+ <number>100</number>
+ </property>
+ </widget>
+ </item>
+ <item row="8" column="3">
+ <widget class="QLabel" name="lbPowRot">
+ <property name="minimumSize">
+ <size>
+ <width>45</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="toolTip">
+ <string notr="true"/>
+ </property>
+ <property name="text">
+ <string>2,00</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item row="6" column="2">
+ <widget class="QSlider" name="dzRot">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="focusPolicy">
+ <enum>Qt::StrongFocus</enum>
+ </property>
+ <property name="minimum">
+ <number>0</number>
+ </property>
+ <property name="maximum">
+ <number>50</number>
+ </property>
+ <property name="singleStep">
+ <number>1</number>
+ </property>
+ <property name="pageStep">
+ <number>5</number>
+ </property>
+ <property name="value">
+ <number>1</number>
+ </property>
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="tickPosition">
+ <enum>QSlider::TicksBothSides</enum>
+ </property>
+ <property name="tickInterval">
+ <number>10</number>
+ </property>
+ </widget>
+ </item>
+ <item row="8" column="0">
+ <widget class="QLabel" name="lbRpow">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>0</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="styleSheet">
+ <string notr="true"/>
+ </property>
+ <property name="text">
+ <string>Smoothing power:</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item row="6" column="0">
+ <widget class="QLabel" name="lbRdz">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>0</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="styleSheet">
+ <string notr="true"/>
+ </property>
+ <property name="text">
+ <string>Dead Zone:</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item row="6" column="3">
+ <widget class="QLabel" name="lbDZRot">
+ <property name="minimumSize">
+ <size>
+ <width>45</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="toolTip">
+ <string notr="true"/>
+ </property>
+ <property name="text">
+ <string>0,01</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item row="7" column="0">
+ <widget class="QLabel" name="lbRmax">
+ <property name="text">
+ <string>Max distance:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="7" column="2">
+ <widget class="QSlider" name="maxRot">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="focusPolicy">
+ <enum>Qt::StrongFocus</enum>
+ </property>
+ <property name="minimum">
+ <number>0</number>
+ </property>
+ <property name="maximum">
+ <number>250</number>
+ </property>
+ <property name="singleStep">
+ <number>1</number>
+ </property>
+ <property name="pageStep">
+ <number>50</number>
+ </property>
+ <property name="value">
+ <number>100</number>
+ </property>
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="tickPosition">
+ <enum>QSlider::TicksBothSides</enum>
+ </property>
+ <property name="tickInterval">
+ <number>50</number>
+ </property>
+ </widget>
+ </item>
+ <item row="7" column="3">
+ <widget class="QLabel" name="lbMaxRot">
+ <property name="minimumSize">
+ <size>
+ <width>45</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="toolTip">
+ <string notr="true"/>
+ </property>
+ <property name="text">
+ <string>10,00</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item row="6" column="0">
+ <widget class="QDialogButtonBox" name="buttonBox">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="layoutDirection">
+ <enum>Qt::LeftToRight</enum>
+ </property>
+ <property name="standardButtons">
+ <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
+ </property>
+ <property name="centerButtons">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="0">
+ <widget class="QLabel" name="label">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>0</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="text">
+ <string>For both rotations and positions: No movement occurs within the dead zone. Smoothing scales down to minimum at max distance + 2 x dead zone.</string>
+ </property>
+ <property name="wordWrap">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="0">
+ <widget class="QGroupBox" name="groupBox_2">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>0</width>
+ <height>150</height>
+ </size>
+ </property>
+ <property name="title">
+ <string>Positions: </string>
+ </property>
+ <layout class="QGridLayout" name="gridLayout_4">
+ <item row="1" column="2">
+ <widget class="QLabel" name="lbMaxDist">
+ <property name="minimumSize">
+ <size>
+ <width>45</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="text">
+ <string>10,00</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="lbRpow_3">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>0</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="styleSheet">
+ <string notr="true"/>
+ </property>
+ <property name="text">
+ <string>Smoothing power:</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0">
+ <widget class="QLabel" name="lbDmax">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>0</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="styleSheet">
+ <string notr="true"/>
+ </property>
+ <property name="text">
+ <string>Max distance:</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1">
+ <widget class="QSlider" name="maxDist">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="focusPolicy">
+ <enum>Qt::StrongFocus</enum>
+ </property>
+ <property name="minimum">
+ <number>0</number>
+ </property>
+ <property name="maximum">
+ <number>200</number>
+ </property>
+ <property name="singleStep">
+ <number>1</number>
+ </property>
+ <property name="pageStep">
+ <number>50</number>
+ </property>
+ <property name="value">
+ <number>100</number>
+ </property>
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="tickPosition">
+ <enum>QSlider::TicksBothSides</enum>
+ </property>
+ <property name="tickInterval">
+ <number>50</number>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1">
+ <widget class="QSlider" name="powDist">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="focusPolicy">
+ <enum>Qt::StrongFocus</enum>
+ </property>
+ <property name="autoFillBackground">
+ <bool>false</bool>
+ </property>
+ <property name="minimum">
+ <number>0</number>
+ </property>
+ <property name="maximum">
+ <number>400</number>
+ </property>
+ <property name="singleStep">
+ <number>1</number>
+ </property>
+ <property name="pageStep">
+ <number>50</number>
+ </property>
+ <property name="value">
+ <number>100</number>
+ </property>
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="tickPosition">
+ <enum>QSlider::TicksBothSides</enum>
+ </property>
+ <property name="tickInterval">
+ <number>100</number>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="2">
+ <widget class="QLabel" name="lbPowDist">
+ <property name="minimumSize">
+ <size>
+ <width>40</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="text">
+ <string>1,00</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="0">
+ <widget class="QLabel" name="lbRdz_3">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>0</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="styleSheet">
+ <string notr="true"/>
+ </property>
+ <property name="text">
+ <string>Dead Zone:</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1">
+ <widget class="QSlider" name="dzDist">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="focusPolicy">
+ <enum>Qt::StrongFocus</enum>
+ </property>
+ <property name="minimum">
+ <number>0</number>
+ </property>
+ <property name="maximum">
+ <number>50</number>
+ </property>
+ <property name="singleStep">
+ <number>1</number>
+ </property>
+ <property name="pageStep">
+ <number>10</number>
+ </property>
+ <property name="value">
+ <number>2</number>
+ </property>
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="tickPosition">
+ <enum>QSlider::TicksBothSides</enum>
+ </property>
+ <property name="tickInterval">
+ <number>10</number>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="2">
+ <widget class="QLabel" name="lbDZDist">
+ <property name="minimumSize">
+ <size>
+ <width>45</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="text">
+ <string>0,02</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item row="5" column="0">
+ <widget class="QGroupBox" name="groupBox_3">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>0</width>
+ <height>100</height>
+ </size>
+ </property>
+ <property name="title">
+ <string>Zoom smoothing: </string>
+ </property>
+ <layout class="QGridLayout" name="gridLayout_3">
+ <item row="2" column="0">
+ <widget class="QLabel" name="lbZpow">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>0</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="styleSheet">
+ <string notr="true"/>
+ </property>
+ <property name="text">
+ <string>Smoothing power:</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="2">
+ <widget class="QLabel" name="lbPowZoom">
+ <property name="minimumSize">
+ <size>
+ <width>45</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="text">
+ <string>2,00</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1">
+ <widget class="QSlider" name="powZoom">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="focusPolicy">
+ <enum>Qt::StrongFocus</enum>
+ </property>
+ <property name="autoFillBackground">
+ <bool>false</bool>
+ </property>
+ <property name="minimum">
+ <number>0</number>
+ </property>
+ <property name="maximum">
+ <number>400</number>
+ </property>
+ <property name="singleStep">
+ <number>1</number>
+ </property>
+ <property name="pageStep">
+ <number>50</number>
+ </property>
+ <property name="value">
+ <number>200</number>
+ </property>
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="tickPosition">
+ <enum>QSlider::TicksBothSides</enum>
+ </property>
+ <property name="tickInterval">
+ <number>100</number>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0">
+ <widget class="QLabel" name="lbZpow_2">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>0</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="styleSheet">
+ <string notr="true"/>
+ </property>
+ <property name="text">
+ <string>Max Z:</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1">
+ <widget class="QSlider" name="maxZ">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="focusPolicy">
+ <enum>Qt::StrongFocus</enum>
+ </property>
+ <property name="autoFillBackground">
+ <bool>false</bool>
+ </property>
+ <property name="minimum">
+ <number>0</number>
+ </property>
+ <property name="maximum">
+ <number>1000</number>
+ </property>
+ <property name="singleStep">
+ <number>1</number>
+ </property>
+ <property name="pageStep">
+ <number>50</number>
+ </property>
+ <property name="value">
+ <number>150</number>
+ </property>
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="tickPosition">
+ <enum>QSlider::TicksBothSides</enum>
+ </property>
+ <property name="tickInterval">
+ <number>100</number>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="2">
+ <widget class="QLabel" name="lbMaxZ">
+ <property name="minimumSize">
+ <size>
+ <width>45</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="text">
+ <string>15,00</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item row="1" column="0">
+ <widget class="QLabel" name="label_3">
+ <property name="text">
+ <string>When you lean forward, zoom smoothing increases the smoothing power for rotations. Maximum additonal smoothing power occurs when you lean forward by a distance of Max Z.</string>
+ </property>
+ <property name="wordWrap">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <tabstops>
+ <tabstop>dzRot</tabstop>
+ <tabstop>maxRot</tabstop>
+ <tabstop>powRot</tabstop>
+ <tabstop>dzDist</tabstop>
+ <tabstop>maxDist</tabstop>
+ <tabstop>powDist</tabstop>
+ <tabstop>maxZ</tabstop>
+ <tabstop>powZoom</tabstop>
+ </tabstops>
+ <resources>
+ <include location="../gui/opentrack-res.qrc"/>
+ </resources>
+ <connections/>
+ <slots>
+ <slot>startEngineClicked()</slot>
+ <slot>stopEngineClicked()</slot>
+ <slot>cameraSettingsClicked()</slot>
+ </slots>
+</ui>
diff --git a/filter-hamilton/lang/de_DE.ts b/filter-hamilton/lang/de_DE.ts
new file mode 100644
index 00000000..6ea1f913
--- /dev/null
+++ b/filter-hamilton/lang/de_DE.ts
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="de_DE">
+<context>
+ <name>UICdialog_hamilton</name>
+ <message>
+ <source>Hamilton filter settings</source>
+ <translation>Hamilton-Filtereinstellungen</translation>
+ </message>
+ <message>
+ <source>Rotations: </source>
+ <translation>Rotationen: </translation>
+ </message>
+ <message>
+ <source>2,00</source>
+ <translation>2,00</translation>
+ </message>
+ <message>
+ <source>Smoothing power:</source>
+ <translation>Glättungsstärke:</translation>
+ </message>
+ <message>
+ <source>Dead Zone:</source>
+ <translation>Totbereich:</translation>
+ </message>
+ <message>
+ <source>0,01</source>
+ <translation>0,01</translation>
+ </message>
+ <message>
+ <source>Max distance:</source>
+ <translation>Maximale Distanz:</translation>
+ </message>
+ <message>
+ <source>10,00</source>
+ <translation>10,00</translation>
+ </message>
+ <message>
+ <source>For both rotations and positions: No movement occurs within the dead zone. Smoothing scales down to minimum at max distance + 2 x dead zone.</source>
+ <translation>Für alle Rotationen und Positionen: Es findet keine Bewegung innerhalb des Totbereichs statt. Die Glättung skaliert bis zum Minimum an der maximalen Distanz + 2x der Totbereich.</translation>
+ </message>
+ <message>
+ <source>Positions: </source>
+ <translation>Positionen: </translation>
+ </message>
+ <message>
+ <source>1,00</source>
+ <translation>1,00</translation>
+ </message>
+ <message>
+ <source>0,02</source>
+ <translation>0,02</translation>
+ </message>
+ <message>
+ <source>Zoom smoothing: </source>
+ <translation>Zoom-Glättung: </translation>
+ </message>
+ <message>
+ <source>Max Z:</source>
+ <translation>Maximales Z:</translation>
+ </message>
+ <message>
+ <source>15,00</source>
+ <translation>15,00</translation>
+ </message>
+ <message>
+ <source>When you lean forward, zoom smoothing increases the smoothing power for rotations. Maximum additonal smoothing power occurs when you lean forward by a distance of Max Z.</source>
+ <translation>Beim Vorbeugen erhöht die Zoom-Glättung die Glättungsstärke für Rotationen. Die maximal zusätzliche Glättungsstärke tritt auf beim Vorbeugen mit der Distanz Max Z.</translation>
+ </message>
+</context>
+<context>
+ <name>hamiltonDll</name>
+ <message>
+ <source>Hamilton</source>
+ <translation>Hamilton</translation>
+ </message>
+</context>
+</TS>
diff --git a/filter-hamilton/lang/nl_NL.ts b/filter-hamilton/lang/nl_NL.ts
new file mode 100644
index 00000000..1c720540
--- /dev/null
+++ b/filter-hamilton/lang/nl_NL.ts
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="nl_NL">
+<context>
+ <name>UICdialog_hamilton</name>
+ <message>
+ <source>Rotations: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Positions: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Zoom smoothing: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Hamilton filter settings</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Max Z:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>10,00</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>0,01</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>2,00</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>1,00</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>0,02</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>15,00</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Smoothing power:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Dead Zone:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Max distance:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>For both rotations and positions: No movement occurs within the dead zone. Smoothing scales down to minimum at max distance + 2 x dead zone.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>When you lean forward, zoom smoothing increases the smoothing power for rotations. Maximum additonal smoothing power occurs when you lean forward by a distance of Max Z.</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>hamiltonDll</name>
+ <message>
+ <source>Hamilton</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/filter-hamilton/lang/ru_RU.ts b/filter-hamilton/lang/ru_RU.ts
new file mode 100644
index 00000000..f0681b21
--- /dev/null
+++ b/filter-hamilton/lang/ru_RU.ts
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="ru_RU">
+<context>
+ <name>UICdialog_hamilton</name>
+ <message>
+ <source>Rotations: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Positions: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Zoom smoothing: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Hamilton filter settings</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Max Z:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>10,00</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>0,01</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>2,00</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>1,00</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>0,02</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>15,00</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Smoothing power:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Dead Zone:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Max distance:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>For both rotations and positions: No movement occurs within the dead zone. Smoothing scales down to minimum at max distance + 2 x dead zone.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>When you lean forward, zoom smoothing increases the smoothing power for rotations. Maximum additonal smoothing power occurs when you lean forward by a distance of Max Z.</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>hamiltonDll</name>
+ <message>
+ <source>Hamilton</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/filter-hamilton/lang/stub.ts b/filter-hamilton/lang/stub.ts
new file mode 100644
index 00000000..2b767312
--- /dev/null
+++ b/filter-hamilton/lang/stub.ts
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1">
+<context>
+ <name>UICdialog_hamilton</name>
+ <message>
+ <source>Rotations: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Positions: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Zoom smoothing: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Hamilton filter settings</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Max Z:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>10,00</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>0,01</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>2,00</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>1,00</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>0,02</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>15,00</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Smoothing power:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Dead Zone:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Max distance:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>For both rotations and positions: No movement occurs within the dead zone. Smoothing scales down to minimum at max distance + 2 x dead zone.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>When you lean forward, zoom smoothing increases the smoothing power for rotations. Maximum additonal smoothing power occurs when you lean forward by a distance of Max Z.</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>hamiltonDll</name>
+ <message>
+ <source>Hamilton</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/filter-hamilton/lang/zh_CN.ts b/filter-hamilton/lang/zh_CN.ts
new file mode 100644
index 00000000..a299023d
--- /dev/null
+++ b/filter-hamilton/lang/zh_CN.ts
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="zh_CN">
+<context>
+ <name>UICdialog_hamilton</name>
+ <message>
+ <source>Rotations: </source>
+ <translation type="unfinished">旋转: </translation>
+ </message>
+ <message>
+ <source>Positions: </source>
+ <translation type="unfinished">位置: </translation>
+ </message>
+ <message>
+ <source>Zoom smoothing: </source>
+ <translation type="unfinished">缩放时平滑: </translation>
+ </message>
+ <message>
+ <source>Hamilton filter settings</source>
+ <translation>Hamilton 过滤器设置</translation>
+ </message>
+ <message>
+ <source>Max Z:</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>10,00</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>0,01</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>2,00</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>1,00</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>0,02</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>15,00</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Smoothing power:</source>
+ <translation>平滑强度:</translation>
+ </message>
+ <message>
+ <source>Dead Zone:</source>
+ <translation>死区:</translation>
+ </message>
+ <message>
+ <source>Max distance:</source>
+ <translation type="unfinished">最大距离:</translation>
+ </message>
+ <message>
+ <source>For both rotations and positions: No movement occurs within the dead zone. Smoothing scales down to minimum at max distance + 2 x dead zone.</source>
+ <translation type="unfinished">旋转和位置在死区范围内都不会发生移动. 在最大距离 +2x死区时, smoothing缩小至最小值.&lt;a href=&quot;https://github.com/opentrack/opentrack/pull/1667&quot;&gt;阅读此处Pull#1167&lt;/a&gt;</translation>
+ </message>
+ <message>
+ <source>When you lean forward, zoom smoothing increases the smoothing power for rotations. Maximum additonal smoothing power occurs when you lean forward by a distance of Max Z.</source>
+ <translation type="unfinished">当您向前倾时, &quot;缩放时平滑&quot; 功能会增强旋转的平滑强度. 前倾到 Max Z 距离时, 增加的平滑强度最大.</translation>
+ </message>
+</context>
+<context>
+ <name>hamiltonDll</name>
+ <message>
+ <source>Hamilton</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>