Jump to content
Search In
  • More options...
Find results that contain...
Find results in...
  • Need help?

    Create a topic in the appropriate section
    Don't write everything in the chat!
  • Take a look at the marketplace

    There you can buy
    everything related to game servers
  • Don't want a ban?

    Please read our rules
    Don't disturb the order!
  • Sell or buy?

    Use services of the guarantor
    We will make your deal safe
  • 0
Sign in to follow this  
BorizzK

Получить координату на расстоянии 2м слева от игрока

Есть игрок

Есть его координаты X и Y

Нужно получить координаты точки X1 и X2 на расстоянии 2м слева от игрока

 

...

Угол (из GetOrientation()) мы знаем

 

Те банально надо получить координаты точки на окружности зная угол, радиус и координаты центра окружности

 

мне видится следующее решение

 

float dist = 2;

float A = player.GetOrientation()[0] - 45;

float x1 = dist * Math.Cos(A);

float y1 = dist * Math.Sin(A);

 

vector finpos = Vector(player.GetPosition()[0] + x1, player.GetPosition()[1], player.GetPosition()[2] + y1);

 

или я не прав?

 

может в Math enscript'а есть готовая функция?

 

 

Спасибо!

 

 

 

Share this post


Link to post
Share on other sites

3 answers to this question

Recommended Posts

  • 0

Сам задал вопрос и сам решил )))

 

float dist = 2; //Расстояние до точки
float subtractor = -90; //Положение слева // для справа subtractor = 90;
vector pos = player.GetPosition();
angle = Math.NormalizeAngle(player.GetOrientation()[0] + subtractor) * Math.DEG2RAD;
pos[0] = pos[0] + (double)(Math.Sin(angle) * dist);
pos[2] = pos[2] + (double)(Math.Cos(angle) * dist);

//pos содержит координату искомой точки

Нужно для рейкастинга - поиска и проверки обьекта с определенной стороны игрока

 

Для чего? А потом расскажу

Edited by BorizzK (see edit history)

Share this post


Link to post
Share on other sites









  • 0

BorizzK 

Для примера

 

vector pos = targetPlayer.GetPosition();
vector dir = targetPlayer.GetDirection();

// направление камеры на TargetPlayer
vector camLookAt;

// коррекция локальной позиции камеры относительно tergetPlayer
// разместить на -4 метра сзади на высоте 3 метра
vector camLocalPos = "0 3 -4";
vector camPos = dir * camLocalPos[2];
camPos[1] = camPos[1] + camLocalPos[1];

camPos = pos + camPos;
camLookAt = (pos - camPos).Normalized();

Edited by NoNameUltima (see edit history)

Share this post


Link to post
Share on other sites
  • 0

NoNameUltima у меня нет таргета

есть положение игрока и его угол из orientation и расстояние до точки куда светить

нужно получить  конечную координату в направлении которой светить

мне надо просветить то что от него слева и определить что там

 

те нет конкретного таргета

 

ну вобщем все получилось и работает именно так как я хотел

 

 

 

Edited by BorizzK (see edit history)

Share this post


Link to post
Share on other sites
Guest
This topic is now closed to further replies.
Sign in to follow this  

  • Similar Content

    • By BorizzK
      Пишу мод для стримеров и сериальщиков (наши оч попросили и пара ютьюберов)
      Управление камерой с регулированием fov и тп включая углы итп
      Все почти отлично
      Столкнулись с проблемой
      С фрикамеры когда крупным планом беседу снимаешь не видно (нет анимации) движения губ. Жестикуляция и голос есть, а движения губ нет, только если перса оператора прям рядом поставить, тогда есть, но он в кадр в некоторых моментах попадает, а этого не нужно. Если удалить обьект перса оператора, то норм, но иногда сервак с ума сходит.
      А когда операторов 2 - 3, то ваще фигня иногда начинается вплоть до краша...
       
      Может кто в курсе, где расстояние, радиус синхры настроить можно?
       
       
    • By 123new
      В данной теме мы с вами научимся создавать простой скрипт, который позволит выводить в чат объявления о присоединении и отсоединении игроков, а также логировать их данные.
       
      Нам понадобится:
      1. Сервер DayZ 1.0, сделанный по одному из гайдов:
      2. Notepad++
      3. Немножечко трезвого ума
       
      Приступим:
      1. Открываем Mpmissions - dayzOffline.chernarusplus - init.c
      2. В самом начале файла добавляем:
      #include "$CurrentDir:\\mpmissions\\dayzOffline.chernarusplus\\ConnectDisconnectMessagesInChat.c" Обратите внимание, имя папки с активной mpmissions сервера у вас может отличаться от стандартного названия  dayzOffline.chernarusplus - в таком случае в ссылке выше имя этой папки также надо заменить (это актуально в основном для серверов аренды)
      3. Помещаем в папку файл
      Пожалуйста, Войдите или Зарегистрируйтесь, чтобы увидеть это: Вложение.
      Либо создаем вручную этот файл с именем " "ConnectDisconnectMessagesInChat.c" и заполняем его следующим текстом:
      modded class CustomMission { void SendGlobalChatMessage(string message) { private array<Man> players = new array<Man>; GetGame().GetPlayers( players ); int numbOfplayers = players.Count(); if( numbOfplayers > 0 ) { foreach(Man player: players) { SendPersonalMessage(message, player); } //GetGame().ChatPlayer(message); } } void SendPersonalMessage(string message, Man player) { if(( player ) && (message != "")) { Param1<string> m_GlobalMessage = new Param1<string>(message); GetGame().RPCSingleParam(player, ERPCs.RPC_USER_ACTION_MESSAGE, m_GlobalMessage, true, player.GetIdentity()); } } override void InvokeOnDisconnect( PlayerBase player ) { private PlayerIdentity identity = NULL; identity = player.GetIdentity(); if (player && identity) { private string Name_P = identity.GetName(); private string UID_P = identity.GetPlainId(); private string message = "[Информация] Игрок " + Name_P + " отключился от сервера."; private string log_message = "[Disconnect] Player " + Name_P + " with Steam64ID: " + UID_P + " disconnected from server."; //GetGame().ChatPlayer(message); SendGlobalChatMessage(message); Print(log_message); } super.InvokeOnDisconnect( player ); } override void InvokeOnConnect(PlayerBase player, PlayerIdentity identity) { super.InvokeOnConnect(player, identity); private string Name_P = identity.GetName(); private string UID_P = identity.GetPlainId(); private string message = "[Информация] Игрок " + Name_P + " Зашёл на сервер."; private string log_message = "[Connect] Player " + Name_P + " with Steam64ID: " + UID_P + "connected to server."; //GetGame().ChatPlayer(message); SendGlobalChatMessage(message); Print(log_message); } } 4. Настраиваем текст как нам нужно. Т.е. в строках для чата
      private string message = "[Информация] Игрок " + Name_P + " отключился от сервера."; и
      private string message = "[Информация] Игрок " + Name_P + " Зашёл на сервер."; а также для логов
      private string log_message = "[Disconnect] Player " + Name_P + " with Steam64ID: " + UID_P + " disconnected from server."; и
      private string log_message = "[Connect] Player " + Name_P + " with Steam64ID: " + UID_P + "connected to server."; P.S. Если сообщения вам не видны, включите их видимость в настройках вашего клиента игры для себя!
       
    • By BorizzK
      Вобщем тема такая
       
      1я задачка была такая
      Нужно получить координату на плоскости под углом на расстоянии от текущей координаты
      Задачку решил тут
      Код в итоге таков:
       
      например выведем в лог  координаты точки на плоскости на расстоянии 2м и под углом 90 град (справа) от игрока (вызвав функцию PrintCoords, передав ей в качестве параметра переменную содержащую ссылку на перса игрока)
       
      void PrintCoords(PlayerBase player) { float distance = 2; float anglerotation = 90; Print("Coordinates on the plane at distance " + distance + " and at an angle relative to the player: " + anglerotation + ": " + GetCoords(player, distance, anglerotation).ToString()); } vector GetGoords(PlayerBase player, float distance, float anglerotation) { return GetPosFromDistAndAngle(player.GetPosition(), distance, player.GetOrientation()[0] + anglerotation); } vector GetPosFromDistAndAngle(vector pos, float dist, float angle) { angle = Math.NormalizeAngle(angle) * Math.DEG2RAD; pos[0] = pos[0] + (double)(Math.Sin(angle) * dist); //offset X pos[2] = pos[2] + (double)(Math.Cos(angle) * dist); //offset Y return pos; }  
      Это была задачка 1 и она была решена!
       
      далее надо решить более сложную задачу - она будет номер 2
       
      Надо вычислить координату не на плоскости, а вообще в пространстве, взяв в качестве поправок значения pitch и roll (наклон по поперечной и продольной осям) которые получаются из функции  обьект.GetOrientation() - первое значение масива типа вектор которое возвращает функция - угол на плоскости, второе угол в поперечной оси, третье в продольной (вроде так)
       
      те если игрок, да не важно, просто обьект, имеет наклон в поперечной оси 45 градусов (от так как этот слэш /), то точка под углом на плоскости относительно игрока 90град и расстоянии 2м "справа для него будет 'ниже', чем слева"
       
      врбщем -  нам надо получить координату под улом 90град на плоскости, 45град по вертикали и расстоянии 2м от него слева
       
      воот
       
      и тут у меня мозг взорвался (и почему-то захотелось вискаря)
       
      я понимаю что в данном случае нужно отталкиваться от поперечной вертикальной плоскости... но чет не догоняю как........
       
       
    • By 123new
      Нам понадобится:
      1. Сервер DayZ Standalone (см. тему вот эту)
      2. Notepad++: бесплатно на оф. сайте
      3. Немного времени и настойчивости (обычно бывает в комплекте и так)
       
      И так, начинаем:
      1. Открываем блокнотом mpmissions\dayzOffline.chernarusplus\init.c
      P.S. Имя папки dayzOffline.chernarusplus у вас может отличаться, будьте внимательны
      2. В начале файла добавляем:
      static int time_repeat_info_players = 10; //in seconds static string file_name_info_players = "$profile:PlayersLogFile.txt"; static void WriteFile(string file_name, string text) { private FileHandle fhandle; if ( !FileExist(file_name) ) { fhandle = OpenFile(file_name, FileMode.WRITE); } else { fhandle = OpenFile(file_name, FileMode.APPEND); } if ( fhandle == 0 ) { Print("[#Запись_в_файл]: Не удалось открыть файл для записи: " + file_name); Print("[#Запись_в_файл]: [Запись]: " + text); return; } FPrintln(fhandle, text); CloseFile(fhandle); } static void WritePlayersInfo() { array<Man> players = new array<Man>; Man player; Man player_test; GetGame().GetPlayers( players ); if (players.Count() > 0) { if ( FileExist(file_name_info_players) ) { DeleteFile(file_name_info_players); } for ( int i = 0; i < players.Count(); ++i ) { player_test = players.Get(i); if( player_test ) { PlayerIdentity p_identity = player_test.GetIdentity(); private string coord_pl = player_test.GetPosition().ToString(); private string Name_P = p_identity.GetName(); private string UID_P = p_identity.GetPlainId(); WriteFile(file_name_info_players, "User name: " + Name_P + " UID: " + UID_P + " Coords: " + coord_pl); } } } else { if ( FileExist(file_name_info_players) ) { DeleteFile(file_name_info_players); } } } Где 'PlayersLogFile.txt' меняем на нужное вам имя файла, а в 'time_repeat_info_players' настраиваем время повтора проверки списка игроков для перезаписи файла
      3. Находим в файле блок 'void main()' и в его конце перед закрывающей '}', поумолчанию это строка
      weather.SetWindFunctionParams(0.1, 0.3, 50); добавляем ниже строку:
      GetGame().GetCallQueue(CALL_CATEGORY_GAMEPLAY).CallLater(WritePlayersInfo, (time_repeat_info_players * 1000), true); 4. Готово, если не допустили ошибок, при наличии хотя бы 1 игрока на сервере ваш файл с данными по игрокам будет присутствовать и заполняться информацией, а в случае их отсутствия удаляться.
    • By BorizzK
      Нашел где и как она задается
       
      Файл MissionServer.c
       
      Функция
      void OnPreloadEvent(PlayerIdentity identity, out bool useDB, out vector pos, out float yaw, out int queueTime)
       
      Вызывается по эвенту PreloadEventTypeID: - при подключении игрока и постановке его в очередь
       
      Она возвращает queueTime в которой и будут те самые 15 сек
      Тк он возвращается пустой, сервер использует значение по умолчанию
      Если внутри функции изменить значение
      queueTime = 5;
      то будет нужное Вам время
       
      Соответственно переопределяем эту функцию в init.c или Вашем файле миссии в моде (или нет)
       
      override void OnPreloadEvent(PlayerIdentity identity, out bool useDB, out vector pos, out float yaw, out int queueTime) { if (GetHive()) { // Preload data on client by character from database useDB = true; queueTime = 1; //Делаем 1 сек } else { // Preload data on client without database //Вот это я не понял зачем useDB = false; pos = "1189.3 0.0 5392.48"; yaw = 0; queueTime = 1; //Делаем 1 сек } } Делаем 1 сек
       
      Вуаля...
       
  • Our picks

×
×
  • Create New...

Important Information

By using this site, you automaticly agree to our Guidelines and Privacy Policy.
We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.