gpt4 book ai didi

c# - Kinect 光标控制与虚拟 XNA 矩形 -'Touchpad' - Y 轴反转

转载 作者:太空宇宙 更新时间:2023-11-03 11:19:15 26 4
gpt4 key购买 nike

我正在尝试为 MS Kinect 实现实时策略控制方案。到目前为止,我已经有了一个光标,可以通过移动你的左手(或右手,取决于你的惯用手)来移动它。我有一个基于 Open-NI 的 Kinect Controller ,它为玩家的 Action 设置骨架,并将手腕、肘部、肩部和 body 中心坐标传送到我的应用程序。为了将这些手腕坐标转换到屏幕上,我设置了一个矩形,它位于玩家中心稍微左/右的位置,只要手腕在矩形内移动,光标就会在屏幕上移动。我的问题是,XNA-Rectangle 以左上角为原点,即 X 轴指向右侧,因为它“应该”,但 Y 轴指向下方,而 Kinect 的 Y 轴 -坐标系指向上。这导致光标在屏幕上向上移动,当我向下移动我的手时,反之亦然。我无法用 Kinect 坐标系改变任何东西,所以是否可以“翻转”矩形的“坐标系”,使其 Y 轴也指向上方?

相关代码如下:

(来自校准()-方法:)

List<Vector3> joints = UDPlistener.getInstance().ParseCalibCoordinates(data);
//0 = Right Wrist 1 = Right Elbow 2 = Right Shoulder
//3 = Left Wrist 4 = Left Elbow 5 = Left Shoulder
//6 = Center
height = 762;
width = 1024;
switch (hand)
{
case 0:
cursorSpace = new Rectangle((int)(joints[6].X * 2) - 200, (int)(joints[6].Y * 2) + height, width, height);
break;
case 3:
cursorSpace = new Rectangle((int)(joints[6].X * 2) - 1200, (int)(joints[6].Y * 2) + height, width, height);
break;
}

public Point Cursor(String data)
{
List<Vector3> joints = UDPlistener.getInstance().ParsePlayCoordinates(data);
//0 = Right Wrist 1 = Left Wrist 2 = Center
double mhx = 0; //main hand x-coordinate
double mhy = 0; // main hand y-coordinate
switch (hand)
{
case 0:
mhx = joints[hand].X;
mhy = joints[hand].Y;
break;

case 3:
mhx = joints[hand-2].X;
mhy = joints[hand-2].Y;
break;
}

int x;
int y;
if (Math.Abs(mhx - mhxOld) < 1.0 || Math.Abs(mhy - mhyOld) < 1.0)
//To remove jittering of the cursor
{
x = (int) mhxOld * 2;
y = (int) mhyOld * 2;
}
else
{
x = (int) mhx * 2;
mhxOld = mhx;
y = (int) mhy * 2;
mhyOld = mhy;
}

Point cursor = new Point(0,0);

if (cursorSpace.Contains(x,y))
{
cursor = new Point(x - cursorSpace.X, y - CursorSpace.Y);
lastCursorPos = cursor;
return cursor;
}

对不起,我希望我能说清楚。

提前致谢

KK

最佳答案

我使用扩展方法来转换 OpenNI 坐标。以下示例将 OpenNI 坐标映射到左上角 640x480 矩形中的 XNA 坐标,表示为 Vector2 对象。

public static Vector2 ToXnaCoordinates(this Point3D point)
{
return new Vector2(
point.X + 320,
(point.Y - 240) * -1);
}

翻转 y 坐标的魔法是 * -1 部分。

如果你想达到一个不同于 640x480 大小的矩形,你需要在转换后相应地缩放坐标。示例:

public static Vector2 ToScaledXnaCoordinates(this Point3D point, int rectSizeX, int rectSizeY)
{
return new Vector2(
(point.X + 320) * rectSizeX / 640,
(point.Y - 240) * -rectSizeY / 480);
}

关于c# - Kinect 光标控制与虚拟 XNA 矩形 -'Touchpad' - Y 轴反转,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11559315/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com