2

我正在 SharpGL 中创建 3d 可视化(Visual Studio 2013 的扩展,我们可以在其中使用 OpenGL 库)。我想可视化四面体。它需要从多个点创建 - 用户在应用程序开始时定义向量的总和。我有一个字典,其中包含每个顶点的坐标,我在这两个类中计算:

public class Matrix4
{
    private List<Tuple<int, int, int, int>> set = new List<Tuple<int, int, int, int>>();

    public Matrix4()
    {

    }

    public Matrix4(int vectorSum)
    {
        set = GiveMatrix4(vectorSum);
    }  

    public List<Tuple<int, int, int, int>> GiveMatrix4(int vectorSum)
    {
        List<Tuple<int, int, int, int>> set1 = new List<Tuple<int, int, int, int>>();

        for (int i = 0; i <= vectorSum; i++)
        {
            for (int j = 0; j <= vectorSum; j++)
            {
                for (int k = 0; k <= vectorSum; k++)
                {
                    for (int l = 0; l <= vectorSum; l++)
                    {
                        Tuple<int, int, int, int> vector = new Tuple<int, int, int, int>(i, j, k, l);

                        if (AddValuesFromVector4(vector) == vectorSum)
                        {
                            set1.Add(vector);
                            continue;
                        }
                    }
                }
            }
        }

        return set1;
    }

    public int AddValuesFromVector4(Tuple<int,int,int,int> vector)
    {
        int sum = 0;

        sum = vector.Item1 + vector.Item2 + vector.Item3 + vector.Item4;

        return sum;
    }


    public List<Tuple<int, int, int, int>> Matrix4Set
    {
        get { return set; }
    }
}

Matrix3 类切割一维,我有 3 个坐标的向量:

public class Matrix3
    {
        private Matrix4 matrix4;
        private Dictionary<Tuple<int, int, int, int>, Tuple<int, int, int>> pairs = new Dictionary<Tuple<int, int, int, int>, Tuple<int, int, int>>();
        private int vectorSum;

        public Matrix3()
        {

        }

        public Matrix3(int vectorSum)
        {
            this.vectorSum = vectorSum;
            matrix4 = new Matrix4(vectorSum);
            pairs = CreateMatrix3(matrix4.Matrix4Set);
        }

        public int VectorSum
        {
            get { return vectorSum; }
        }

        public Dictionary<Tuple<int, int, int, int>, Tuple<int, int, int>> CreateMatrix3(List<Tuple<int, int, int, int>> set)
        {
            Tuple<int, int, int> vector;
            Dictionary<Tuple<int, int, int, int>, Tuple<int, int, int>> pair = new Dictionary<Tuple<int, int, int, int>, Tuple<int, int, int>>();

            foreach (var item in set)
            {
                vector = new Tuple<int, int, int>(item.Item1 - item.Item2 - item.Item3 + item.Item4, item.Item1 + item.Item2 - item.Item3 - item.Item4, item.Item1 - item.Item2 + item.Item3 - item.Item4);
                pair.Add(item, vector);
            }

            return pair;
        }

        public int Sum(Tuple<int, int, int> vector)
        {
            int suma = 0;

            suma = (int)(vector.Item1 + vector.Item2 + vector.Item3);

            return suma;
        }

        public Dictionary<Tuple<int, int, int, int>, Tuple<int, int, int>> Pairs
        {
            get { return pairs; }
        }

        public Matrix4 Matrix4
        {
            get { return matrix4; }
        }
    }

之后,我想从我的字典中创建点/球体,我将其保存在 Matrix3 类中:

gl.Begin(OpenGL.GL_POINTS);

        gl.PointSize(10.0f);
        foreach (var item in matrix3.Pairs.Values)
        {               
            gl.Vertex((float)item.Item1, (float)item.Item2, (float)item.Item3);
        }

不幸的是,它不起作用,我在屏幕上看不到任何东西。任何建议将不胜感激。在创建每个点/球体后,我需要旋转它们并根据我将在其他类中计算的度量附加到每个不同的颜色(但这是下一步,首先我想显示这些点/球体并旋转它们) .

我对 OpenGl 完全陌生,这就是我寻找任何样本的原因。

链接到整个项目并筛选我想要获得的内容: https ://drive.google.com/file/d/1IDwl46rdRa9IYxq7w8ZkF4LCeAsUH0mU/view?usp=sharing

4

2 回答 2

2

我的建议是创建一种方法(如果能以某种方式概括更好)来转储有关您的对象、场景、网格的某种签名数据。转储 3d 对象的边界框、投影参数、视口等。

屏幕上没有图像意味着其中一些不匹配,包括坐标系中的轴顺序可能与生成的网格的每个三角形\四边形\多边形中的顶点顺序不匹配,或者深度测试功能错误。如果启用面剔除,则本应背向投影位置的面将不可见。如果深度测试开启但投影方向错误,则什么都看不到。显然,如果对象被投影到当前视口边界之外,它将不可见。

于 2018-09-27T06:00:44.080 回答
0

对于任何 openGL 程序,您都需要使用glOrtho()或指定投影方法glFrustrum()。然后你必须确保你的显示坐标在定义的 3D“盒子”的范围内。

glOrtho()有这个签名glOrtho(left, right, bottom, top, near, far),其中 left,right 是 x 坐标的最大范围,bottom,top 是 y 坐标的最大范围,near,far 是 z 坐标的最大范围。+y 向上,我们从 +z 到 -z。

如果您不这样做,那么 openGL 将假定您的意思是 glOrtho(-1,1,-1,1,-1,1),这意味着所有坐标必须适合以原点为中心的 1x1x1 立方体。

不显示的最可能原因是您的坐标超出了此范围。

我建议最好的开始方法是首先做一个简单的例子。例如使用 glOrtho(-1,1,-1,1,-1,1) 并使用手动输入的坐标绘制一些 3D 线。一旦它起作用,您就可以尝试其他预测,其余的应该很容易。

如果您使用 Google 搜索,有几个关于 openGL 坐标系和投影的很好的教程,在您开始之前必须了解这些教程。如果您需要进一步的帮助,请告诉我。

于 2018-09-27T00:03:30.447 回答