C#2D到3D坐标OpenGL

时间:2015-05-27 12:12:04

标签: c# opengl opentk

我正在尝试编写一种算法,将鼠标点击转换为3D坐标(此时插入一个对象)。

我有"地面" Y = 0的等级,我想根据鼠标点击计算X和Z.我的功能目前看起来像这样:

Point p = this.control.PointToClient(new Point(System.Windows.Forms.Cursor.Position.X, System.Windows.Forms.Cursor.Position.Y));

Vector3 pos = GeometryHelper.Unproject(new Vector3(p.X, 0f, p.Y), viewport.X, viewport.Y, viewport.Width, viewport.Height, projectionPlane.Near, projectionPlane.Far, Matrix4.Invert(mProjectionMatrix * camera.GetViewMatrix()));
active.applyGeometry(pos);

function applyGeometry只是设置对象的位置。我相信通过的论点是不言自明的。

我的Unproject功能看起来像这样:

public static Vector3 Unproject(Vector3 vector, float x, float y, float width, float height, float minZ, float maxZ, Matrix4 inverseWorldViewProjection)
        {
            Vector4 result;

            result.X = ((((vector.X - x) / width) * 2.0f) - 1.0f);
            result.Y = ((((vector.Y - y) / height) * 2.0f) - 1.0f);
            result.Z = (((vector.Z / (maxZ - minZ)) * 2.0f) - 1.0f);

            result.X =
                result.X * inverseWorldViewProjection.M11 +
                result.Y * inverseWorldViewProjection.M21 +
                result.Z * inverseWorldViewProjection.M31 +
                inverseWorldViewProjection.M41;

            result.Y =
                result.X * inverseWorldViewProjection.M12 +
                result.Y * inverseWorldViewProjection.M22 +
                result.Z * inverseWorldViewProjection.M32 +
                inverseWorldViewProjection.M42;

            result.Z =
                result.X * inverseWorldViewProjection.M13 +
                result.Y * inverseWorldViewProjection.M23 +
                result.Z * inverseWorldViewProjection.M33 +
                inverseWorldViewProjection.M43;

            result.W =
                result.X * inverseWorldViewProjection.M14 +
                result.Y * inverseWorldViewProjection.M24 +
                result.Z * inverseWorldViewProjection.M34 +
                inverseWorldViewProjection.M44;

            result /= result.W;

            return new Vector3(result.X, result.Y, result.Z);
        }

问题是Unproject函数返回接近0,0,0的结果,这使得我的对象出现在0,0,0附近。知道如何修改它才能正常工作吗?

更新

我相信我已经提供了足够的关于这个案子的细节,但是如果你需要别的东西来帮助我,请不要犹豫告诉我; )

0 个答案:

没有答案