Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 什么';我的项目和非项目功能有什么问题?_C#_Opengl_Math_Matrix_Opentk - Fatal编程技术网

C# 什么';我的项目和非项目功能有什么问题?

C# 什么';我的项目和非项目功能有什么问题?,c#,opengl,math,matrix,opentk,C#,Opengl,Math,Matrix,Opentk,我正在使用OpenTK进行C#中的一个游戏,它没有项目和非项目函数,它们在世界坐标和屏幕坐标之间进行转换。是的,但它们不受欢迎,我无法让它们工作。我自己尝试了基于的实现(参见左侧菜单,gluProject和gluUnProject,以及FF中的视图,而不是Chrome)。看那些公式,我正试着匹配它们。我的函数根本不起作用,Project返回的点都在我屏幕的中心附近,而且非常接近,尽管我正在到处移动我的世界点 请注意,OpenTK的数学库不包含将矩阵乘以向量的函数,因此我只对结果向量中的每个条目进

我正在使用OpenTK进行C#中的一个游戏,它没有项目和非项目函数,它们在世界坐标和屏幕坐标之间进行转换。是的,但它们不受欢迎,我无法让它们工作。我自己尝试了基于的实现(参见左侧菜单,gluProject和gluUnProject,以及FF中的视图,而不是Chrome)。看那些公式,我正试着匹配它们。我的函数根本不起作用,Project返回的点都在我屏幕的中心附近,而且非常接近,尽管我正在到处移动我的世界点

请注意,OpenTK的数学库不包含将矩阵乘以向量的函数,因此我只对结果向量中的每个条目进行了矩阵行乘以向量点积(这是正确的,不是吗?)


我不完全确定,但至少您的
项目
函数中的矩阵乘法顺序可能是错误的。看看C代码,其中临时向量(
v_prime
在代码中)首先通过与modelview矩阵相乘来计算,然后再将结果与投影矩阵相乘


另一个寻找
gluProject
/
glunproject
实现的好来源是。

我找到了它-我的矩阵需要进行转置。不知道为什么,但是OpenTK函数返回的模型矩阵与本机调用不同。

OpenTK确实有一个内置的矩阵乘以向量函数。参见Vector4.变换(参考向量、参考矩阵、输出结果)。它将矩阵mat应用(乘以)向量vec,并将答案存储在结果中。
    public static Vector3d Project(Vector4d point, Matrix4d projection, Matrix4d modelview, int[] view)
    {
        Matrix4d temp = Matrix4d.Mult(projection, modelview);
        // multiply matrix by vector
        Vector4d v_prime = new Vector4d(
            Vector4d.Dot(temp.Row0, point),
            Vector4d.Dot(temp.Row1, point),
            Vector4d.Dot(temp.Row2, point),
            Vector4d.Dot(temp.Row3, point)
            );

        v_prime = Vector4d.Divide(v_prime, v_prime.W);

        return new Vector3d(
            view[0] + view[2] * (v_prime.X + 1) / 2,
            view[1] + view[3] * (v_prime.Y + 1) / 2,
            (v_prime.Z + 1) / 2
            );
    }

    public static Vector3d UnProject(Vector3d window, Matrix4d modelview, Matrix4d projection, int[] view)
    {
        Matrix4d inv = Matrix4d.Mult(projection, modelview);
        inv.Invert();

        double vx = (2 * (window.X - view[0])) / view[2] - 1;
        double vy = (2 * (window.Y - view[1])) / view[3] - 1;
        double vz = (2 * window.Z) - 1;

        Vector4d vect = new Vector4d(vx, vy, vz, 1);

        // now multiply matrix times vector, which is really row (dot) vector for each value
        // correct, the bottom row of the inv matrix is unused
        return new Vector3d(
            Vector4d.Dot(inv.Row0, vect),
            Vector4d.Dot(inv.Row1, vect),
            Vector4d.Dot(inv.Row2, vect)
            );
    }