簡體   English   中英

C#如何從Tao庫中獲取OpenGL中生成的對象的大小

[英]C# How to get the size of an object generated in OpenGL from Tao library

我正在構建一個應用程序,它可以使用 TAO.FreeGlut 和 TAO.OpenGL 引用在 SimpleOpenGlControl 中顯示 STL 文件的 3D 視圖。 我需要獲取某些功能的顯示 3D 模型的大小,但找不到。 如何獲取顯示對象的大小?

我在這里找到了一個可以顯示 STL 文件的基本項目https://github.com/batu92k/STL-Viewer

但它幾乎沒有解釋,評論是在土耳其語中...

我也在這里找到了一些信息https://www.codeproject.com/Articles/23778/OpenGL-3D-Navigation2-With-Tao-and-C-Tao-OpenGL-Ta

但同樣,沒有太多關於大小的解釋。

OpenGL監視器代碼:

  Batu_GL glController;
  Batu_GL.VAO_TRIANGLES modelVAO;
  BaseConfig baseConfig = new BaseConfig();

  int scale = 30;
  int rotationZ = 0;

  public OpenGLMonitor()
  {
     /* dot/comma selection for floating point numbers */
     Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
     Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-US");

     InitializeComponent();

     glController = new Batu_GL();
     glController.initialize(monitor);
     glController.glInit(monitor, Batu_GL.Ortho_Mode.CENTER);
     rotationZ = baseConfig.rotationZ;
  }

  public void Draw()
  {
     glController.glDinamik(monitor, Batu_GL.Ortho_Mode.CENTER);
     //--------------------------------------------
     Gl.glEnable(Gl.GL_LIGHTING);  // Activer l'éclairage
     Gl.glEnable(Gl.GL_LIGHT1);
     //--------------------------------------------
     //--Lumiere 1                               
     Gl.glLightfv(Gl.GL_LIGHT0, Gl.GL_AMBIENT_AND_DIFFUSE, baseConfig.light_1); // Le type et le nombre de feux sont déterminés"
     Gl.glLightfv(Gl.GL_LIGHT0, Gl.GL_SPECULAR, baseConfig.specular); // La réflexion est sélectionnée parmi les types d'éclairage. Le tableau spéculaire est utilisé pour déterminer les caractéristiques de la lumière de réflexion.
     Gl.glLightfv(Gl.GL_LIGHT0, Gl.GL_POSITION, baseConfig.lightPos); // La position de la lumière "0" provient du tableau "lightpos"
     Gl.glEnable(Gl.GL_LIGHT0); // La lumière "0" est activée
     //-------------------------------------------
     //--Lumiere 2
     Gl.glLightfv(Gl.GL_LIGHT1, Gl.GL_AMBIENT_AND_DIFFUSE, baseConfig.light_1);
     Gl.glLightfv(Gl.GL_LIGHT1, Gl.GL_SPECULAR, baseConfig.specular);
     Gl.glLightfv(Gl.GL_LIGHT1, Gl.GL_POSITION, baseConfig.lightPos2);
     Gl.glEnable(Gl.GL_LIGHT1);
     //-------------------------------------------
     Gl.glEnable(Gl.GL_COLOR_MATERIAL); // Activation du matériau de couleur de la pièce
     Gl.glColorMaterial(Gl.GL_FRONT, Gl.GL_AMBIENT_AND_DIFFUSE);
     Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_SPECULAR, baseConfig.specref);
     Gl.glMateriali(Gl.GL_FRONT, Gl.GL_SHININESS, 15); // Ajuster le niveau de luminosité (bonne réflexion de "1")
     Gl.glEnable(Gl.GL_NORMALIZE); // Adoucissement de la transmission de la lumière
     //-------------------------------------------

     Gl.glRotatef(baseConfig.rotationX, -1.0f, 0.0f, 0.0f);
     Gl.glRotatef(baseConfig.rotationZ, 0.0f, 0.0f, 1.0f);
     rotationZ++;

     rotationZ = rotationZ % 360;

     Gl.glTranslatef(0.0f, 0.0f, -150.0f);

     modelVAO.Draw();

     monitor.SwapBuffers();
  }

  private void fileSelectBt_Click(object sender, EventArgs e)
  {
     OpenFileDialog stldosyaSec = new OpenFileDialog();
     stldosyaSec.Filter = "STL Files|*.stl;*.txt;";
     scale = (int)(0.05 * monitor.Width);

     if (stldosyaSec.ShowDialog() == DialogResult.OK)
     {
        lblFilename.Text = stldosyaSec.SafeFileName;

        STLReader stlReader = new STLReader(stldosyaSec.FileName);
        TriangleMesh[] meshArray = stlReader.ReadFile();
        modelVAO = new Batu_GL.VAO_TRIANGLES();

        STLExport stlExporter = new STLExport();

        modelVAO.parameterArray = stlExporter.Get_Mesh_Vertices(meshArray);
        modelVAO.normalArray = stlExporter.Get_Mesh_Normals(meshArray);
        modelVAO.color = Color.AntiqueWhite;
        modelVAO.scale = new float[3] { scale, scale, scale };

        if (!stlReader.Get_Process_Error())
        {
           //rotationX = 0;
           drawTimer.Enabled = true;
           //fileSelectBt.BackColor = Color.DeepSkyBlue;
        }
        else
        {
           drawTimer.Enabled = false;
           //fileSelectBt.BackColor = Color.Tomato;

           /* if there is an error, deinitialize the gl monitor to clear the screen */
           glController.glInit(monitor, Batu_GL.Ortho_Mode.CENTER);
           monitor.SwapBuffers();
        }
     }
     else
     {
        // intentionally left blank
     }
  }

  private void drawTimer_Tick(object sender, EventArgs e)
  {
     Draw();
  }

} }

    private void timer1_Tick(object sender, EventArgs e)
    {

        label1.Text = minPos.x + "";
        label2.Text = minPos.y + "";
        label3.Text = minPos.z + "";
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM