Winforms SharpGL-使用网格绘制球体,并为每个球体添加颜色

Winforms SharpGL-使用网格绘制球体,并为每个球体添加颜色,winforms,opengl,rotation,sharpgl,Winforms,Opengl,Rotation,Sharpgl,我正在SharpGL(Visual Studio 2013的扩展,我们可以在其中使用OpenGL库)中创建三维可视化。我想想象一下四面体。它需要从多个点创建-应用程序开始时的用户定义向量的总和。我有一个字典,上面有每个顶点的坐标,我在这两个类中计算: public class Matrix4 { private List<Tuple<int, int, int, int>> set = new List<Tuple<int, int, int, int

我正在SharpGL(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; }
    }
}
不幸的是,它不工作,我在屏幕上看不到任何东西。如有任何建议,将不胜感激。创建每个点/球体后,我需要旋转它们,并根据我将在其他类中计算的度量值附加到每个不同的颜色(但这是下一步,首先我要显示这些点/球体并旋转它们)

我对OpenGl完全陌生,这就是为什么我要寻找任何样本

链接到整个项目并筛选我想要获得的内容:

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

glOrtho()
具有此签名
glOrtho(左、右、下、上、近、远)
其中左、右是x坐标的最大范围,下、上是y坐标的最大范围,近、远是z坐标的最大范围+y向上,我们从+z向-z看

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

没有显示的最可能原因是您的坐标超出此范围

我建议最好的开始方法是先做一个简单的例子。例如,使用glOrtho(-1,1,-1,1,-1,1)并使用手动输入的坐标绘制一些三维线。一旦这是工作,你可以实验与其他预测和休息应该很容易


如果您使用谷歌搜索,那么在开始之前必须先了解一些关于openGL坐标系和投影的好教程。如果你需要进一步的帮助,请告诉我

我的建议是创建一种方法(最好是以某种方式通用化),以转储有关对象、场景和网格的某种签名数据。转储三维对象的边界框、投影参数、视口等


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

此代码与渲染无关,现在可以通过一些调试输出了解正在进行的操作。在GL ES systems Glorth上,这样做不起作用。从技术上讲,所有固定功能都被认为是不受欢迎的。您没有提到的Dok是一个嵌入式系统(或者我可能没有注意到!)。不过,我同意Swift-Friday Pie的观点,我的建议是返回一步,制作一组非常简单的手工编码坐标(立方体或三角形),这样就可以很容易地将其纳入您更复杂的坐标生成和存储系统中。@b珀斯哦,对不起,为了澄清,我添加了这一点。OP使用SharpGL,这是C#的现代端口。如果其性质类似于ES,或者至少面向现代系统和移动\嵌入式系统。我没有用C#写任何使用OpenGL的东西,只是我的两点想法。你有什么有用的样本或文章吗?我已经用project的链接更新了我的帖子。我大体上理解你的意思,但由于我是OpenGl新手,我不知道从哪里开始-我应该使用什么样的函数。@blackRose与OpenGl相关的主要中心也是gamedev,如果你在github中搜索OpenGl和sharpgl,你会发现一些例子。注意,如果你想处理3d图形,不管你使用哪种API,你必须了解线性代数。函数的确切使用取决于您使用的配置文件模式和平台。大多数旧示例在使用glRotate、GLTRANSTATE、glScale等时使用固定函数管道。在现代api中,为了程序员具有低级别控制的能力,这些都被抛弃了。
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; }
        }
    }
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);
        }