Autor Wątek: krótki kod c++ na c#  (Przeczytany 1271 razy)

Offline Darck

  • Użytkownik

# Lipiec 22, 2009, 15:01:42
ze strony nehe chciałem wykorzystać kod do przekształcania współrzędnych kliknięcia na Opengl. Oryginalny kod wygląda tak:

CVector3 GetOGLPos(int x, int y)
{
GLint viewport[4];
GLdouble modelview[16];
GLdouble projection[16];
GLfloat winX, winY, winZ;
GLdouble posX, posY, posZ;

glGetDoublev( GL_MODELVIEW_MATRIX, modelview );
glGetDoublev( GL_PROJECTION_MATRIX, projection );
glGetIntegerv( GL_VIEWPORT, viewport );

winX = (float)x;
winY = (float)viewport[3] - (float)y;
glReadPixels( x, int(winY), 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &winZ );

gluUnProject( winX, winY, winZ, modelview, projection, viewport, &posX, &posY, &posZ);

return CVector3(posX, posY, posZ);
}

a wykonana konwersja, niestety nie wiem czy porpawnie, bo C# "ucze sie" dopiero 3 tydzien wyglada tak:

        public double[] UnProject(double X, double Y)
        {

            double winx, winy;// winZ;
            float[] winz = {0};
            PreErrorCheck();
            // THIS CODE MUST BE TESTED
            double[] modelview = new double[16];
            double[] projection = new double[16];
            int[] viewport = new int[4];
            GetDouble(MODELVIEW_MATRIX, modelview);
            GetDouble(PROJECTION_MATRIX, projection);
            GetInteger(VIEWPORT, viewport);
            double[] x = new double[1]; // kludgy
            double[] y = new double[1];
            double[] z = new double[1];
            winx = (float)X;
            winy = (float)viewport[3] - (float)Y;
            ReadPixels((int)X, (int)winy, 1, 1, DEPTH_COMPONENT, FLOAT, winz);
            gluUnProject(winx, winy, (double)winz[0], modelview, projection, viewport, x, y, z);

            ErrorCheck();
            return new double[] { x[0], y[0], z[0] };
        }

niestety chyba nie działa. nie jestem pewien czy ReadPixels zwraca coś sensownego w winz. Proszę o zerknięcie kogoś lepiej obeznanego z C#

poniżej prototypy funkcji:

      [DllImport(LIBRARY_GLU)] protected static extern void gluUnProject (double       winx, double       winy, double       winz,  double[] modelMatrix,  double[] projMatrix,  int[] viewport, double [] objx, double       []objy, double       []objz);

      public void ReadPixels(int x, int y, int width, int height, uint format, uint type, float[] pixels){}

kod się kompiluje, ale winz[0] zawsze == 0...

-----
nie widze przycisku usuń, ale jakby ktoś jeszcze miał ten problem (biblioteka SharpGL), to trzeba użyć glReadPixels a nie ReadPixels i działa.
« Ostatnia zmiana: Lipiec 22, 2009, 15:48:24 wysłana przez Darck »

Offline Mr. Spam

  • Miłośnik przetworów mięsnych