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

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

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

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

Ответ
 
Опции темы
Старый 18.09.2007, 02:57   #1
dimond
Оператор ЭВМ
 
Регистрация: 14.09.2007
Сообщений: 27
Написано 2 полезных сообщений
(для 5 пользователей)
Гравитация

Есть player - точка, к которой привязана камера. Управление стандартное
по оси Y вращаем игрока, а по оси X камеру. Притяжение - перемещение по локальной(так надо см. далее) оси Y игрока MoveEntity Player,0,-1,0
И вот в чем проблема
Еще есть сфера - планета с координатами 0,0,0
Нужно чтобы ось игрока Y (высота) была направлена в центр планеты, где бы ни находился игрок.Планетарная гравитация в общем.
Point Entity для этой цели не подходит - он переворачивает ось Y на Z и на полюсах игрока начинает крутить. Пробовал через Atan2, но пока не получается. Может кто делал раньше такую систему?
(Offline)
 
Ответить с цитированием
Старый 18.09.2007, 03:24   #2
Noah
Оператор ЭВМ
 
Регистрация: 16.09.2007
Сообщений: 22
Написано 0 полезных сообщений
(для 0 пользователей)
Re: Гравитация

Сам начинаю заного, пока свои соображения и воспоминания:

Эх.. так я не хотел (или давно мечтал) вскрыть старые архивы директорий Blitz`а! чтоб обнаружить, что моей первой демки там нет (( под новый год 2002ого, у меня убился хард.
По сути: делал в 3D от firstPerson: звезду, планету(сфера), станцию, кораблик, атмосфера планеты(ещё сферы). кораблик испытывал (g) мог летать под действием этой силы у поверхности планеты(сфера была ну очень большая)
Как: со своим разложением сил и преобразованием не мучайся, это где-то близко попыткам на Pascal`е свой 3D рендер сделать (поверь ), если память не изменяет я пользовался механизмом реляционных пространственных координат (встроенных в Blitz) и возможно дополнительным(к пивоту кораблика) пивотом для сил тяжести.
Поразмышляй на эту тему, докопаешься. У меня таки в конце концов заработало как часы.
(Offline)
 
Ответить с цитированием
Старый 18.09.2007, 09:42   #3
Damp
Знающий
 
Регистрация: 12.07.2007
Сообщений: 297
Написано 50 полезных сообщений
(для 133 пользователей)
Re: Гравитация

Попробуй через AlignToVector типа :
AlignToVector cam, x2-x1 , y2-y1, z2-z1 , 2 , 0.1
где x1,x2... координаты камеры и планеты.
(Offline)
 
Ответить с цитированием
Старый 18.09.2007, 11:01   #4
IGR
Blitz's Shame !!
 
Регистрация: 31.03.2007
Сообщений: 3,639
Написано 832 полезных сообщений
(для 2,013 пользователей)
Re: Гравитация

создай пивот, а к ннему уже привязу плеера !!
притяжение прописуй только доя пивота, плеер будет притягиваться сам собой !!
находи угол под которым находиться пивот по отношению к центру планеты, поворачуй пивот на этот угол и двигай его туда !!
надеюсь всё понятно !!
(Offline)
 
Ответить с цитированием
Старый 23.09.2007, 04:49   #5
dimond
Оператор ЭВМ
 
Регистрация: 14.09.2007
Сообщений: 27
Написано 2 полезных сообщений
(для 5 пользователей)
Re: Гравитация

собрал через AlignToVector
для упрощения координаты планеты 0,0,0

dx#=EntityX(player,1)
dy#=EntityY(player,1)
dz#=EntityZ(player,1)
ln#=Sqr(dx*dx+dy*dy+dz*dz)
dx=dx/ln
dy=dy/ln
dz=dz/ln
AlignToVector player,dx,dy,dz,2,1

Теперь работает как надо, но есть две проблемы.

1) игрока тянет к полюсам, иду я к примеру от одного полюса к другому, до экватора игрок замедляется, а после ускоряет ход.

2) такая фишка как Collisions tplayer,tplanet,2,3 - "защита от скольжения вниз" не действует. Походу этот самый "вниз" глобальный, а нужно чтобы проверка была по локальной оси Y игрока. В итоге игрок скольэит так, если бы я писал Collisions tplayer,tplanet,2,2, особенно это заметно на рельефной местности.

пробовал так

If EntityCollided(player,tplanet) ClearCollisions():Collisions tplayer,tplanet,2,1

If move ClearCollisions():Collisions tplayer,tplanet,2,3

но думаю это не выход т.к. могут быть еще сторонние коллизии, не относящиеся к игроку (пуля-бот к примеру) а ClearCollisions() стирает все, но без нее нельзя применить новые установки.

еще записывал координаты игрока до UpdateWorld а потом после и вычислял разницу. И если игрок скользил сам, (работа коллизии) то получалось некоторое значение отличное от нуля, но так до ума это дело не довел.
(Offline)
 
Ответить с цитированием
Старый 23.09.2007, 23:53   #6
Dream
быдло
 
Регистрация: 05.08.2007
Сообщений: 1,435
Написано 614 полезных сообщений
(для 1,489 пользователей)
найди учебник за 10 клас там есть формула как раз для етого случая))я ей пользуюсь))удобно и просто)

у тебя движения через MoveEntity?если ды то немножко по другому но принцип тотже:
fx=sin(deltayaw(player,planet))*f#+(fx*1.75)
fy#=cos(deltayaw(player,planet))*f#+(fy*1.75)
Position entity player,enetityx(player)+fx#,entityy(player),entity x(player)+fz#
f#-сила притяжения у тебя она равна 1
ну ето для 2д системы но принцип тотже
конеч мож я че не правельно написал щас но я исправлю когда вспомню))
(Offline)
 
Ответить с цитированием
Старый 24.09.2007, 01:51   #7
-=SCiP=-
ПроЭктировщик
 
Аватар для -=SCiP=-
 
Регистрация: 23.09.2007
Сообщений: 126
Написано 11 полезных сообщений
(для 16 пользователей)
Re: Гравитация

А вы попробуйте не с пивот а с самой камерой!
Я замечал фишку когда самеру переворачиваешь меняется координаты самого мира XYZ а камеры остается!
Т.Е. Если игрока будет тенуть вниз если TurnEntity перевернуть камеру то игрок полетит в другую сторону!
(Offline)
 
Ответить с цитированием
Старый 24.09.2007, 09:13   #8
Damp
Знающий
 
Регистрация: 12.07.2007
Сообщений: 297
Написано 50 полезных сообщений
(для 133 пользователей)
Мне кажется это от того, что гравитация постоянно действует.
Попробуй проверять коллизию с землей и при коллизии отключать гравитацию.
А вообще-то должно и с PointEntity работать если создать плеера как чайлда планеты...

Напиши полностью свой код, посмотрим.
(Offline)
 
Ответить с цитированием
Старый 24.09.2007, 09:51   #9
stone_evil
ПроЭктировщик
 
Регистрация: 17.10.2006
Сообщений: 170
Написано 18 полезных сообщений
(для 42 пользователей)
Re: Гравитация

Не советую делать через AlignToVector, потому что по опыту глючный оператор. По-крайней мере, я для себя решил его в черный список записать.
(Offline)
 
Ответить с цитированием
Старый 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)
 
Ответить с цитированием
Старый 24.09.2007, 13:42   #11
dimanche13
Мастер
 
Регистрация: 19.03.2007
Сообщений: 1,039
Написано 153 полезных сообщений
(для 252 пользователей)
Re: Гравитация


тэг код закрывается так [/code]
__________________
(Offline)
 
Ответить с цитированием
Старый 24.09.2007, 14:00   #12
Damp
Знающий
 
Регистрация: 12.07.2007
Сообщений: 297
Написано 50 полезных сообщений
(для 133 пользователей)
Re: Гравитация

Незнаю... надо смотреть код автора.
Я бы наверно оттолкнулся от:
planet=CreateSphere()
ship=CreateCube(planet)
Цикл:
PointEntity ship,planet
MoveEntity ship,0,0,gravity
(Offline)
 
Ответить с цитированием
Старый 26.09.2007, 05:18   #13
dimond
Оператор ЭВМ
 
Регистрация: 14.09.2007
Сообщений: 27
Написано 2 полезных сообщений
(для 5 пользователей)
Re: Гравитация

Сообщение от Damp
Мне кажется это от того, что гравитация постоянно действует.
Попробуй проверять коллизию с землей и при коллизии отключать гравитацию.
А вообще-то должно и с PointEntity работать если создать плеера как чайлда планеты...

Напиши полностью свой код, посмотрим.
если EntityCollided(Player,tplanet) то gravity=0 иначе gravity=-.6

игрок столкнулся с землей и остановился. Но без движения нет и коллизии - включается gravity.
Получается как бы сказать дрожжание, игрок будет неизбежно скользить.
Гравитацию лучше совсем не трогать, иначе может быть ситуация если игрок взберется на холм, то уже не спустится с него.

PointEntity - действует по каким-то другим принципам, тут проблема с полюсами
причем чем ближе игрок к полюсу, тем
не это не описать это видеть надо.

Graphics3D 800,600,32,2
SetBuffer BackBuffer()
SeedRnd MilliSecs()
If Windowed3D() HidePointer

Const TPLayer%=1,Tplanet%=2

Global Player=CreatePivot()
PositionEntity Player,0,410,0
EntityType Player,TPlayer
EntityRadius Player,6

Global cam=CreateCamera(Player)
CameraClsColor cam,100,120,160

Global light=CreateLight()

Global planet=CreateSphere(64)
ScaleMesh planet,400,400,400
EntityType planet,Tplanet

tex=CreateTexture(64,64,1+8)
LockBuffer TextureBuffer(tex)
For i=0 To 4000
    WritePixelFast Rand(0,63),Rand(0,63),$FF80BC40,TextureBuffer(tex)
Next
UnlockBuffer TextureBuffer(tex)
ScaleTexture tex,.01,.01
EntityTexture planet,tex
FreeTexture tex

gravity#=-.6

Collisions TPlayer,Tplanet,2,3

While Not KeyHit(1)
    TurnEntity cam,MouseYSpeed()*.2,0,0
    TurnEntity player,0,-MouseXSpeed()*.2,0
    MoveMouse GraphicsWidth()*.5,GraphicsHeight()*.5

    move=0
    If KeyDown(200) MoveEntity player,0,0,1 move=1
    If KeyDown(208) MoveEntity player,0,0,-1 move=1
    If KeyDown(205) MoveEntity player,1,0,0 move=1
    If KeyDown(203) MoveEntity player,-1,0,0 move=1
    If MouseDown(2) MoveEntity player,0,8,0

    dx#=EntityX(player,1)
    dy#=EntityY(player,1)
    dz#=EntityZ(player,1)
    ;ln#=Sqr(dx*dx+dy*dy+dz*dz)
    ln#=EntityDistance(Player,planet)
    dx=dx/ln
    dy=dy/ln
    dz=dz/ln
    AlignToVector player,dx,dy,dz,2,1

    ;так пока реализована проверка на столкновение
    If EntityCollided(player,Tplanet) ClearCollisions():Collisions TPlayer,Tplanet,2,1
    If move ClearCollisions():Collisions TPlayer,Tplanet,2,3

    MoveEntity player,0,gravity,0
    UpdateWorld
    RenderWorld

    Text GraphicsWidth()*.5,GraphicsHeight()*.5,"+",1,1
 
    Flip
Wend
End
Извините что кривой код, это пока так, набросок.
(Offline)
 
Ответить с цитированием
Старый 26.09.2007, 09:19   #14
Damp
Знающий
 
Регистрация: 12.07.2007
Сообщений: 297
Написано 50 полезных сообщений
(для 133 пользователей)
Re: Гравитация

Ок, вечерком заценм.
(Offline)
 
Ответить с цитированием
Старый 26.09.2007, 13:24   #15
Damp
Знающий
 
Регистрация: 12.07.2007
Сообщений: 297
Написано 50 полезных сообщений
(для 133 пользователей)
Re: Гравитация

Было немного времени свободного днем, заценил твой код... впринципе все правильно (тока плэера бы сделать чайлдом планеты), но если еще есть желание глянь
http://damp.ucoz.ru/Planet.rar
Ато уж который день в бошке крутится эта планетарная гравитация
---
Правда не от первого лица (исправить легко), как ты хотел, просто со стороны легче лаги заметить.
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

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

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

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Гравитация и траектория прыжков DeMoNN Основной форум 2 16.07.2009 14:37
Гравитация в X Y Z TEHb08 Blitz3D 38 06.01.2009 16:39
аркадная FPS, прыжок и гравитация DMX 3D-программирование 18 19.06.2008 18:29
Простая гравитация untouchable 3D-программирование 5 14.03.2007 18:22
Гравитация magpro 3D-программирование 9 08.09.2006 00:28


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


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