C#如何从Tao库中获取OpenGL中生成的对象的大小

Posted

技术标签:

【中文标题】C#如何从Tao库中获取OpenGL中生成的对象的大小【英文标题】:C# How to get the size of an object generated in OpenGL from Tao library 【发布时间】:2019-09-13 00:05:15 【问题描述】:

我正在构建一个应用程序,它可以使用 TAO.FreeGlut 和 TAO.OpenGL 引用在 SimpleOpenGlControl 中显示 STL 文件的 3D 视图。我需要为某些功能获取显示的 3D 模型的大小,但找不到。如何获取显示对象的大小?

我在这里找到了一个可以显示STL文件的基础项目https://github.com/batu92k/STL-Viewer

但它几乎没有什么解释,而且 cmets 在土耳其语中......

我也在这里找到了一些信息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();
  

【问题讨论】:

“对象的大小”是什么意思?你的意思是轴对齐的边界框吗?在视野空间?在世界上?窗口坐标? 如果我们想出一个包含对象的盒子,我需要盒子的宽度、高度和深度 我明白了,但是您需要世界空间中的宽度高度和深度还是从相机中看到的?或者你想知道窗口坐标(像素)中的 with 和 height 吗? 它在世界空间中占用的空间,但以后也可能会使用窗口坐标,但主要是在世界空间中 在这种情况下,我不明白你的问题。您只需找到modelVAO.parameterArray 中所有顶点的最小和最大 x、y 和 z 坐标。这可以在一个循环中完成。 【参考方案1】:
    private void timer1_Tick(object sender, EventArgs e)
    

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

【讨论】:

欢迎来到 SO,tnx 贡献力量。但是,请添加一些解释。指出:为什么给定的代码是 Q 的解决方案。在最好的情况下,读者非常简短地扫描 Q,并阅读您的 A,并且应该能够理解整个情况。

以上是关于C#如何从Tao库中获取OpenGL中生成的对象的大小的主要内容,如果未能解决你的问题,请参考以下文章

为啥在 C# 中生成的代码使用下划线? [关闭]

如何计算聚合中生成的分组对象?

如何在 Excel 中生成的 SQL 插入语句中获取行数?

如何在 KMM(kotlin 本机)共享模块中读取 Swift 框架库中生成的对象数组

尝试使用 COM-interop 从 C# 库中附加 vb6 中的对象时,获取“无法将 'Field' 转换为 'Field' 类型(同一类)”

如何在 1D 缓冲区中生成 2D 纹理并将其加载到 OpenGL 中?