|
3D-программирование Вопросы, касающиеся программирования 3D мира |
12.05.2011, 13:52
|
#1
|
AnyKey`щик
Регистрация: 10.02.2008
Сообщений: 13
Написано 0 полезных сообщений (для 0 пользователей)
|
Отобразит нормаль Треугольники
Привет всем
подскажи как линией отобразит нормаль для треугольника
|
(Offline)
|
|
12.05.2011, 14:10
|
#2
|
Нуждающийся
Регистрация: 17.12.2010
Адрес: Санкт-Петербург
Сообщений: 87
Написано 55 полезных сообщений (для 214 пользователей)
|
Ответ: Отобразит нормаль Треугольники
нарисовать линию из середины треугольника по направлению нормали. вторым треугольником.
|
(Offline)
|
|
12.05.2011, 16:14
|
#3
|
|
Ответ: Отобразит нормаль Треугольники
Сообщение от metalpasha
Привет всем
подскажи как линией отобразит нормаль для треугольника
|
Ну если для отладки, то можно и 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д в блиц программное и очень медленное.
|
|
|
12.05.2011, 16:41
|
#4
|
AnyKey`щик
Регистрация: 10.02.2008
Сообщений: 13
Написано 0 полезных сообщений (для 0 пользователей)
|
Ответ: Отобразит нормаль Треугольники
Огромное Спасибо за !!!!!!
то что нужно!!!
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 13:01.
|