Перейти к публикации
Поиск в
  • Дополнительно...
Искать результаты, содержащие...
Искать результаты в...
  • Нужна помощь?

    Создайте тему в соответствующем разделе
    Не нужно писать всё в чат!
  • Загляните на торговую площадку

    Там вы можете купить
    всё что касается игровых серверов
  • Не хотите бан?

    Пожалуйста, ознакомьтесь с нашими правилами
    Не нарушайте порядок!
  • Продаёте или покупаете?

    Пользуйтесь услугами гаранта
    Мы сделаем вашу сделку безопасной
  • 0
BorizzK

Получение координаты в пространстве под углом на расстоянии от текущей координаты с поправкой pitch и roll

Вобщем тема такая

 

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м от него слева

 

воот

 

и тут у меня мозг взорвался (и почему-то захотелось вискаря)
 

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

 

 

Изменено пользователем BorizzK (история изменений)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Рекомендованные сообщения

  • 0

Вот как-то так

 

Lmk5.gif

нужно найти координату этой точки (зеленый крест) относительно позиции игрока
углы - это yaw,pitch,roll

Изменено пользователем BorizzK (история изменений)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах





  • 0

С GetDirection не игрался? Если не ошибаюсь, то что-то в этом смысле должно подойти. Точнее тут сказать даже сложно, надо сидеть и анализировать что и относительно чего считается. По факту у тебя координаты игрока и есть положение игрока в 3 осях, GetOrientation вовзращает ориентацию игрока относительно стандартной точки расположения 0 0 0. GetDirection насколько помню на поворот влияло.

Изменено пользователем 123new (история изменений)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

123new GetDirection - это направление с учетом положения по 3м осям - не глы - типа шаг координат

те прибавив GetDirection  к Get Position и установив новое положение продвинемся вперед

 

Тут нужно что-то вроде

 

	static vector Get3DPosFromAngles(vector pos, vector orientation, float dist, float angle) //position on surface //orientation - yaw,pitch,roll - angles in degrees //distance to point //angle relative to the plane
	{
		float yaw 	= Math.NormalizeAngle(orientation[0] + angle) * Math.DEG2RAD; //normalize angle and translate it into radians
		float pitch = Math.NormalizeAngle(orientation[1]) * Math.DEG2RAD; //normalize angle and translate it into radians
		float roll	= Math.NormalizeAngle(orientation[2]) * Math.DEG2RAD; //normalize angle and translate it into radians
		
		pos[0] = pos[0] + (double)(Math.Sin(yaw) * Math.Cos(roll) * dist);
		pos[1] = pos[1] + (double)(Math.Sin(pitch) * dist);
		pos[2] = pos[2] + (double)(Math.Cos(yaw) * Math.Cos(pitch) * dist);
		return pos;
	}

в итоге передав в эту функцию позицию ориентацию расстояние и угол -90 (на плоскости) мы должны получить на выходе координату точки строго слева от игрока (-90 град) на расстоянии dist - независимо от наклона его тела

 

тупо в горизонтали (не учитывая pitch и roll) это решилось просто

 

	static vector GetPosFromAngles(vector pos, float yaw, float dist, float angle) //position on surface //distance on surface //angle on surface - final position on plate
	{
		yaw = Math.NormalizeAngle(yaw + angle) * Math.DEG2RAD; //normalize angle and translate it into radians
		pos[0] = pos[0] + (double)(Math.Sin(yaw) * dist); //vector modify X
		pos[2] = pos[2] + (double)(Math.Cos(yaw) * dist); //vector modify Y
		return pos; //result - point on surface relative to the original position with angle on plate and distance
	}

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

Вобщем yaw, pitch и roll

 

yaw - тут все ровно - угол на плоскости мира относительно оси Y (ну или X)

НО!

pitch это угол относительно оси Y системы координат обьекта, а не Y мира

roll это угол относительно оси X системы координат обьекта, а не X мира

 

потому и не взлетает

 

нам надо пересчитать углы pitch и roll в углы относительно системы координат мира и уже от них плясать

 

в теории зная YAW сделать это можно, но только пока непонятно как...

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

123new Direction это направление прямо - оно нам не подходит

 

pitch и roll, я выше походу был не совсем прав

это углы относительно оси Z, а не X и Y

 

правда это знание не приближает меня к решению задачи

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

То есть  угол наклона и склонения глобально вызвать нельзя?

 

(а что в любой точке не известен "уровень пола"?....вправо-влево плюс к z столько то....)

 

Изменено пользователем paranoyk (история изменений)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

paranoyk paranoyk есть yaw, угол на плоскости, он для всей сиcтемы един

А вот pitch и roll углы, они относительно осей x, y самого обьекта, те надо зная ориентацию обьекта, как-то вычислить его углы наклона относительно x,y мира...

 

Штатных функций для этого я не нашел

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

BorizzK Какой системы какой угол....

Это как бэ связанная система координат.

Поверни объект на 90 градусов на плоскости, и уже надо будет только наклонить его(что без разница) на 45 градусов, после чего отложить 2м вдоль вектора директории.

хочешь с синусами косинусами заморачивайся, или бери квантерионы эйлера, и векторку.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

NoNameUltima на плоскости проблем нет

 

повернул - не обьект - угол

обьект как стоял так и стоит - мне надо от него (от его координат) прямую построить на плоскости на нужную длину и получить координаты конечной точки

с этим проблем нет (выше есть решение)

 

скажем стоит обьект прямо - ориентация по оси Y

надо построить от него прямую линию влево - берем yaw обьекта - прибавляем к нему -90, нормализуем - получаем 270 итд итп

координаты точки слева получены

далее обьект поворачивается на угол roll вокруг оcи Y по часовой стрелке ( + его ось Y в данном случае совпадает с осью Y мира) - найденная точка поднимается вверх  по дуге (по поверрхности сферы, радиусом которой является отрезок заданный нами длины) - ( - и... как искать координату точки в данном случае?

 

после чего отложить 2м вдоль вектора директории. - это если вперед - ибо дирекшн можно получить

а мне надо расчитать другой дирекшн - влево и вверх

в прицнипе если это сделать - то ворос бы был снят

 

тк аналитическую геометрию и все что с ней связанно я изучал ну просто хрен знает когда и вобщем-то без особого энтузиазма, то врубиться в это все в лоб у меня не выходит (прям хоть учебник читай https://fictionbook.ru/author/d_v_beklemishev/kurs_analiticheskoyi_geometrii_i_lineyin/ )

 

тут на первой картинке 45 град. но суть не меняется

а на второй то что ищем если угол на поскости -90

ну а на третьей если угол на плоскости 45

 

 

Пожалуйста, Войдите или Зарегистрируйтесь, чтобы увидеть это: Вложение.

Пожалуйста, Войдите или Зарегистрируйтесь, чтобы увидеть это: Вложение.

Пожалуйста, Войдите или Зарегистрируйтесь, чтобы увидеть это: Вложение.

Изменено пользователем BorizzK (история изменений)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

NoNameUltima да
мне не надо поворачивать сам обьект

он должен оставаться в своей позиции

мне надо рпсчитать координаты

скажем - под углом -90град (слева) на плоскости

и под углом 45град слева вверх

те мне не обьект вращать надо

а лишь расчет провести и получить результат

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

Прочитал чуток вверх ответы и немного кукуха поехала на Мальдивы. На кой хрен куда-то прямые строить о координаты не пойми чего высчитывать то? Если есть координата, то она к какому-то объекту привязана, либо уравненна по высоте на плоскости-колиззии. А координаты пусты то получать - так смысл то какой в этом? Для смещения любого объекта? Так а не проще ли смещать сам объект на x координат в какую-то сторону и проверять точку?
Больше на изобретение колеса похоже.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

123new Нет - не проще

 

Мне нужно получить координату точки:

На расстоянии 1м Слева -45 град по горизонтали, вертикально: 45 относительно X, 45 относительно Y

 

Для примера - поднял левую руку вперед-влево вверх - все углы 45 град, зная длину руки (отрезка от моего центра до кончика руки) и координаты этого центра - мне надо получить координаты кончика руки, а если продолжить прямую - на расстоянии 2м.

 

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

 

Мне бы только понять - если Direction сложить с Position, то получится смещение в сторону Orientation - те вперед с учетом всех углов

На какое расстояние будет смещение?

 

Методом тыка добился приблизительно устраивающего меня смещения - умножаю Direction на 0.01 и результат умножаю на дистанцию выраженную в сантиметрах... но это приблизительно... а хотелось бы точнее

 

ща потестил  - чет как-то немного криво все выходит...

 

Изменено пользователем BorizzK (история изменений)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

BorizzK Один вопрос-можно узнать координату Y (уровень земли) на карте зная координаты Х и Z?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

paranoyk GetGame().SurfaceY(x, y);

Вернет тип float - высота поверхности.

 

Богемцы почему т высоту Y кличат...

Наверное там есть авиаторы

Изменено пользователем BorizzK (история изменений)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

BorizzK Она какбЭ везде Y. Это ты до 4 класса начальной школы, рисуя на геометрии графики, привыкал, что x,y - координаты на плоскости, и перейдя в 3 мерку, почему то все решают, что так и должно остаться, а Z должно являться высотой. Просто учителя так преподносили. Преподносили бы с нач. школы координаты как x,z - привык бы иначе, и перейдя в трехмерку вряд ли бы удивлялся.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

BorizzK Ааааа.....х= (D * cos A)+x1 y= (D*cos B) + y1 z= (D*cos C) + z1 Разве не даст координаты точки отстоящей на растоянии от координат?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

paranoyk даст, не не то

 

х= (D * cos A)+x1

y= (D*cos B) + y1

z= (D*cos C) + z1

 

x1,y1,z1 это что?

 

Я уж и вращать пытался

 

		float a = Math.NormalizeAngle(orientation[0] + angle) * Math.DEG2RAD;
		float b = Math.NormalizeAngle(orientation[1]) * Math.DEG2RAD;
		float c	= Math.NormalizeAngle(orientation[2]) * Math.DEG2RAD;

		float dx,dz,dy, dx1,dz1,dy1, dx2,dz2,dy2 = 0.0; //input //transforms //result
		
		dx = pos[0];
		dz = pos[1];
		dy = pos[2];
		
		dy1 = Math.Cos(a) * dy + Math.Sin(a) * dz;
		dz1 = -Math.Sin(a) * dy + Math.Cos(a) * dz; // поворот относительно X
		
		dx1 = Math.Cos(b) * dx - Math.Sin(b) * dz1;
		dz2 = Math.Sin(b) * dx + Math.Cos(b) * dz1; // поворот относительно OY
		
		dx2 = Math.Cos(c) * dx1 + Math.Sin(c) * dy1;
		dy2 = -Math.Sin(c) * dx1 + Math.Cos(c) * dy1; // поворот относительно OZ
		pos = pos + (Vector(dx2, dz2, dy2) * dist);
		return pos;

 

Изменено пользователем BorizzK (история изменений)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

BorizzK x1,y1,z1 это координаты "точки",то есть игрока
Хм...а если так
х=х1+ D*sin A

y=y1+D*sin B
z= z+D*cos(√ A²+B²)

 

А сюда я только заглянул и понял что мы кругом не правы.... http://wiki.gis-lab.info/w/Задачи_на_сфере:_прямая_геодезическая_задача

Изменено пользователем paranoyk (история изменений)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

paranoyk 

A B это какие углы?

 

фишка в том что  угол YAW он относительно  оси Y мира

а PITCH и ROLL вертикальные углы относительно осей Y и X самого обьекта

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

123new NoNameUltima paranoyk 

 

В EnMath3D.c есть горка функций

YawPitchRollMatrix

DirectionAndUpMatrix и другие

 

уверен, что используя их можно получить искомое

но что-то как-то непонятно как ими пользоваться...

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

BorizzK Yaw-относительно оси Х мира может?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

paranoyk 

 

X - это ось снизу карты вверх карты

Z - высота

Y - это ось слева карты вправо карты

 

Я про значения вектора установки координат в мире

X, Z,Y

 

 

 

задай обьекту - контейнеру например - Orientation 0 0 0 и увидишь что он будет направлен по оси Y карты

проверить это легко - если взять его DIrection и сложить с его текущими координатами и использовать эти координаты для установки его нового положения

в итоге объект сместится

а 90 0 0 по оси X

 

вообще YAW это вращение вокруг оси Z (вертикальной) - повороь вправо-влево

pitch вокруг поперечной - Y (наклон вперед назад)

roll вокруг продольной - X (наклон вправо влево)

 

вертикаль у нас для всех едина в мире

как не меняй первый параметр вектора ориентации - угол всегда относительно оси Y мира (вращение вокруг Z)

а вот вращение pitch/roll всегда вокруг осей Y и X самого обьекта

 

Но зная угол yaw, и зная нужный угол поворта относительно осей XY обьекта, мы можем пересчитать эти углы в углы мира - вот кактим образом это сделать мне непонятно

 

ну и как бы - запусти оффлайн от аркнсора - там в спавнере есть редактор положения обьекта с координатами и ориентацией - мышкой колесиком покрути  - сразу поймешь как обьект в мире расставляестя

 

Пожалуйста, Войдите или Зарегистрируйтесь, чтобы увидеть это: Вложение.

Изменено пользователем BorizzK (история изменений)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

paranoyk в дейзе yaw относительно Y - те если 0 направлен вдоль нее и direction соответствующий

остальные углы (которые pitch и roll) относительно Z

надо пересчитывать

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

BorizzK Дык это поворот Эйлера или как там....забыл уже,лет 30 прошло как изучал. Там идёт система повротов,причём последние два делаються по системе координат уже изменённым первым поворотом.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

paranoyk ага, так то оно так

Но чет фигня выходит

Сеня завтра продолжу

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите в него для комментирования

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

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас

  • Похожие публикации

    • Автор: BorizzK
      Есть игрок
      Есть его координаты 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'а есть готовая функция?
       
       
      Спасибо!
       
       
       
    • Автор: BorizzK
      Грамотные мать'и'матеги или геодезисты есть?
       
      Есть целевые координаты и ориентация yaw
       
      Скажем X = 6000, Y = 5000
      И эталонная угловая ориентация 110, 0, 0
       
      Мне нужно получить смещенные в отрицательную сторону координаты, что бы прямая из этих координат с эталонной ориентацией пересекала целевую точку с координатами X и Y, смещение должно зависеть от некой рандомной величины, да не важно - например при по X/Y 500 - startX = 5500, startY = 4500 - но  это для эталонной угловой ориентации 45 градусов
       
      Понимаю что надо считать используя синус/косинус/радиан, но тк дааавно все, что связанно чистой математикой/геометрией из головы выветрилось напрочь, туплю аццке
      Возможно есть и встроенный в enscript вариант...
       
      Сижу чешу репу пялясь на гору цисок которые надо на след неделе вводить в эксплуатацию.... А так хочется доделать свой вариант самолетика перевозящего различные грузы по миру...
       
      сорри за сумбур
    • Автор: Miduznya
      Мужики есть у кого карта dayz SA под арма3) ? просто дял себя хочу поставить поугарать маленько)
      В ЛС можно написать даже лучше)
    • Автор: BorizzK
      Чет затупил нещадно
      Делал как-то еще на 063 но куда-то дел код
       
      Получаем в цикле что на игроке и пытаемся получить что в вещах
      AttCount = player.GetInventory().AttachmentCount();
      for ( int i = 0; i < AttCount; i++ )
      {
      attachment = player.GetInventory().GetAttachmentFromIndex(i);
         if ( attachment.IsItemBase() )
         {
           SubAttCount = attachment.GetInventory().AttachmentCount();
           for ( int a = 0; a < SubAttCount; a++ )
           {
               subattachment = attachment.GetInventory().GetAttachmentFromIndex(a);
           }
         }
      }
       
      Если находится akm, то attachment.GetInventory().AttachmentCount(); и далее работает
      Если например куртка или штаны - то нет, чет запамятовал, как получить содержимое в случае курки, рюкзака???
      ...
       
      Спасибо!
  • Наш выбор

×
×
  • Создать...

Важная информация

Используя этот сайт, вы автоматически обязуетесь соблюдать наши Правила и Политика конфиденциальности.
Чтобы сделать этот веб-сайт лучше, мы разместили cookies на вашем устройстве. Вы можете изменить свои настройки cookies, в противном случае мы будем считать, что вы согласны с этим.