OpenGL Fitting Viewer to Object(用 VB .NET 编写,但 C# 答案也可以)
OpenGL Fitting Viewer to Object (written in VB .NET but C# answers will work too)
背景
我正在尝试制作一个非常简单的 CAD 查看器。我选择从 .STL 文件开始,对于那些不知道的人来说,这些文件只是一堆三角形,然后将形成屏幕上的部分。从大多数CAD软件输出时,如果是STL,可以输出为文本文件版本。这列出了所有要点:
solid
facet normal -7.8662990E-02 +8.3699658E-01 -5.4152455E-01
outer loop
vertex +3.3529416E+03 -3.7456115E+02 +8.5293264E+02
vertex +3.3530518E+03 -3.7467327E+02 +8.5274334E+02
vertex +3.3527449E+03 -3.7467680E+02 +8.5278246E+02
endloop
endfacet
facet normal -1.7741169E-02 +8.8266388E-01 -4.6966979E-01
outer loop
vertex +3.3527449E+03 -3.7467680E+02 +8.5278246E+02
vertex +3.3522178E+03 -3.7464933E+02 +8.5285399E+02
vertex +3.3524442E+03 -3.7463108E+02 +8.5287975E+02
endloop
endfacet
等等..然后我基本上可以遍历所有点并创建三角形:
Dim i As Integer = 0
Do Until i + 2 >= ListView1.Items.Count
Gl.glPushMatrix()
Gl.glBegin(Gl.GL_TRIANGLES)
Gl.glColor3f(1.0, 0.0, 0.0)
Gl.glVertex3f(Convert.ToSingle(ListView1.Items.Item(i).SubItems(0).Text), Convert.ToSingle(ListView1.Items.Item(i).SubItems(1).Text), Convert.ToSingle(ListView1.Items.Item(i).SubItems(2).Text))
Gl.glColor3f(1.0, 0.0, 0.0)
Gl.glVertex3f(Convert.ToSingle(ListView1.Items.Item(i + 1).SubItems(0).Text), Convert.ToSingle(ListView1.Items.Item(i + 1).SubItems(1).Text), Convert.ToSingle(ListView1.Items.Item(i + 1).SubItems(2).Text))
Gl.glColor3f(1.0, 0.0, 0.0)
Gl.glVertex3f(Convert.ToSingle(ListView1.Items.Item(i + 2).SubItems(0).Text), Convert.ToSingle(ListView1.Items.Item(i + 1).SubItems(1).Text), Convert.ToSingle(ListView1.Items.Item(i + 2).SubItems(2).Text))
Gl.glEnd()
Gl.glPopMatrix()
i = i + 3
Loop
问题
当我手动放入我的三角形时,我的方法似乎有效,但是当我按照上面所示的那样做时,我找不到它们在哪里。我相信这是两个原因之一。要么我的世界对于指定的位置来说不够大,因为有些位置在(X=3352,Y=-374,Z=852)的范围内,当我开始查看时(X=0,Y=0,Z= 0),
如果这可能是问题所在,我怎么知道或改变我的世界的大小?
到目前为止,这是我用来设置我的世界的内容:
GLCtrl.InitializeContexts()
Gl.glClearColor(0, 0, 0, 0)
Gl.glMatrixMode(Gl.GL_PROJECTION)
Gl.glLoadIdentity()
Gl.glOrtho(-1, 1, -1, 1, -1, 1)
Gl.glMatrixMode(Gl.GL_MODELVIEW)
Gl.glLoadIdentity()
GLCtrl.Focus()
'start the gameloop
gameLoop()
如果这似乎不是问题所在,那么可能是我没有正确定位三角形?我目前使用翻译去找他们:
Gl.glTranslatef(view_location.x, view_location.y, view_location.z)
我使用的坐标接近我上面列出的坐标,并尝试缩放和平移但仍然找不到任何东西。
我会实际回答我自己的问题。答案很简单,Gl.glTranslatef 与我的想法相反。解决方案是:
Gl.glTranslatef(-view_location.x, -view_location.y, -view_location.z)
背景
我正在尝试制作一个非常简单的 CAD 查看器。我选择从 .STL 文件开始,对于那些不知道的人来说,这些文件只是一堆三角形,然后将形成屏幕上的部分。从大多数CAD软件输出时,如果是STL,可以输出为文本文件版本。这列出了所有要点:
solid
facet normal -7.8662990E-02 +8.3699658E-01 -5.4152455E-01
outer loop
vertex +3.3529416E+03 -3.7456115E+02 +8.5293264E+02
vertex +3.3530518E+03 -3.7467327E+02 +8.5274334E+02
vertex +3.3527449E+03 -3.7467680E+02 +8.5278246E+02
endloop
endfacet
facet normal -1.7741169E-02 +8.8266388E-01 -4.6966979E-01
outer loop
vertex +3.3527449E+03 -3.7467680E+02 +8.5278246E+02
vertex +3.3522178E+03 -3.7464933E+02 +8.5285399E+02
vertex +3.3524442E+03 -3.7463108E+02 +8.5287975E+02
endloop
endfacet
等等..然后我基本上可以遍历所有点并创建三角形:
Dim i As Integer = 0
Do Until i + 2 >= ListView1.Items.Count
Gl.glPushMatrix()
Gl.glBegin(Gl.GL_TRIANGLES)
Gl.glColor3f(1.0, 0.0, 0.0)
Gl.glVertex3f(Convert.ToSingle(ListView1.Items.Item(i).SubItems(0).Text), Convert.ToSingle(ListView1.Items.Item(i).SubItems(1).Text), Convert.ToSingle(ListView1.Items.Item(i).SubItems(2).Text))
Gl.glColor3f(1.0, 0.0, 0.0)
Gl.glVertex3f(Convert.ToSingle(ListView1.Items.Item(i + 1).SubItems(0).Text), Convert.ToSingle(ListView1.Items.Item(i + 1).SubItems(1).Text), Convert.ToSingle(ListView1.Items.Item(i + 1).SubItems(2).Text))
Gl.glColor3f(1.0, 0.0, 0.0)
Gl.glVertex3f(Convert.ToSingle(ListView1.Items.Item(i + 2).SubItems(0).Text), Convert.ToSingle(ListView1.Items.Item(i + 1).SubItems(1).Text), Convert.ToSingle(ListView1.Items.Item(i + 2).SubItems(2).Text))
Gl.glEnd()
Gl.glPopMatrix()
i = i + 3
Loop
问题
当我手动放入我的三角形时,我的方法似乎有效,但是当我按照上面所示的那样做时,我找不到它们在哪里。我相信这是两个原因之一。要么我的世界对于指定的位置来说不够大,因为有些位置在(X=3352,Y=-374,Z=852)的范围内,当我开始查看时(X=0,Y=0,Z= 0),
如果这可能是问题所在,我怎么知道或改变我的世界的大小?
到目前为止,这是我用来设置我的世界的内容:
GLCtrl.InitializeContexts()
Gl.glClearColor(0, 0, 0, 0)
Gl.glMatrixMode(Gl.GL_PROJECTION)
Gl.glLoadIdentity()
Gl.glOrtho(-1, 1, -1, 1, -1, 1)
Gl.glMatrixMode(Gl.GL_MODELVIEW)
Gl.glLoadIdentity()
GLCtrl.Focus()
'start the gameloop
gameLoop()
如果这似乎不是问题所在,那么可能是我没有正确定位三角形?我目前使用翻译去找他们:
Gl.glTranslatef(view_location.x, view_location.y, view_location.z)
我使用的坐标接近我上面列出的坐标,并尝试缩放和平移但仍然找不到任何东西。
我会实际回答我自己的问题。答案很简单,Gl.glTranslatef 与我的想法相反。解决方案是:
Gl.glTranslatef(-view_location.x, -view_location.y, -view_location.z)