Ответ: Отобразит нормаль Треугольники
Цитата:
Сообщение от 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д в блиц программное и очень медленное.
|