【问题标题】:Projecting a 3D point to a 2D screen position issue将 3D 点投影到 2D 屏幕位置问题
【发布时间】:2014-10-01 13:59:42
【问题描述】:

我尝试了 4 种方法,但都没有奏效。我的代码在其他任何地方都能正常工作,相机正确移动,物体也正确移动。

我正在使用 SharpDX,我的投影矩阵是透视投影矩阵。

我正在尝试获取 3d 点的屏幕位置,以便将光标定位在该点。

这是我尝试过的 4 种方法:

public Vector2 WorldPosToScreenPos1(Vector3 p)
{
    Vector3.Transform(ref p, ref View, out p);
    Vector3.Transform(ref p, ref Projection, out p);

    return new Vector2(
        RenderForm.ClientSize.Width * (p.X + 1) / 2,
        RenderForm.ClientSize.Height * (1 - (p.Y + 1) / 2)
        );
}

public Vector2 WorldPosToScreenPos2(Vector3 p)
{
    Vector3.Transform(ref p, ref View, out p);
    Vector3.Transform(ref p, ref Projection, out p);
    p.X /= p.Z;
    p.Y /= p.Z;
    p.X = (p.X + 1) * RenderForm.ClientSize.Width / 2;
    p.Y = (p.Y + 1) * RenderForm.ClientSize.Height / 2;

    return new Vector2(p.X, p.Y);
}

public Vector2 WorldPosToScreenPos3(Vector3 p)
{
    Viewport viewport = new Viewport(0, 0, RenderForm.ClientSize.Width, RenderForm.ClientSize.Height);
    viewport.Project(ref p, ref ViewProj, out p);

    return new Vector2(p.X, p.Y);
}

public Vector2 WorldPosToScreenPos4(Vector3 p)
{
    Vector3.Project(p, 0, 0, RenderForm.ClientSize.Width, RenderForm.ClientSize.Height, 1, 10000, ViewProj);
    return new Vector2(p.X, p.Y);
}

在所有四种方法(都给出不同的结果)中,我得到的 2d 位置是偏离的,通常相差很大。我做错了什么?

【问题讨论】:

    标签: matrix 3d geometry computational-geometry sharpdx


    【解决方案1】:

    事实证明第 4 种方法是对的,它所缺少的只是检索 Vector3.Project() 返回的值。

    其他 3 种方法仍然给出明显不同的结果,我仍然不知道为什么它们不起作用。如果有人知道,我会很高兴知道。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-08
      • 2023-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多