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

 

воот

 

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

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

 

 

Edited by BorizzK (see edit history)

Share this post


Link to post
Share on other sites

Recommended Posts

  • 0

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

 

Lmk5.gif

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

Edited by BorizzK (see edit history)

Share this post


Link to post
Share on other sites



  • 0

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

Edited by 123new (see edit history)

Share this post


Link to post
Share on other sites
  • 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
	}

 

Share this post


Link to post
Share on other sites
  • 0

Вобщем yaw, pitch и roll

 

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

НО!

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

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

 

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

 

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

 

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

Share this post


Link to post
Share on other sites
  • 0

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

 

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

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

 

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

Share this post


Link to post
Share on other sites
  • 0

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

 

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

 

Edited by paranoyk (see edit history)

Share this post


Link to post
Share on other sites
  • 0

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

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

 

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

 

Share this post


Link to post
Share on other sites
  • 0

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

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

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

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

Share this post


Link to post
Share on other sites
  • 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

 

 

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

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

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

Edited by BorizzK (see edit history)

Share this post


Link to post
Share on other sites
  • 0

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

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

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

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

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

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

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

 

Share this post


Link to post
Share on other sites
  • 0

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

Share this post


Link to post
Share on other sites
  • 0

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

 

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

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

 

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

 

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

 

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

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

 

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

 

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

 

Edited by BorizzK (see edit history)

Share this post


Link to post
Share on other sites
  • 0

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

Share this post


Link to post
Share on other sites
  • 0

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

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

 

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

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

Edited by BorizzK (see edit history)

Share this post


Link to post
Share on other sites
  • 0

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

Share this post


Link to post
Share on other sites
  • 0

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

 

Share this post


Link to post
Share on other sites
  • 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;

 

Edited by BorizzK (see edit history)

Share this post


Link to post
Share on other sites
  • 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/Задачи_на_сфере:_прямая_геодезическая_задача

Edited by paranoyk (see edit history)

Share this post


Link to post
Share on other sites
  • 0

paranoyk 

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

 

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

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

Share this post


Link to post
Share on other sites
  • 0

123new NoNameUltima paranoyk 

 

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

YawPitchRollMatrix

DirectionAndUpMatrix и другие

 

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

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

Share this post


Link to post
Share on other sites
  • 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 обьекта, мы можем пересчитать эти углы в углы мира - вот кактим образом это сделать мне непонятно

 

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

 

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

Edited by BorizzK (see edit history)

Share this post


Link to post
Share on other sites
  • 0

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

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

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

 

 

Share this post


Link to post
Share on other sites
  • 0

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

 

Share this post


Link to post
Share on other sites
  • 0

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

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

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

 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Similar Content

    • By 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'а есть готовая функция?
       
       
      Спасибо!
       
       
       
    • By BorizzK
      Грамотные мать'и'матеги или геодезисты есть?
       
      Есть целевые координаты и ориентация yaw
       
      Скажем X = 6000, Y = 5000
      И эталонная угловая ориентация 110, 0, 0
       
      Мне нужно получить смещенные в отрицательную сторону координаты, что бы прямая из этих координат с эталонной ориентацией пересекала целевую точку с координатами X и Y, смещение должно зависеть от некой рандомной величины, да не важно - например при по X/Y 500 - startX = 5500, startY = 4500 - но  это для эталонной угловой ориентации 45 градусов
       
      Понимаю что надо считать используя синус/косинус/радиан, но тк дааавно все, что связанно чистой математикой/геометрией из головы выветрилось напрочь, туплю аццке
      Возможно есть и встроенный в enscript вариант...
       
      Сижу чешу репу пялясь на гору цисок которые надо на след неделе вводить в эксплуатацию.... А так хочется доделать свой вариант самолетика перевозящего различные грузы по миру...
       
      сорри за сумбур
    • By Miduznya
      Мужики есть у кого карта dayz SA под арма3) ? просто дял себя хочу поставить поугарать маленько)
      В ЛС можно написать даже лучше)
    • By 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(); и далее работает
      Если например куртка или штаны - то нет, чет запамятовал, как получить содержимое в случае курки, рюкзака???
      ...
       
      Спасибо!
  • 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.