Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для компьютеров > Blitz3D > 3D-программирование

3D-программирование Вопросы, касающиеся программирования 3D мира

Ответ
 
Опции темы
Старый 12.05.2011, 13:52   #1
metalpasha
AnyKey`щик
 
Регистрация: 10.02.2008
Сообщений: 13
Написано 0 полезных сообщений
(для 0 пользователей)
Сообщение Отобразит нормаль Треугольники

Привет всем
подскажи как линией отобразит нормаль для треугольника
(Offline)
 
Ответить с цитированием
Старый 12.05.2011, 14:10   #2
ANDREYman
Нуждающийся
 
Аватар для ANDREYman
 
Регистрация: 17.12.2010
Адрес: Санкт-Петербург
Сообщений: 87
Написано 55 полезных сообщений
(для 214 пользователей)
Ответ: Отобразит нормаль Треугольники

нарисовать линию из середины треугольника по направлению нормали. вторым треугольником.
(Offline)
 
Ответить с цитированием
Старый 12.05.2011, 16:14   #3
Venom2
 
Сообщений: n/a
Ответ: Отобразит нормаль Треугольники

Сообщение от 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
metalpasha
AnyKey`щик
 
Регистрация: 10.02.2008
Сообщений: 13
Написано 0 полезных сообщений
(для 0 пользователей)
Ответ: Отобразит нормаль Треугольники

Огромное Спасибо за !!!!!!
то что нужно!!!
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


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


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com