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

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

Вернуться   forum.boolean.name > Программирование игр для компьютеров > Blitz3D > Полезные функции

Полезные функции Выкладываем полезные функции, чтоб не изобретать велосипед заново...

Ответ
 
Опции темы
Старый 28.05.2007, 04:31   #1
moka
.
 
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,863 пользователей)
AnimMesh_Size_#(Mesh)

Значит, тут побеседовал с WaReZMEN, и написал функции, возвращающие размер анимированной модели, и "истинный" центр.
Функции размера не Реалтайм (перебор всех вертексов - ресурсоёмкий процесс), и возвращают размер и центр только первого кадра.
Примечание: Если модель масштабируется, то нужно умножать получаемые данные этих функций на коэфицент масштабируемой плоскости, например результат AnimMeshWidth, умножать на коэфицент масштабирования по X координате. Так же и с функциями узнавания центра.

Function AnimMeshWidth#(Mesh)
	
	Local MinW#=999999,MaxW#=-999999
	Local VertX#
	Local ChildCnt%,SurfCnt%,VertCnt%
	
	ChildCnt=CountChildren(Mesh)
	For n1=1 To ChildCnt
		Child=GetChild(Mesh,n1)
		SurfCnt=CountSurfaces(Child)
		For n2=1 To SurfCnt
			Surf=GetSurface(Child,n2)
			VertCnt=CountVertices(Surf)
			For n3=0 To VertCnt-1
				VertX=VertexX(Surf,n3)
				If VertX>MaxW MaxW=VertX
				If VertX<MinW MinW=VertX
			Next
		Next
	Next
	
	Return Abs(MaxW-MinW)
	
End Function

Function AnimMeshHeight#(Mesh)
	
	Local MinH#=999999,MaxH#=-999999
	Local VertY#
	Local ChildCnt%,SurfCnt%,VertCnt%
	
	ChildCnt=CountChildren(Mesh)
	For n1=1 To ChildCnt
		Child=GetChild(Mesh,n1)
		SurfCnt=CountSurfaces(Child)
		For n2=1 To SurfCnt
			Surf=GetSurface(Child,n2)
			VertCnt=CountVertices(Surf)
			For n3=0 To VertCnt-1
				VertY=VertexY(Surf,n3)
				If VertY>MaxH MaxH=VertY
				If VertY<MinH MinH=VertY
			Next
		Next
	Next
	
	Return Abs(MaxH-MinH)
	
End Function

Function AnimMeshDepth#(Mesh)
	
	Local MinD#=999999,MaxD#=-999999
	Local VertZ#
	Local ChildCnt%,SurfCnt%,VertCnt%
	
	ChildCnt=CountChildren(Mesh)
	For n1=1 To ChildCnt
		Child=GetChild(Mesh,n1)
		SurfCnt=CountSurfaces(Child)
		For n2=1 To SurfCnt
			Surf=GetSurface(Child,n2)
			VertCnt=CountVertices(Surf)
			For n3=0 To VertCnt-1
				VertZ=VertexZ(Surf,n3)
				If VertZ>MaxD MaxD=VertZ
				If VertZ<MinD MinD=VertZ
			Next
		Next
	Next
	
	Return Abs(MaxD-MinD)
	
End Function


Function MeshCenterX#(Mesh)
	
	Local MinW#=999999,MaxW#=-999999
	Local ChildCnt%,SurfCnt%,VertCnt%
	Local Count%,Ans#
	
	ChildCnt=CountChildren(Mesh)
	For n1=1 To ChildCnt
		Child=GetChild(Mesh,n1)
		SurfCnt=CountSurfaces(Child)
		For n2=1 To SurfCnt
			Surf=GetSurface(Child,n2)
			VertCnt=CountVertices(Surf)
			For n3=0 To VertCnt-1
				Count=Count+1
				Ans=Ans+VertexX(Surf,n3)
			Next
		Next
	Next
	
	Return (Ans/Count)
	
End Function

Function MeshCenterY#(Mesh)
	
	Local MinH#=999999,MaxH#=-999999
	Local ChildCnt%,SurfCnt%,VertCnt%
	Local Count%,Ans#
	
	ChildCnt=CountChildren(Mesh)
	For n1=1 To ChildCnt
		Child=GetChild(Mesh,n1)
		SurfCnt=CountSurfaces(Child)
		For n2=1 To SurfCnt
			Surf=GetSurface(Child,n2)
			VertCnt=CountVertices(Surf)
			For n3=0 To VertCnt-1
				Count=Count+1
				Ans=Ans+VertexY(Surf,n3)
			Next
		Next
	Next
	
	Return (Ans/Count)
	
End Function

Function MeshCenterZ#(Mesh)
	
	Local MinD#=999999,MaxD#=-999999
	Local ChildCnt%,SurfCnt%,VertCnt%
	Local Count%,Ans#
	
	ChildCnt=CountChildren(Mesh)
	For n1=1 To ChildCnt
		Child=GetChild(Mesh,n1)
		SurfCnt=CountSurfaces(Child)
		For n2=1 To SurfCnt
			Surf=GetSurface(Child,n2)
			VertCnt=CountVertices(Surf)
			For n3=0 To VertCnt-1
				Count=Count+1
				Ans=Ans+VertexZ(Surf,n3)
			Next
		Next
	Next
	
	Return (Ans/Count)
	
End Function
Тэкс, после тестирования функций центра, прошлый метод (разницы максимума и минимума), решил использовать другой метод: общая арифметическая всех вертексов, так лечше выходит - во первых центр блидже на центр похож, да и в несложных моделях, центр в центре тяжести.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
cahekp (24.05.2009)
Старый 06.03.2011, 23:47   #2
LLI.T.A.L.K.E.R.
Мастер
 
Аватар для LLI.T.A.L.K.E.R.
 
Регистрация: 24.06.2009
Адрес: Набережные Челны
Сообщений: 930
Написано 292 полезных сообщений
(для 504 пользователей)
Ответ: AnimMesh_Size_#(Mesh)

MAV!

Ошибка при попытке сосчитать фейсы у чайлда:
CountSurfaces(Child)
Всё делаю продуманно, без ошибок. Просто когда дело касается этого - то MAV

Blitz3D-Update-1.9.9

И ещё.. Чайлд нашёл и попробовал ScaleEntity Child - модель сменила размер, а костяк остался прежним.
Как смотреть костяк:
http://forum.boolean.name/showpost.p...9&postcount=43
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

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

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

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
AnimMesh<=>Mesh CRASHER 3D-программирование 3 30.03.2009 04:08
Scale mesh ent, -1,1,1 : Flip mesh ent ; Нормали неправильные! ELIAS 3D-программирование 10 10.01.2009 15:05
Камера и Mesh JeSss 3D-программирование 15 29.01.2008 21:00
CopyEntity + (functions)Mesh Horror 3D-программирование 6 20.11.2007 14:31
Колючий mesh HolyDel Полезные функции 4 23.02.2007 01:37


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


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