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中生成的对象的大小的主要内容,如果未能解决你的问题,请参考以下文章
如何在 KMM(kotlin 本机)共享模块中读取 Swift 框架库中生成的对象数组
尝试使用 COM-interop 从 C# 库中附加 vb6 中的对象时,获取“无法将 'Field' 转换为 'Field' 类型(同一类)”