3D компьютерная графическая анимация: не работает задняя поверхность - PullRequest
0 голосов
/ 26 ноября 2018

Итак, я попытался выполнить выборку задней поверхности куба с помощью Visual Basic.Я уверен, что код, который я написал, правильный, но почему-то мне нужна не обратная сторона.

Это структура данных

Structure TLine
    Dim p1, p2 As Integer
End Structure

Structure TLine2
    Dim p1, p2 As TPoint
End Structure

Structure TPoint
    Dim x, y, z, w As Double
End Structure

Structure TPolygon
    Dim p1, p2, p3 As Integer
End Structure

Это функция

Sub SetPoint(ByRef V As TPoint, ByVal a As Double, ByVal b As Double, ByVal c As Double, ByVal d As Double)
    V.x = a
    V.y = b
    V.z = c
    V.w = 1
End Sub

Sub SetLine(ByVal idx As Integer, ByVal p1 As Integer, ByVal p2 As Integer)
    edge(idx).p1 = p1
    edge(idx).p2 = p2
End Sub

Sub SetPolygon(ByVal idx As Integer, ByVal p1 As Integer, ByVal p2 As Integer, ByVal p3 As Integer)
    polygon(idx).p1 = p1
    polygon(idx).p2 = p2
    polygon(idx).p3 = p3
End Sub

Это функция рисования

Sub draw()
    bmp = New Bitmap(400, 400)
    Dim grp As Graphics = Graphics.FromImage(bmp)
    Dim i As Integer
    Dim p As New Pen(Color.Black)

    DOP.x = 0
    DOP.y = 0
    DOP.z = -2

    For i = 0 To 11
        temp_v1.x = v(polygon(i).p2).x - v(polygon(i).p1).x
        temp_v1.y = v(polygon(i).p2).y - v(polygon(i).p1).y
        temp_v1.z = v(polygon(i).p2).z - v(polygon(i).p1).z

        temp_v2.x = v(polygon(i).p3).x - v(polygon(i).p1).x
        temp_v2.y = v(polygon(i).p3).y - v(polygon(i).p1).y
        temp_v2.z = v(polygon(i).p3).z - v(polygon(i).p1).z

        normal.x = (temp_v1.y * temp_v2.z) - (temp_v2.y * temp_v1.z)
        normal.y = (temp_v1.z * temp_v2.x) - (temp_v2.z * temp_v1.x)
        normal.z = (temp_v1.x * temp_v2.y) - (temp_v2.x * temp_v1.y)

        result = (DOP.x * normal.x) + (DOP.y * normal.y) + (DOP.z * normal.z)

        If result < 0 Then
            grp.DrawLine(p, CInt(vs(polygon(i).p1).x), CInt(vs(polygon(i).p1).y), CInt(vs(polygon(i).p2).x), CInt(vs(polygon(i).p2).y))
            grp.DrawLine(p, CInt(vs(polygon(i).p1).x), CInt(vs(polygon(i).p1).y), CInt(vs(polygon(i).p3).x), CInt(vs(polygon(i).p3).y))
            grp.DrawLine(p, CInt(vs(polygon(i).p2).x), CInt(vs(polygon(i).p2).y), CInt(vs(polygon(i).p3).x), CInt(vs(polygon(i).p3).y))
            PictureBox1.Image = bmp
        End If
    Next
    'PictureBox1.Image = bmp
End Sub

Это набор точек и многоугольников в одном кубе

SetPoint(v(0), -1, -1, 1, 1)
    SetPoint(v(1), 1, -1, 1, 1)
    SetPoint(v(2), 1, 1, 1, 1)
    SetPoint(v(3), -1, 1, 1, 1)
    SetPoint(v(4), -1, -1, -1, 1)
    SetPoint(v(5), 1, -1, -1, 1)
    SetPoint(v(6), 1, 1, -1, 1)
    SetPoint(v(7), -1, 1, -1, 1)

    SetPolygon(0, 0, 1, 2)
    SetPolygon(1, 0, 3, 2)
    SetPolygon(2, 5, 4, 7)
    SetPolygon(3, 5, 6, 7)
    SetPolygon(4, 3, 2, 6)
    SetPolygon(5, 3, 7, 6)
    SetPolygon(6, 4, 5, 1)
    SetPolygon(7, 4, 0, 1)
    SetPolygon(8, 1, 5, 6)
    SetPolygon(9, 1, 2, 6)
    SetPolygon(10, 4, 0, 3)
    SetPolygon(11, 4, 7, 3)

Это предварительный просмотр куба, который я пытался поддержать с помощью вращения лица.

1 Ответ

0 голосов
/ 26 ноября 2018

Отбор задних граней зависит от порядка вершин на экране.Вы предполагаете, что либо по часовой стрелке, либо против часовой стрелки являются «передними», и вы рисуете только те.

В вашем предварительном просмотре я вижу, что вам не хватает некоторых передних граней, и вы рисуете некоторые задние грани, которые не следует делать.Вам просто нужно найти эти несколько сломанных треугольников и изменить их направление, поменяв местами 2 и 3 вершины.

...