开放式TK确定球体(四边形)法线?

时间:2016-10-11 20:16:38

标签: vb.net opengl vector opentk

简介

我对使用Open GL / Open TK有些新意。我学会了如何绘制基本形状,使用矩阵,光照,阴影等。我有一个绘制球体的函数:

Private Sub drawSphere(r As Double, lats As Integer, longs As Integer)
    Dim i As Integer, j As Integer
    For i = 0 To lats
        Dim lat0 As Double = PI * (-0.5 + CDbl(i - 1) / lats)
        Dim z0 As Double = Sin(lat0)
        Dim zr0 As Double = Cos(lat0)

        Dim lat1 As Double = PI * (-0.5 + CDbl(i) / lats)
        Dim z1 As Double = Sin(lat1)
        Dim zr1 As Double = Cos(lat1)

        GL.Begin(PrimitiveType.QuadStrip)
        For j = 0 To longs
            Dim lng As Double = 2 * PI * CDbl(j - 1) / longs
            Dim x As Double = Cos(lng)
            Dim y As Double = Sin(lng)

            GL.Normal3(x * zr0 * r, y * zr0 * r, z0 * r)
            GL.Vertex3(x * zr0 * r, y * zr0 * r, z0 * r)
            GL.Normal3(x * zr1 * r, y * zr1 * r, z1 * r)
            GL.Vertex3(x * zr1 * r, y * zr1 * r, z1 * r)
        Next
        GL.End()
    Next
End Sub

我有其他设置灯光的代码。我知道其他代码有效,因为我有一个单独的函数来绘制STL对象:

 Dim texture As UInteger() = New UInteger(0) {}
    Dim i As Integer = 0
    If stl_table.Items.Count > 0 Then
        find_center_of_part()



        GL.Begin(PrimitiveType.Triangles)
        GL.Color3(part_color.R, part_color.G, part_color.B)




        Do Until i + 4 >= stl_table.Items.Count
            GL.Normal3(Convert.ToSingle(stl_table.Items.Item(i).SubItems(0).Text), Convert.ToSingle(stl_table.Items.Item(i).SubItems(1).Text), Convert.ToSingle(stl_table.Items.Item(i).SubItems(2).Text))
            GL.Vertex3(stl_table.Items.Item(i + 1).SubItems(0).Text - avgx, stl_table.Items.Item(i + 1).SubItems(1).Text - avgy, stl_table.Items.Item(i + 1).SubItems(2).Text - avgz)
            GL.Vertex3(stl_table.Items.Item(i + 2).SubItems(0).Text - avgx, stl_table.Items.Item(i + 2).SubItems(1).Text - avgy, stl_table.Items.Item(i + 2).SubItems(2).Text - avgz)
            GL.Vertex3(stl_table.Items.Item(i + 3).SubItems(0).Text - avgx, stl_table.Items.Item(i + 3).SubItems(1).Text - avgy, stl_table.Items.Item(i + 3).SubItems(2).Text - avgz)
            i = i + 4
        Loop
        GL.End()

    End If

第二个函数基本上导入CAD STL文件并将其绘制为三角形。法线向量只是CAD文件的输入(因此它们已被计算)。这种方法的照明效果非常好,这让我知道我的照明代码是正确的。

问题

问题在于我的球体没有正确发光。我通过测试知道这是由于我的法向量。

使用当前代码,我的球体看起来像这样:

enter image description here

有一个" spot"光线让我觉得这只是一个正常的正弦曲线。

有人在我的函数内正确设置法向量有任何建议吗?在任何人提出建议之前,我不能将GLU或GLUT用于我想要完成的任务,这就是我需要球体功能的原因。

0 个答案:

没有答案