コード例 #1
0
ファイル: Game1.cs プロジェクト: hitoyozake/MKin
        public void Loop( BodyParts [] parts, PoseEvaluater ev )
        {
            const int MIN = 0;
            const int MAX = 1;

            //�l�̃Z�b�g
            float[] middles = null;
            float[][] parameters = null;
            float[] minValues = null;

            int dimention = 6;
            float allowedRange = 14f;

            parameters = new float[ dimention ][];
            middles = new float[ dimention ];
            minValues = new float[ dimention ];
            float [] parameterSlot = new float[ dimention ];

            for( int i = 0; i < parameters.Length; ++i )
            {
                parameters[ i ] = new float[ 2 ];
            }

            parameters[ 0 ][ 0 ] = parts[ 0 ].angle.X - allowedRange;
            parameters[ 0 ][ 1 ] = parts[ 0 ].angle.X + allowedRange;
            parameters[ 1 ][ 0 ] = parts[ 0 ].angle.Y - allowedRange;
            parameters[ 1 ][ 1 ] = parts[ 0 ].angle.Y + allowedRange;
            parameters[ 2 ][ 0 ] = parts[ 0 ].angle.Z - allowedRange;
            parameters[ 2 ][ 1 ] = parts[ 0 ].angle.Z + allowedRange;
            parameters[ 3 ][ 0 ] = parts[ 1 ].angle.X - allowedRange;
            parameters[ 3 ][ 1 ] = parts[ 1 ].angle.X + allowedRange;
            parameters[ 4 ][ 0 ] = parts[ 1 ].angle.Y - allowedRange;
            parameters[ 4 ][ 1 ] = parts[ 1 ].angle.Y + allowedRange;
            parameters[ 5 ][ 0 ] = parts[ 1 ].angle.Z - allowedRange;
            parameters[ 5 ][ 1 ] = parts[ 1 ].angle.Z + allowedRange;

            float [] degrees = new float[ dimention ];

            float minValue = 1000f;
            int [] minIndex = new int[ 6 ];

            int challangeCount = 9;

            for( int counter = 0; counter < challangeCount; ++counter )
            {
                for (int i = 0; i < parameters[0].Length; i++)
                {
                    for (int j = 0; j < parameters[1].Length; j++)
                    {
                        for (int k = 0; k < parameters[2].Length; k++)
                        {
                            for (int l = 0; l < parameters[3].Length; l++)
               	            {
                                for (int m = 0; m < parameters[4].Length; m++)
               	                {
                                    for(int n = 0; n < parameters[5].Length; n++)
               	                    {
                                        //�l��Z�b�g
                                        parts[ 0 ].angle.X = parameters[ 0 ][ i ];
                                        parts[ 0 ].angle.Y = parameters[ 1 ][ j ];
                                        parts[ 0 ].angle.Z = parameters[ 2 ][ k ];
                                        parts[ 1 ].angle.X = parameters[ 3 ][ l ];
                                        parts[ 1 ].angle.Y = parameters[ 4 ][ m ];
                                        parts[ 1 ].angle.Z = parameters[ 5 ][ n ];

                                        GraphicsDevice.Clear( XNABackColor );

                                        captureDevice.BeginCapture( GraphicsDevice );

                                        parts[ 0 ].Update();
                                        parts[ 1 ].Update();

                                        parts[ 0 ].Draw( models );
                                        parts[ 1 ].Draw( models );

                                        captureDevice.Capture( tmpTexture );

                                        var evalresult = poseEvaluater.evaluate( tmpTexture, TeacherTex );

                                        //SaveAsPng( tmpTexture, "loopTmpTex.png" );
                                        //SaveAsPng( TeacherTex, "loopTeacher.png" );

                                        if( evalresult < minValue )
                                        {
                                            minValue = evalresult;

                                            minIndex[ 0 ] = i;
                                            minIndex[ 1 ] = j;
                                            minIndex[ 2 ] = k;
                                            minIndex[ 3 ] = l;
                                            minIndex[ 4 ] = m;
                                            minIndex[ 5 ] = n;
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
                //�ŏ���index��o�����̂ł����ŃZ�b�g
                for( int i = 0; i < 6; ++i )
                {
                    var tmpMin = Math.Min( parameters[ i ][ minIndex[ i ] ], middles[ i ] );
                    var tmpMax = Math.Max( parameters[ i ][ minIndex[ i ] ], middles[ i ] );

                    parameters[ i ][ MIN ] = tmpMin;
                    parameters[ i ][ MAX ] = tmpMax;

                    middles[ i ] = ( tmpMax + tmpMin ) / 2f;
                }
                minValue = 1000f;//���Z�b�g
            }

            Draw2D( TeacherTex, Color.CadetBlue );

            parts[ 0 ].angle.X = parameters[ 0 ][ minIndex[ 0 ] ];
            parts[ 0 ].angle.Y = parameters[ 1 ][ minIndex[ 1 ] ];
            parts[ 0 ].angle.Z = parameters[ 2 ][ minIndex[ 2 ] ];
            parts[ 1 ].angle.X = parameters[ 3 ][ minIndex[ 3 ] ];
            parts[ 1 ].angle.Y = parameters[ 4 ][ minIndex[ 4 ] ];
            parts[ 1 ].angle.Z = parameters[ 5 ][ minIndex[ 5 ] ];

            logFiles.OutputPose( parts );
        }
コード例 #2
0
ファイル: Game1.cs プロジェクト: hitoyozake/MKin
        public void Loop(BodyParts [] parts, PoseEvaluater ev)
        {
            const int MIN = 0;
            const int MAX = 1;

            //値のセット
            float[]   middles    = null;
            float[][] parameters = null;
            float[]   minValues  = null;

            int   dimention    = 6;
            float allowedRange = 14f;

            parameters = new float[dimention][];
            middles    = new float[dimention];
            minValues  = new float[dimention];
            float [] parameterSlot = new float[dimention];

            for (int i = 0; i < parameters.Length; ++i)
            {
                parameters[i] = new float[2];
            }

            parameters[0][0] = parts[0].angle.X - allowedRange;
            parameters[0][1] = parts[0].angle.X + allowedRange;
            parameters[1][0] = parts[0].angle.Y - allowedRange;
            parameters[1][1] = parts[0].angle.Y + allowedRange;
            parameters[2][0] = parts[0].angle.Z - allowedRange;
            parameters[2][1] = parts[0].angle.Z + allowedRange;
            parameters[3][0] = parts[1].angle.X - allowedRange;
            parameters[3][1] = parts[1].angle.X + allowedRange;
            parameters[4][0] = parts[1].angle.Y - allowedRange;
            parameters[4][1] = parts[1].angle.Y + allowedRange;
            parameters[5][0] = parts[1].angle.Z - allowedRange;
            parameters[5][1] = parts[1].angle.Z + allowedRange;

            float [] degrees = new float[dimention];

            float minValue = 1000f;

            int [] minIndex = new int[6];

            int challangeCount = 9;

            for (int counter = 0; counter < challangeCount; ++counter)
            {
                for (int i = 0; i < parameters[0].Length; i++)
                {
                    for (int j = 0; j < parameters[1].Length; j++)
                    {
                        for (int k = 0; k < parameters[2].Length; k++)
                        {
                            for (int l = 0; l < parameters[3].Length; l++)
                            {
                                for (int m = 0; m < parameters[4].Length; m++)
                                {
                                    for (int n = 0; n < parameters[5].Length; n++)
                                    {
                                        //値をセット
                                        parts[0].angle.X = parameters[0][i];
                                        parts[0].angle.Y = parameters[1][j];
                                        parts[0].angle.Z = parameters[2][k];
                                        parts[1].angle.X = parameters[3][l];
                                        parts[1].angle.Y = parameters[4][m];
                                        parts[1].angle.Z = parameters[5][n];

                                        GraphicsDevice.Clear(XNABackColor);

                                        captureDevice.BeginCapture(GraphicsDevice);

                                        parts[0].Update();
                                        parts[1].Update();

                                        parts[0].Draw(models);
                                        parts[1].Draw(models);

                                        captureDevice.Capture(tmpTexture);

                                        var evalresult = poseEvaluater.evaluate(tmpTexture, TeacherTex);

                                        //SaveAsPng( tmpTexture, "loopTmpTex.png" );
                                        //SaveAsPng( TeacherTex, "loopTeacher.png" );

                                        if (evalresult < minValue)
                                        {
                                            minValue = evalresult;

                                            minIndex[0] = i;
                                            minIndex[1] = j;
                                            minIndex[2] = k;
                                            minIndex[3] = l;
                                            minIndex[4] = m;
                                            minIndex[5] = n;
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
                //最小のindexを覚えたのでここでセット
                for (int i = 0; i < 6; ++i)
                {
                    var tmpMin = Math.Min(parameters[i][minIndex[i]], middles[i]);
                    var tmpMax = Math.Max(parameters[i][minIndex[i]], middles[i]);

                    parameters[i][MIN] = tmpMin;
                    parameters[i][MAX] = tmpMax;

                    middles[i] = (tmpMax + tmpMin) / 2f;
                }
                minValue = 1000f;//リセット
            }

            Draw2D(TeacherTex, Color.CadetBlue);

            parts[0].angle.X = parameters[0][minIndex[0]];
            parts[0].angle.Y = parameters[1][minIndex[1]];
            parts[0].angle.Z = parameters[2][minIndex[2]];
            parts[1].angle.X = parameters[3][minIndex[3]];
            parts[1].angle.Y = parameters[4][minIndex[4]];
            parts[1].angle.Z = parameters[5][minIndex[5]];

            logFiles.OutputPose(parts);
        }