我正在尝试使用Myo移动鼠标光标。
我做到了,但效果并不理想。
我知道Myo的每次移动都会在此代码中将光标移动5个像素。
我希望改进此代码,使其更像真正的鼠标。 (但不是这样的:point.x + 500;)
准确性和覆盖率都很重要。 由于Myo的移动很少,我想将光标从左端移动到监视器的右端。 (我的意思是0~65535。)同时,我想保持准确性(为了点击动作的方便性)。
在此代码中..
compare_pitch表示之前的pitch_w值。
compare_yaw表示之前的yaw_w值。
if(compare_pitch < collector.pitch_w) {
point.y += 5; // Move Cursor Right
}
if(compare_pitch > collector.pitch_w)
point.y -= 5; // Move Cursor Left
}
if(compare_yaw < collector.yaw_w) {
point.x -= 5; // Move Cursor Up
}
if(compare_yaw > collector.yaw_w) {
point.x += 5;// Move Cursor Down
}
SetCursorPos(point.x, point.y);
compare_pitch = collector.pitch_w;
compare_yaw = collector.yaw_w;
下面是collector.pitch_w和collector.yaw_w的函数。 (我没有使用roll_w。)
// onOrientationData() is called whenever the Myo device provides its current orientation, which is represented
// as a unit quaternion.
void onOrientationData(myo::Myo* myo, uint64_t timestamp, const myo::Quaternion<float>& quat)
{
using std::atan2;
using std::asin;
using std::sqrt;
using std::max;
using std::min;
// Calculate Euler angles (roll, pitch, and yaw) from the unit quaternion.
float roll = atan2(2.0f * (quat.w() * quat.x() + quat.y() * quat.z()),
1.0f - 2.0f * (quat.x() * quat.x() + quat.y() * quat.y()));
float pitch = asin(max(-1.0f, min(1.0f, 2.0f * (quat.w() * quat.y() - quat.z() * quat.x()))));
float yaw = atan2(2.0f * (quat.w() * quat.z() + quat.x() * quat.y()),
1.0f - 2.0f * (quat.y() * quat.y() + quat.z() * quat.z()));
// Convert the floating point angles in radians to a scale from 0 to 100.
roll_w = static_cast<int>((roll + (float)M_PI)/(M_PI * 2.0f) * 100);
pitch_w = static_cast<int>((pitch + (float)M_PI/2.0f)/M_PI * 100);
yaw_w = static_cast<int>((yaw + (float)M_PI)/(M_PI * 2.0f) * 100);
}
请给我一些建议。谢谢。
答案 0 :(得分:0)
我的想法是使用加速。
我最终的想法是使用差异compare_pitch - collector.pitch_w
和compare_yaw - collector.yaw_w
。如果手快速移动,那么这种差异将会增加。根据这种差异加速指针位置的变化。
point.y += (int)((collector.pitch_w - compare_pitch ) * some_constant_value)
point.x += (int)((collector.yaw_w - compare_yaw) * some_constant_value)