Показать сообщение отдельно
Старый 24.09.2007, 13:27   #10
Delta_Q
Нуждающийся
 
Регистрация: 23.09.2007
Сообщений: 62
Написано 0 полезных сообщений
(для 0 пользователей)
Re: Гравитация

Я давно это делал вот фрагмент того как я реализовал гравитационное воздействие на кораблик (вырезано из общего кода):
Function FaindObjGrav(p.Player)
;Расчет гаравитационного воздействия на корабль
	If TimMS<MilliSecs() Then 
		TimMS=MilliSecs()+C_Strob
		Obj=FaindDist(p)
		Di1#=EntityDistance# ( p\entity,planet(obj))
		A#=C_Koef*C_Grav#*(o.sb(Obj)\Mass/(Di1#*Di1#*1000000)) ;Домнажаю радиус на милион чтоб было норм в КМ
		vx#=EntityX#(planet(obj),True)
		vy#=EntityY#(planet(obj),True)
		vz#=EntityZ#(planet(obj),True)
		vx# = vx#/Di1#: vy# = vy#/Di1#: vz# = vz#/Di1# 
		p\speedx#=vx#*A#+p\speedx#
		p\speedy#=vy#*A#+p\speedy#
		p\speedz#=vz#*A#+p\speedz#
		TranslateEntity p\world,-p\speedx#,-p\speedy#,-p\speedz#	;move world	
	End If

End Function

Function FaindDist(p.Player)
;Функция поискаближайшего объекта
Dist#=EntityDistance#( p\entity,planet(i))
For i=0 To NumPlanet-2
 		Di1#=EntityDistance#( p\entity,planet(i))
		Di2#=EntityDistance#( p\entity,planet(i+1))
		If (Dist#>Di1# Or Dist#>Di2#)
			If Di1#<=Di2#
				Dist#=Di1#
				Obj=i
			Else If Di2#<Dist#
				Dist#=Di2#
				Obj=i+1
			EndIf
		EndIf
	Next
	Return Obj
End Function
Это точно работало и работало как реальная физика... Нужно занть массу планеты массу корабля...
Функция FaindDist анализировало ближайшее крупное тело в космосе т.е. А FaindObjGrav уже расчитывало ускорение которое задовалось телу...
ВОбщем эими двумя функиями мне удалось сделать модель при которой можно было выводить корабль на орбиту и он уже по законами притяжения мог вращаться по орбите.

Есть одно но, я это делал для Солнечной системы в натуральную величину и поэтому пришлось делать финт ушами: Сам корабль всегда имел координату 0,0,0 а двигал я в сцене все небесные тела.
(Offline)
 
Ответить с цитированием