![]() |
Гравитация
Есть player - точка, к которой привязана камера. Управление стандартное
по оси Y вращаем игрока, а по оси X камеру. Притяжение - перемещение по локальной(так надо см. далее) оси Y игрока MoveEntity Player,0,-1,0 И вот в чем проблема Еще есть сфера - планета с координатами 0,0,0 Нужно чтобы ось игрока Y (высота) была направлена в центр планеты, где бы ни находился игрок.Планетарная гравитация в общем. Point Entity для этой цели не подходит - он переворачивает ось Y на Z и на полюсах игрока начинает крутить. Пробовал через Atan2, но пока не получается. Может кто делал раньше такую систему? |
Re: Гравитация
Сам начинаю заного, пока свои соображения и воспоминания:
Эх.. так я не хотел (или давно мечтал) вскрыть старые архивы директорий Blitz`а! чтоб обнаружить, что моей первой демки там нет (( под новый год 2002ого, у меня убился хард. По сути: делал в 3D от firstPerson: звезду, планету(сфера), станцию, кораблик, атмосфера планеты(ещё сферы). кораблик испытывал (g) мог летать под действием этой силы у поверхности планеты(сфера была ну очень большая) Как: со своим разложением сил и преобразованием не мучайся, это где-то близко попыткам на Pascal`е свой 3D рендер сделать (поверь :) ), если память не изменяет я пользовался механизмом реляционных пространственных координат (встроенных в Blitz) и возможно дополнительным(к пивоту кораблика) пивотом для сил тяжести. Поразмышляй на эту тему, докопаешься. У меня таки в конце концов заработало как часы. |
Re: Гравитация
Попробуй через AlignToVector типа :
AlignToVector cam, x2-x1 , y2-y1, z2-z1 , 2 , 0.1 где x1,x2... координаты камеры и планеты. |
Re: Гравитация
создай пивот, а к ннему уже привязу плеера !!
притяжение прописуй только доя пивота, плеер будет притягиваться сам собой !! находи угол под которым находиться пивот по отношению к центру планеты, поворачуй пивот на этот угол и двигай его туда !! надеюсь всё понятно !! :) |
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 а потом после и вычислял разницу. И если игрок скользил сам, (работа коллизии) то получалось некоторое значение отличное от нуля, но так до ума это дело не довел. |
найди учебник за 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д системы но принцип тотже конеч мож я че не правельно написал щас но я исправлю когда вспомню)) |
Re: Гравитация
А вы попробуйте не с пивот а с самой камерой!
Я замечал фишку когда самеру переворачиваешь меняется координаты самого мира XYZ а камеры остается! Т.Е. Если игрока будет тенуть вниз если TurnEntity перевернуть камеру то игрок полетит в другую сторону! |
Мне кажется это от того, что гравитация постоянно действует.
Попробуй проверять коллизию с землей и при коллизии отключать гравитацию. А вообще-то должно и с PointEntity работать если создать плеера как чайлда планеты... Напиши полностью свой код, посмотрим. |
Re: Гравитация
Не советую делать через AlignToVector, потому что по опыту глючный оператор. По-крайней мере, я для себя решил его в черный список записать.
|
Re: Гравитация
Я давно это делал вот фрагмент того как я реализовал гравитационное воздействие на кораблик (вырезано из общего кода):
Код:
Function FaindObjGrav(p.Player) Функция FaindDist анализировало ближайшее крупное тело в космосе т.е. А FaindObjGrav уже расчитывало ускорение которое задовалось телу... ВОбщем эими двумя функиями мне удалось сделать модель при которой можно было выводить корабль на орбиту и он уже по законами притяжения мог вращаться по орбите. Есть одно но, я это делал для Солнечной системы в натуральную величину и поэтому пришлось делать финт ушами: Сам корабль всегда имел координату 0,0,0 а двигал я в сцене все небесные тела. |
Re: Гравитация
|
Re: Гравитация
Незнаю... надо смотреть код автора.
Я бы наверно оттолкнулся от: planet=CreateSphere() ship=CreateCube(planet) Цикл: PointEntity ship,planet MoveEntity ship,0,0,gravity |
Re: Гравитация
Цитата:
игрок столкнулся с землей и остановился. Но без движения нет и коллизии - включается gravity. Получается как бы сказать дрожжание, игрок будет неизбежно скользить. Гравитацию лучше совсем не трогать, иначе может быть ситуация если игрок взберется на холм, то уже не спустится с него. PointEntity - действует по каким-то другим принципам, тут проблема с полюсами причем чем ближе игрок к полюсу, тем не это не описать это видеть надо. Код:
Graphics3D 800,600,32,2 |
Re: Гравитация
Ок, вечерком заценм.
|
Re: Гравитация
Было немного времени свободного днем, заценил твой код... впринципе все правильно (тока плэера бы сделать чайлдом планеты), но если еще есть желание глянь
http://damp.ucoz.ru/Planet.rar Ато уж который день в бошке крутится эта планетарная гравитация :) --- Правда не от первого лица (исправить легко), как ты хотел, просто со стороны легче лаги заметить. |
Часовой пояс GMT +4, время: 17:55. |
vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot