Четверг, 14 Ноября 2024, 10:02

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Направление между двумя векторами (Vector3)
robertonoДата: Пятница, 14 Ноября 2014, 08:22 | Сообщение # 1
Чокнутый Кот
Сейчас нет на сайте
Доброе утро!
Скажите пожалуйста, я забыл, что если от вектора отнять другой вектор? Это что я получу? Середину между ними? Направление? Помогите вспомнить пожалуйста.
Заранее спасибо


Сообщение отредактировал robertono - Воскресенье, 16 Ноября 2014, 13:12
ArtanielДата: Пятница, 14 Ноября 2014, 10:36 | Сообщение # 2
частый гость
Сейчас нет на сайте
Вектор получится.
Для начала если есть вектор X, то вектор -X это вектор той же длины в противоположную сторону.
Отнять X значит добавить -X.
Сумма векторов получается геометрически, к одному пристраиваем из конца второй.
Тут будет так же, из конца уменьшаемого строим вектор противоположный вычитаемому. Разностью будет вектор из начала уменьшаемого к концу этой схемки. (звучит страшно, но рисуется просто)

На уровне координат все еще проще
{x1,y1,z1}-{x2,x2,z2} = {x1-x2, y1-y2, z1-z2}

Для юнити все это справедливо.


Сообщение отредактировал Artaniel - Пятница, 14 Ноября 2014, 10:38
robertonoДата: Пятница, 14 Ноября 2014, 22:45 | Сообщение # 3
Чокнутый Кот
Сейчас нет на сайте
Artaniel, Все равно почти не понял и мой мозг начал нагреваться как процессор моего старого компа без куллеров. Ладно.
В теории все понятно, это просто отнимается. Я писал уже свой класс вектора (нужно было для сервера), где реализовывал вычитание.
Но где и в каком случае такая операция применяется? Когда нужно.. что? Что потом с этим результатом делают? Если не считать изменение позиции (отнимание вектора от вектора что бы узнать позицию).
Разве эта операция не дает узнать середину или направление?

Как узнать направление между двумя векторами?
Andrey_VolkovДата: Суббота, 15 Ноября 2014, 00:27 | Сообщение # 4
частый гость
Сейчас нет на сайте
robertono, его никак нельзя узнать, потому что его не существует) Задавайте вопрос корректно wink
MANMANAДата: Суббота, 15 Ноября 2014, 00:41 | Сообщение # 5
почти ветеран
Сейчас нет на сайте
http://www.physbook.ru/index.php/Сложение_векторов

"направление между векторами", исходящими из одной точки, а точнее результирующий вектор, можешь узнать по правилу параллелограмма.


http://www.3dbuffer.com/ Текстуры, Unity3D, Blender: Эффекты, скрипты, моделирование, текстурирование, скульптинг
VKонтакте 3Dbuffer

Последнее:

Новый раздел "Текстуры"

Как запатентовать, защитить техническое решение, игру, идею
ArtanielДата: Суббота, 15 Ноября 2014, 11:30 | Сообщение # 6
частый гость
Сейчас нет на сайте
Не вполне понял что имеется ввиду под "направлением". Любой вектор указывает какое то направление, кроме того имеет длину. Направление всегда можно превратить в конкретные углы через Vector3.Angle() с осями типа Vector3.up или ктототам.transform.forward
Возможно под "направление между векторами" вы имели ввиду угол между векторами? Тогда Vector3.Angle() - оно. Но одним углом направление не задашь, разве что в 2d.

Где применяется.
Например у нас есть турель которой надо автоматически повернуться в сторону мишени.
У нас есть вектор положения турели (Vector3 TurretPosition) и вектор положения мишени (Vector3 TargetPosition).
Чтобы узнать куда повернуться надо получить вектор из конца вектора TurretPosition в конец вектора TargetPosition.
Вот тут нужно бы рисунок, но вцелом несложно узнать что это будет
Vector3 TurretDirrection = TargetPosition - TurretPosition;
Длина (магнитуда) этого вектора это расстояние от турели до цели.
Например если у нас есть текущее направление турели, то мы можем легко получить куда надо поворачивать турель и на сколько ее нужно провернуть за фрейм через Vector3.Angle() от этих двух векторов.

Еще часто использую, если надо убрать вертикальную составляющую (спроектировать на горизонтальную плоскость) достаточно просто вычесть её. Где то так
VVV -= VVV.y*Vector3.up;
KamiRoninДата: Суббота, 15 Ноября 2014, 12:17 | Сообщение # 7
почти ветеран
Сейчас нет на сайте
алгебра для геймдевелопера и тут от нашего резидента Poq

Цитата Artaniel ()
Не вполне понял что имеется ввиду под "направлением". Любой вектор указывает какое то направление, кроме того имеет длину

вектор как класс в Юнити это 3D координата ТОЧКИ - х, y, z.
Направление из одной точки (описанной вектором) в сторону другой (еще один вектор) - есть другой вектор, в элементах которого указывается числа обозначающие смещения из одного вектора в другой ("направление"). Вычисляется как раз через разницу двух векторов (первый дальняя точка, второй из, которой будет осуществлять движение по направлению).


Мыслю - значит программирую...
Конструктивная критика - умных ведет к совершенству...
Великие умы обсуждают идеи, средние - обсуждают поступки, а малые - людей.
-l33t-h4xx-Дата: Суббота, 15 Ноября 2014, 13:16 | Сообщение # 8
участник
Сейчас нет на сайте
Цитата robertono ()
Когда нужно.. что?

Ты, наверное, думаешь, что в векторном исчислении всё испещрено геометрическими смыслами, но это не совсем так. Вычитание там наличествует только для полноты теории и по сути не больше чем разновидность сложения. Зачем городить модели дальше этого - непонятно.


Как правильно задавать вопросы
ArtanielДата: Суббота, 15 Ноября 2014, 21:18 | Сообщение # 9
частый гость
Сейчас нет на сайте
Цитата KamiRonin ()
Цитата Artaniel ()
Не вполне понял что имеется ввиду под "направлением". Любой вектор указывает какое то направление, кроме того имеет длину

вектор как класс в Юнити это 3D координата ТОЧКИ - х, y, z.


Не всегда. Есть например Rigidbody.velocity Тоже вектор, тоже с координатами, но это не координаты точки, это только координаты вектора скорости. Так же с силами, ускорением свободного падения и практически чем угодно кроме вектора position.
Я имел ввиду что задавая вектор (задавая координаты) мы уже задаем направление. Ну и длину кроме того. Отдельное действия превращающего вектор в направление не имеет смысла. По крайней мере пока не ясно что человек имел ввиду под направлением.
robertonoДата: Суббота, 15 Ноября 2014, 22:21 | Сообщение # 10
Чокнутый Кот
Сейчас нет на сайте
Поясню что в моём понимание направление в векторах.
Это когда посредством вектора задается направление.
Например:
Сейчас наш персонаж находится на
Код
10,3,20

Направление для прыжка будет выглядеть так :
Код
0,1,0

Vector3.Up это тоже самое.
Можно просто сложить направление и позицию персонажа. Но тогда он телепортируется. Поэтому это делается через время. Т.е.
Код
player.position = 0,1,0 (направление) * Time.deltaTime * speed;
.

Какое направление я хочу получить из двух векторов ? Расскажу как это было бы в 2д плоскости.
Точка A находится в 0,0 , а точка B в 10,10
Исходя из этого направление будет 1,1 (хотя в принципе если для этого есть формула, то получится 0.5,0.5, потому что это вычисление работает не по квадрату а по сфере).

Ясно изъяснился?
ArchidoДата: Суббота, 15 Ноября 2014, 22:59 | Сообщение # 11
Сэнсэй
Сейчас нет на сайте
robertono
Тебе единичный вектор нужен что ли? Делай normalize результирующему вектору после вычитания.


C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)
berilДата: Воскресенье, 16 Ноября 2014, 02:59 | Сообщение # 12
Я не ленивый, я — энергосберегающий
Сейчас нет на сайте
Vector3 distance = target.position - transform.position;
Мы объявляем переменную distance, которая хранит вектор с началом в положении самого объекта и с концом в конечной точке назначения. target.position - это точека назначения Т.е. получаем точку, куда идти, отнимаем от нее текущую точку и получаем нужный вектор.




Накодил? Убери за собой!
Инвентарь в Unity(UI)
Инвентарь в Unity(GUI)
robertonoДата: Воскресенье, 16 Ноября 2014, 11:59 | Сообщение # 13
Чокнутый Кот
Сейчас нет на сайте
beril, вот, это и был вопрос моей темы, спасибо smile
Archido, Я не знаю что вообще в принципе делает normalize. Объясните?
ArtanielДата: Воскресенье, 16 Ноября 2014, 12:15 | Сообщение # 14
частый гость
Сейчас нет на сайте
Цитата robertono ()
Archido, Я не знаю что вообще в принципе делает normalize. Объясните?

Превращает любой вектор в вектор направленный в том же направлении, но длиной в 1.
Иначе говоря выбрасывает длину, сохраняет только направление. Удобно потом умножать его на число, как у вас в примере выше было.
ArchidoДата: Воскресенье, 16 Ноября 2014, 12:27 | Сообщение # 15
Сэнсэй
Сейчас нет на сайте
Цитата robertono ()
Я не знаю что вообще в принципе делает normalize. Объясните?

Приводит вектор к единичной длине, т.е. значения его компонентов (x, y, z) не будут превышать единицу по модулю.
Если из одной точки вычесть другую - получим вектор направления, но длина его будет равна расстоянию между этими точками. Возьмем твой пример выше, если из B(10; 10) вычесть A(0; 0), то получим вектор направления Dir(10; 10), далее нормируем его (normalize) и получаем Dir(~0.7; ~0.7);


C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)

Сообщение отредактировал Archido - Воскресенье, 16 Ноября 2014, 12:36
robertonoДата: Воскресенье, 16 Ноября 2014, 12:57 | Сообщение # 16
Чокнутый Кот
Сейчас нет на сайте
Хорошо, теперь все стало намного понятнее. Ну тогда последний вопрос что бы я все понял до самого конца)

Если от A отнять B я получу вектор направления (потом я могу его нормализовать что бы выглядело красивее и было удобнее работать). Но этот вектор направления в какую сторону указывает? От A с направлением на B или наоборот?
ArchidoДата: Воскресенье, 16 Ноября 2014, 13:04 | Сообщение # 17
Сэнсэй
Сейчас нет на сайте
Цитата robertono ()
От A с направлением на B или наоборот?

Наоборот. Из чего вычитаешь - туда и будет указывать.


C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)
robertonoДата: Воскресенье, 16 Ноября 2014, 13:11 | Сообщение # 18
Чокнутый Кот
Сейчас нет на сайте
Ну тогда понятно, всем огромное спасибо, сейчас плюсики раздам biggrin
А решение сохраню здесь, мне и может другим кто эту тему найдет я не знаю.

------------------

C = A - B -- направление в сторону A
C.normalize -- нормализованное направление в сторону A (Clamp01)
berilДата: Воскресенье, 16 Ноября 2014, 18:06 | Сообщение # 19
Я не ленивый, я — энергосберегающий
Сейчас нет на сайте
Да посмотри еще это (если еще не смотрел) тык, думаю пригодится



Накодил? Убери за собой!
Инвентарь в Unity(UI)
Инвентарь в Unity(GUI)
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг