forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   3D-программирование (http://forum.boolean.name/forumdisplay.php?f=12)
-   -   Отобразит нормаль Треугольники (http://forum.boolean.name/showthread.php?t=14716)

metalpasha 12.05.2011 13:52

Отобразит нормаль Треугольники
 
Привет всем
подскажи как линией отобразит нормаль для треугольника :SOS:

ANDREYman 12.05.2011 14:10

Ответ: Отобразит нормаль Треугольники
 
нарисовать линию из середины треугольника по направлению нормали. вторым треугольником.

Venom2 12.05.2011 16:14

Ответ: Отобразит нормаль Треугольники
 
Цитата:

Сообщение от metalpasha (Сообщение 188228)
Привет всем
подскажи как линией отобразит нормаль для треугольника :SOS:

Ну если для отладки, то можно и 2D средствами, например так:
Код:


Function DrawNormals(Mesh%, Camera%, Length# = 1.0)
       
        ; перебираем сурфейсы меша
        Local s%
        For s = CountSurfaces(Mesh) To 1 Step -1
                Local Surface% = GetSurface(Mesh, s)
               
                ; перебираем треугольники сурфейса
                Local t%
                For t = CountTriangles(Surface) - 1 To 0 Step -1
                       
                        ; берем индексы вертексов треугольника
                        Local i1% = TriangleVertex(Surface, t, 0)
                        Local i2% = TriangleVertex(Surface, t, 1)
                        Local i3% = TriangleVertex(Surface, t, 2)
                       
                        ; переносим координаты вертексов из локальной системы в систему меша (трансформируем)
                       
                        TFormPoint(VertexX(Surface, i1), VertexY(Surface, i1), VertexZ(Surface, i1), Mesh, 0)
                        Local x1# = TFormedX()
                        Local y1# = TFormedY()
                        Local z1# = TFormedZ()
                       
                        TFormPoint(VertexX(Surface, i2), VertexY(Surface, i2), VertexZ(Surface, i2), Mesh, 0)
                        Local x2# = TFormedX()
                        Local y2# = TFormedY()
                        Local z2# = TFormedZ()
                       
                        TFormPoint(VertexX(Surface, i3), VertexY(Surface, i3), VertexZ(Surface, i3), Mesh, 0)
                        Local x3# = TFormedX()
                        Local y3# = TFormedY()
                        Local z3# = TFormedZ()
                       
                        ; считаем ребра треугольника
                       
                        Local e1x# = x3 - x1
                        Local e1y# = y3 - y1
                        Local e1z# = z3 - z1
                       
                        Local e2x# = x3 - x2
                        Local e2y# = y3 - y2
                        Local e2z# = z3 - z2
                       
                        ; перпендикуляр к плоскости треугольника найдем векторным произведением его ребер
                        Local nx# = e1y * e2z - e1z * e2y
                        Local ny# = e1z * e2x - e1x * e2z
                        Local nz# = e1x * e2y - e1y * e2x
                       
                        ; нормализуем перпендикуляр и получим вектор нормали + сразу же приведем нормаль к указаной длине
                        Local l# = Length / Sqr(nx * nx + ny * ny + nz * nz)
                        nx = nx * l
                        ny = ny * l
                        nz = nz * l
                       
; второй способ - трансформировать нормали вертексов и взять среднее арифметическое
;                        Local nx# = 0
;                        Local ny# = 0
;                        Local nz# = 0
;                        TFormNormal(VertexNX(Surface, i1), VertexNY(Surface, i1), VertexNZ(Surface, i1), Mesh, 0)
;                        nx = nx + TFormedX()
;                        ny = ny + TFormedY()
;                        nz = nz + TFormedZ()
;                        TFormNormal(VertexNX(Surface, i2), VertexNY(Surface, i2), VertexNZ(Surface, i2), Mesh, 0)
;                        nx = nx + TFormedX()
;                        ny = ny + TFormedY()
;                        nz = nz + TFormedZ()
;                        TFormNormal(VertexNX(Surface, i3), VertexNY(Surface, i3), VertexNZ(Surface, i3), Mesh, 0)
;                        nx = nx + TFormedX()
;                        ny = ny + TFormedY()
;                        nz = nz + TFormedZ()
;                        nx = nx / 3
;                        ny = ny / 3
;                        nz = nz / 3
                       
                        ; центр треугольника - среднее арифметическое координат его вершин
                        Local x# = (x1 + x2 + x3) / 3
                        Local y# = (y1 + y2 + y3) / 3
                        Local z# = (z1 + z2 + z3) / 3
                       
                        ; проецируем центр треугольника на экран
                        CameraProject(Camera, x, y, z)
                       
                        ; рисуем только если точка перед камерой
                        If ProjectedZ() > 0 Then
                               
                                Local lx1# = ProjectedX()
                                Local ly1# = ProjectedY()
                               
                                ; проецируем конец нормали на экран
                                CameraProject(Camera, x + nx, y + ny, z + nz)
                               
                                If ProjectedZ() > 0 Then
                               
                                        ; рисуем линию по полученым координатам
                                        Line(lx1, ly1, ProjectedX(), ProjectedY())
                                End If
                        End If
                Next
        Next
End Function

Graphics3D(800, 600, 32, 2)

Local Mesh% = CreateSphere()

Local Light% = CreateLight()

Local Camera% = CreateCamera()
PositionEntity(Camera, 0, 0, -2)

WireFrame(True)

Repeat
       
        TurnEntity(Mesh, 0.1, 0.2, 0.3)
       
        RenderWorld()
       
        Color(0, 255, 0)
        DrawNormals(Mesh, Camera, 0.1)
       
        Flip()
       
Until KeyDown(1)

End

можно сбросить расчитанные подобным образом нормали в массив, если меш не динамический, так будет быстрее чем считать каждый раз.

Ну а для быстрого отображения нужно как уже сказали рисовать треугольниками. Заводить меш, сурфейс, по кол-ву треугольников добавить квадов (4 вертекса и два треугольника) и менять им координаты, строя линии в 3д, т.к. 2д в блиц программное и очень медленное.

metalpasha 12.05.2011 16:41

Ответ: Отобразит нормаль Треугольники
 
Огромное Спасибо за :support: !!!!!!
то что нужно!!!
:punk:


Часовой пояс GMT +4, время: 05:43.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot