2

SharpGL (OpenGL ライブラリを使用できる Visual Studio 2013 の拡張機能) で 3D ビジュアライゼーションを作成しています。四面体を可視化したい。多くのポイントから作成する必要があります。アプリケーションの開始時にユーザーがベクトルの合計を定義します。各頂点の座標を含む辞書があり、これらの 2 つのクラスで計算します。

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 は 1 次元をカットし、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

0

どの openGL プログラムでも、たとえば、glOrtho()またはを使用して投影法を指定する必要があります。glFrustrum()次に、表示用の座標が、定義された 3D「ボックス」の境界内にあることを確認する必要があります。

glOrtho()glOrtho(left, right, bottom, top, near, far)は、左、右が x 座標の最大範囲、下、上が y 座標の最大範囲、近く、遠方が 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 に答える