Raycasthit unity что это

RaycastHit

struct in UnityEngine

Success!

Thank you for helping us improve the quality of Unity Documentation. Although we cannot accept all submissions, we do read each suggested change from our users and will make updates where applicable.

Submission failed

For some reason your suggested change could not be submitted. Please try again in a few minutes. And thank you for taking the time to help us improve the quality of Unity Documentation.

Description

Structure used to get information back from a raycast.

Properties

articulationBodyThe ArticulationBody of the collider that was hit. If the collider is not attached to an articulation body then it is null.
barycentricCoordinateThe barycentric coordinate of the triangle we hit.
colliderThe Collider that was hit.
distanceThe distance from the ray’s origin to the impact point.
lightmapCoordThe uv lightmap coordinate at the impact point.
normalThe normal of the surface the ray hit.
pointThe impact point in world space where the ray hit the collider.
rigidbodyThe Rigidbody of the collider that was hit. If the collider is not attached to a rigidbody then it is null.
textureCoordThe uv texture coordinate at the collision location.
textureCoord2The secondary uv texture coordinate at the impact point.
transformThe Transform of the rigidbody or collider that was hit.
triangleIndexThe index of the triangle that was hit.

Is something described here not working as you expect it to? It might be a Known Issue. Please check with the Issue Tracker at issuetracker.unity3d.com.

Copyright ©2021 Unity Technologies. Publication Date: 2021-11-26.

Источник

Русские Блоги

Краткое введение в Ray и RaycastHit в Unity

Скобки обращены соответственно к точке излучения луча, направлению луча, максимальному расстоянию луча, пояс обнаружения не имеет коллайдера, и неколлайдер не может поразить другой объект

В документации API приведены только эти методы:

public static bool Raycast(Ray ray, RaycastHit hitInfo, float distance, int layerMask);

public static bool Raycast(Ray ray, float distance, int layerMask);

public static bool Raycast(Vector3 origin, Vector3 direction, float distance, int layerMask);

2. RaycastHit Класс используется для хранения информации о столкновениях, созданной после испускания луча. Обычно используются следующие переменные-члены: коллайдер, в котором коллайдер сталкивается с лучом.
distance Расстояние от начальной точки луча до точки пересечения луча и коллайдера.
normal Нормальный вектор луча, входящего в плоскость.
point Координаты точки пересечения луча и коллайдера (объект Vector3)

Посмотрим, что за чертовщина RaycastHit.

Сначала объявите переменную попадания типа RaycastHit.После метода Physics.Raycast () переменная попадания несет некоторую информацию об объекте, с которым столкнулся луч.

Какую информацию это включает? Как показано на рисунке:

Raycasthit unity что это. b2549775e10842725398900bc4bfae35. Raycasthit unity что это фото. Raycasthit unity что это-b2549775e10842725398900bc4bfae35. картинка Raycasthit unity что это. картинка b2549775e10842725398900bc4bfae35

(Для концепций, которых вы не знаете, напишите простой код, чтобы попробовать его самостоятельно, вы получите много пользы!)

Здесь мы используем Hit для получения информации о преобразовании. Можно ли с помощью преобразования куба не управлять его движением?

Луч: В программе его можно понимать как луч, который представляет собой луч из определенного положения (исходной точки) в определенное направление (направление);

луч: информация о структуре луча, включая начальную точку и направление; то есть луч

hitinfo: информация об объекте, пораженном этим лучом;

maxDistance: максимальное расстояние этого луча;

Источник

Упрощённые рейкасты в Unity

Raycasthit unity что это. image loader. Raycasthit unity что это фото. Raycasthit unity что это-image loader. картинка Raycasthit unity что это. картинка image loader

На данный момент я в основном занимаюсь визуализациями данных, работой с дополненной реальностью, AR/VR и интерактивными стендами на выставках. В одной из задач было необходимо визуализировать огромный граф с данными в виртуальной реальности, который состоял из порядка 10000 тысяч объектов. И классическая физика в Юнити оказалась слишком медленной. Но прежде чем “писать своё с блекджеком и куртизанками”, давайте пройдёмся по тому, о чём нужно знать и что нужно делать при работе с физикой Unity.

Советы и нюансы по работе с встроенной физикой

Raycasthit unity что это. cf98de44f75bef7ae18890207c6e941b. Raycasthit unity что это фото. Raycasthit unity что это-cf98de44f75bef7ae18890207c6e941b. картинка Raycasthit unity что это. картинка cf98de44f75bef7ae18890207c6e941b

На самом деле большую часть про это можно прочесть в этом материале https://learn.unity.com/tutorial/physics-best-practices#5c7f8528edbc2a002053b5b4 Не хочется особо сильно повторяться про “простые коллайдеры лучше”, кроме самого важного совета, который я не устану повторять. Если объект подвижен и на нём есть коллайдер или триггер, то на нём должно быть Rigidbody. А вот из того, что тут не сказано в Unity есть возможность управлять обсчётом физики в ручную. В классе Physics во-первых, есть bool переменная autoSimulate (так же есть в настройках) и метод Simulate, чтобы посчитать кадр физики. В целом у этого есть две основные проблемы: это всё работает только в главном потоке и оно посчитает всё. Вот вообще всё. Коллизии, что там с джоинтами и т.п. И это не очень удобно как раз в случае описанном выше.

В общем в AR/VR задачах часто встречается такое, что сами по себе коллизии тебе не особо нужны. В первую очередь интересны рейкасты, и недостаток встроенной физики юнити (то есть интеграции PhysX) что нельзя пользоваться рейкастами просто отключив коллизии. Даже елси вы выключите всю матрицу со слоями коллизий система всё равно производит расчёты для коллизий. И это не позволяет решать какие-то задачи. В плюс к тому ресурсы в AR на мобильных телефонах или в VR на standalone системах (типа Oculus Quest) довольно ограничены. Поэтому экономить приходится на всём.

Собственно в задаче с графом, мне нужны были только рейкасты для того, чтобы отображать информацию по вершинам и перемещаться по графу.

Пишем своё или зачем нужно знать математику

Raycasthit unity что это. 11940cb517b8df5d3be7ac07f746d389. Raycasthit unity что это фото. Raycasthit unity что это-11940cb517b8df5d3be7ac07f746d389. картинка Raycasthit unity что это. картинка 11940cb517b8df5d3be7ac07f746d389

Сферический коллайдер

Сферический коллайдер на самом деле покрывает большую часть необходимого в данной задаче. Считается он довольно просто, даже с получением позиции пересечения луча и коллайдера.

В контексте Unity проверка пересечения будет выглядеть вот так:

А теперь посмотрим, как выглядит математика сферического коллайдера. Из аналитической геометрии мы знаем, что если у нас есть сфера с центром (x0, y0, z0) и радиус r, то все точки (x, y, z) находящиеся на этой сфере можно описать, как:

Raycasthit unity что это. 8aa339b3946bc257a51784fedf86ea2c. Raycasthit unity что это фото. Raycasthit unity что это-8aa339b3946bc257a51784fedf86ea2c. картинка Raycasthit unity что это. картинка 8aa339b3946bc257a51784fedf86ea2c

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

Raycasthit unity что это. 90143bf1ee6006cfd03fbdbe5924787a. Raycasthit unity что это фото. Raycasthit unity что это-90143bf1ee6006cfd03fbdbe5924787a. картинка Raycasthit unity что это. картинка 90143bf1ee6006cfd03fbdbe5924787a

Raycasthit unity что это. 016b61e888e7bb797463cba3c338cf67. Raycasthit unity что это фото. Raycasthit unity что это-016b61e888e7bb797463cba3c338cf67. картинка Raycasthit unity что это. картинка 016b61e888e7bb797463cba3c338cf67

Уравнение же прямой выглядит, как

Raycasthit unity что это. 104a49498da34583dbd2086d8524dea2. Raycasthit unity что это фото. Raycasthit unity что это-104a49498da34583dbd2086d8524dea2. картинка Raycasthit unity что это. картинка 104a49498da34583dbd2086d8524dea2

При существовании пересечения окружности и луча. P = p(t). И подставив всё в исходное уравнение окружности и раскрыв все скобки мы получим уравнение вида.

Raycasthit unity что это. 41eadde7c0bd46dae452836a8d14d2d6. Raycasthit unity что это фото. Raycasthit unity что это-41eadde7c0bd46dae452836a8d14d2d6. картинка Raycasthit unity что это. картинка 41eadde7c0bd46dae452836a8d14d2d6

что в свою очередь является стандартным квадратным уравнением вида:

Raycasthit unity что это. 9e03c2a4101a4eb308536052ae341e23. Raycasthit unity что это фото. Raycasthit unity что это-9e03c2a4101a4eb308536052ae341e23. картинка Raycasthit unity что это. картинка 9e03c2a4101a4eb308536052ae341e23

Raycasthit unity что это. e5ef7d0fee4d2a660b66afe7019c947d. Raycasthit unity что это фото. Raycasthit unity что это-e5ef7d0fee4d2a660b66afe7019c947d. картинка Raycasthit unity что это. картинка e5ef7d0fee4d2a660b66afe7019c947dRaycasthit unity что это. 9b588fc351de8523531fb02187e721b1. Raycasthit unity что это фото. Raycasthit unity что это-9b588fc351de8523531fb02187e721b1. картинка Raycasthit unity что это. картинка 9b588fc351de8523531fb02187e721b1Raycasthit unity что это. 8333b9a1b2068268f08b4fe19ccfdff1. Raycasthit unity что это фото. Raycasthit unity что это-8333b9a1b2068268f08b4fe19ccfdff1. картинка Raycasthit unity что это. картинка 8333b9a1b2068268f08b4fe19ccfdff1

или если записать чуть более читаемо

Raycasthit unity что это. 9a5567eeb0fca7842d5584cb613ab352. Raycasthit unity что это фото. Raycasthit unity что это-9a5567eeb0fca7842d5584cb613ab352. картинка Raycasthit unity что это. картинка 9a5567eeb0fca7842d5584cb613ab352Raycasthit unity что это. 1fe3ee328971a5eaa160b6868e836f22. Raycasthit unity что это фото. Raycasthit unity что это-1fe3ee328971a5eaa160b6868e836f22. картинка Raycasthit unity что это. картинка 1fe3ee328971a5eaa160b6868e836f22Raycasthit unity что это. b928cab048b1bd6de17ee7aca9b3e858. Raycasthit unity что это фото. Raycasthit unity что это-b928cab048b1bd6de17ee7aca9b3e858. картинка Raycasthit unity что это. картинка b928cab048b1bd6de17ee7aca9b3e858

и мы приходим к старому доброму школьному дискриминанту, что t так же равно

Raycasthit unity что это. 5094a77f2c8bea2aec51f54e2083a88b. Raycasthit unity что это фото. Raycasthit unity что это-5094a77f2c8bea2aec51f54e2083a88b. картинка Raycasthit unity что это. картинка 5094a77f2c8bea2aec51f54e2083a88b

Мы знаем из математики, что если:

Дискриминант меньше нуля, то луч не пересекает сферу (так как не существует решений уравнения)

Дискриминант равен 0, то луч касается сферы в одной точке (касательная, ровно одно решение)

Дискриминант больше 0, луч пересекает сферу в двух точках (два решения)

Это уже спокойно превращается в код выше.

Для кубического коллайдера код можно посмотреть в репозитории и разобрать самостоятельно. Опирался на эту статью, но на данный момент там есть проблема с поворотами, так как куб описывается, как 2 точки угла куба. https://www.researchgate.net/publication/220494140_An_Efficient_and_Robust_Ray-Box_Intersection_Algorithm

Хватит бороться с Unity

Итак, коллайдеры есть. А что по лучам? На самом деле для меня самое странное во многих плагинах и библиотеках под Unity, что многие не используют фишки Unity, а пишут своё поверх Unity. Мы так делать конечно же не будем. В юнити есть замечательная вещь под названием EventSystem, про примеры использования которой я писал в этой статье. Но из важного для нашей системы она позволяет вешать на камеру рейкастеры, которые работают с интерфейсами IPointerDownHadler и т.п. на объектах. И ничего не мешает создать новый рейкастер под нашу систему рейкастов.

Мы просто наследуемся от класса BaseRaycaster реализуем метод Raycast, заполняя правильно List resultAppendList и всё, наша физика работает с EventSystem.

Метод ComputeRayAndDistance формирования луча и расчёта индекса дисплея нужен для поддержки нескольких экранов. В целом в Unity много крутых систем, и я очень рекомендую изучить то, как они кастомизируются.

А что по производительности?

Я сделал несколько тестов для демонстрации работы данного подхода.

Выигрыш на большом числе объектов (учитывая что в видео ещё на перфоманс влияет Unity Recorder) довольно ощутимый. Самостоятельно можно посмотреть и протестировать в репозитории на своём железе. Но конечно же система даже на CPU работает быстрее, чем PhysX в подобном случае.

А можно ли сделать быстрее?

Да, это довольно простая система, которая была написана за несколько часов, в которой на данный момент даже не весь функционал поддерживается. Но путей к улучшению здесь ещё много. В первую очередь конечно же логика обхода коллайдеров. Сейчас система работает на линейной скорости, что неплохо, но можно в разы лучше. Для этого нужно интегрировать технику под названием “двоичное разбиение пространства” (Binary Space Partitioning или BSP). Построение BSP-дерева по сути позволяет нам в случае огромного числа объектов увеличить скорость обсчёта коллизий за счёт лучшего разбиения пространства. Но тут уже в ход идут нюансы. Чтобы оно работало действительно быстрее нужно либо формировать дерево в ручную, когда объекты (в случае графа актуально) нашли точку равновесия и больше не перемещаются. Либо же писать алгоритм динамического изменения дерева, что в общем добавит нагрузки на систему и в этом случае уже нужно искать некий баланс между алгоритмом обновления BSP дерева и поиском рейкастов. В целом BSP это довольно полезная штука. Она используется для occlusion culling и других вещей в трёхмерной графике.

В заключении

Полное решение вы можете найти по ссылке. Может кому-то пригодится и будет полезно, если вдруг нужно будет визуализировать огромный массив данных. Надеюсь появится время написать ещё про интересную укладку графов в трёхмерном пространстве и компьют шейдеры, если кому-это данная тема интересна.

Источник

Physics.Raycast

Успех!

Благодарим вас за то, что вы помогаете нам улучшить качество документации по Unity. Однако, мы не можем принять любой перевод. Мы проверяем каждый предложенный вами вариант перевода и принимаем его только если он соответствует оригиналу.

Ошибка внесения изменений

По определённым причинам предложенный вами перевод не может быть принят. Пожалуйста попробуйте снова через пару минут. И выражаем вам свою благодарность за то, что вы уделяете время, чтобы улучшить документацию по Unity.

Параметры

originThe starting point of the ray in world coordinates.
direction@param ray Начальная точка и направление луча.
maxDistanceThe max distance the ray should check for collisions.
layerMaskA Layer mask that is used to selectively ignore Colliders when casting a ray.
queryTriggerInteractionSpecifies whether this query should hit Triggers.

Возврат значений

Описание

You may optionally provide a LayerMask, to filter out any Colliders you aren’t interested in generating collisions with.

Specifying queryTriggerInteraction allows you to control whether or not Trigger colliders generate a hit, or whether to use the global Physics.queriesHitTriggers setting.

This example creates a simple Raycast, projecting forwards from the position of the object’s current position, extending for 10 units.

Notes: Raycasts will not detect Colliders for which the Raycast origin is inside the Collider.

If you move Colliders from scripting or by animation, you need to allow at least one FixedUpdate to be executed so that the physics library can update before a Raycast will hit the Collider at its new position.

Параметры

originThe starting point of the ray in world coordinates.
direction@param ray Начальная точка и направление луча.
hitInfoIf true is returned, hitInfo will contain more information about where the collider was hit (See Also: RaycastHit).
maxDistanceThe max distance the ray should check for collisions.
layerMaskA Layer mask that is used to selectively ignore colliders when casting a ray.
queryTriggerInteractionSpecifies whether this query should hit Triggers.

Возврат значений

Описание

Casts a ray against all colliders in the scene and returns detailed information on what was hit.

This example reports the distance between the current object and the reported Collider:

This example re-introduces the maxDistance parameter to limit how far ahead to cast the Ray:

Параметры

ray@param ray Начальная точка и направление луча.
maxDistanceThe max distance the ray should check for collisions.
layerMaskA Layer mask that is used to selectively ignore colliders when casting a ray.
queryTriggerInteractionSpecifies whether this query should hit Triggers.

Возврат значений

Описание

Параметры

ray@param ray Начальная точка и направление луча.
hitInfoIf true is returned, hitInfo will contain more information about where the collider was hit (See Also: RaycastHit).
maxDistanceThe max distance the ray should check for collisions.
layerMaskA Layer mask that is used to selectively ignore colliders when casting a ray.
queryTriggerInteractionSpecifies whether this query should hit Triggers.

Возврат значений

Описание

This example draws a line along the length of the Ray whenever a collision is detected:

Источник

Погружение в скрипты игрового движка Unity3d, ч.1

Игровой объект

Создание нового игрового объекта с именем MyObject.
Созданный объект будет доступен по ссылку myObject.

Поиск объекта по его имени.

Теги можно использовать для помечания группы объектов со сходными свойствами, либо использующиеся в единой сцене.
Поиск объекта по тегу, возвращает единственный объект:

Возвращает список всех объектов с указанным тегом:

Проверка на наличие у объекта требуемого тега. Возвращает true, если у указанного объекта имеется тег MyTag:

Уничтожение объекта через минуту, после его создания:

Возвращает компонент component, привязанный к объекту GameObject, либо null, если объект не содержит данного компонента. Может использоваться, например, для доступа к другим скриптам, привязанным к объекту.

Возвращает все имеющиеся у объекта компоненты типа componentType.

Привязать компонент myComponent к объекту GameObject и получить ссылку на него.

Положение игрового объекта

Свойство transform объекта GameObject содержит в себе данные о положении объекта в игровом мире.

Возвращает глобальные координаты объекта в игровом мире. Возвращаемая величина имеет тип Vector3, который представляет из себя список из 3 координат — x, y и z:

Переместить объект в точку 0, 10, 0 игрового мира.

Тоже самое, что и в случае глобальных координат, но с локальными. Локальные координаты расситываются относительно родительского объекта. В случае отсутствия родительского объекта локальные координаты совпадают с глобальными:

Поворот объекта в углах Эйлера. Метод также возвращает координаты в виде объекта Vector3:

Тоже самое, что и предыдущий пример, но поворот объекта рассчитывается относительно родительского объекта:

Текущий угол поворота объекта, основанный на кватернионах. Возвращает объект типа Quaternion.

Текущий поворот объекта, основанный на кватернионах, но относительно родительского объекта:

Сброс угла поворота объекта:

Вращаем наш объект в указанную сторону со скоростью 1 градус в секунду. Принимает в качестве координат объект типа Vector3. Метод deltaTime объекта Time содержит время в секундах, затраченное на выполнение предыдущего кадра:

Тоже самое, что и предыдущий пример, но вращение объекта относительно координат родителя:

Перемещаем наш объект в указанном направлении со скоростью 1 юнит в секунду. Также принимает в качестве координат объект класса Vector3:

Физические свойства игрового объекта

Метод rigidbody объекта GameObject хранит в себе его физические свойства. Прежде, чем использовать метод rigidbody, его необходимо добавить к игровому объекту.

Получаем/задаем вектор скорости объекта:

Сила противодействия объекта. Может использоваться для замедления скорости, в среде с отсутствующей силой трения. Наиболее часто используется для замедления падающих объектов, например при создании парашюта. Принимает в качестве параметра целое число:

Задание массы объекту. Рекомендуется использовать массу в пределах от 0.1 до 10. Использование слишком больших значений может привести к непредсказуемым результатам при расчете физики:

Влияние на объект гравитации. Принимает в качестве параметра булево значение. Позволяет отключить влияние гравитации на отдельные объекты:

Влияние физики на игровой объект. Позволяет отключить частично, либо полностью влияние физических законов на объект:

Запрет на вращение объекта. Наиболее часто используется, когда необходимо сохранить определенный угол поворота даже после столкновения с другими объектами:

Указание координат точки центра массы объекта. Применяет координаты в виде уже знакомого нам объекта Vector3.

Использовать ли для объекта обнаружение столкновений с другими объектами. Можно выключить, тогда ваш объект будет игнорировать любые столкновения:

Режим определения столкновений между объектами. Можно указать несколько разных режимов:
CollisionDetectionMode.ContinuousDynamic для быстро движущихся объектов;
CollisionDetectionMode.Continuous для столкновений с быстро движущимися объектами;
CollisionDetectionMode.Discrete (по умолчанию) для обычных столкновений;
В случае отсутствия проблем с определением столкновений рекомендуется использовать свойство по умолчанию.

Задать плотность объекта:

Применить импульс к объекту с указанным вектором. В результате применения импульса объект придет в движение пропорционально силе импульса.

Применить импульс к объекту с вектором в его (объекта) системы координат:

Добавить объекту крутящий момент. Применение данного метода заставит объект вращаться вокруг своего центра масс GameObject.rigidbody.centerOfMass.

Тоже самое, что и предыдущий пример, но относительно координат объекта:

Применение импульса к объекту из внешней указанной точки. Заставляет объект двигаться и вращаться одновременно. Может использоваться, например, для симуляции попадания в объект пули. Первый параметр указывает вектор направления силы, второй параметр — исходную точку направления силы.

Для полноценной симуляции объемных взрывов в Unity3D есть отдельный метод. Первый параметр метода позволяет указать мощность импульса, второй параметр — точку, из которой исходит импульс, третий параметр — радиус распространения импульса, четвертый параметр — модификатор сжатия сферы распространения силы, пятый, необязательный, параметр указывает тип используемого импульса:

Заставить объект «уснуть», и запретить дальнейший расчет физических показателей для него:

Проверить «заснул» ли объект:

«Разбудить» объект для возможности дальнейшего применения влияния физики на него:

Трассировка лучей

Один из самых часто используемых в разработке на Unity3D объект, это Ray. Данный объект позволяет выпустить луч из указанной точки, в указанном направлении, и вернуть некоторые свойства объектов, которых он смог достичь.

Создаем объект класса RaycastHit, который содержит информацию об объекте, с которым столкнулся луч:

Отправляем луч длиной в 50 юнитов из позиции rayPosition в направлении rayVector, и заносим объект, с которым столкнулся луч в переменную hit:

Получаем дистанцию до объекта, с которым столкнулся луч. Дистанция не может быть больше, чем протяженность луча:

Иногда бывает необходимо получить имя объекта, с которым произошло столкновение луча. Наиболее простой способ это сделать:

Для получения тега объекта используем следующий способ:

Unity3D содержит еще множество различных методов и объектов, полезных и не очень. К сожалению полный их обзор увеличил бы и без того объемную статью, поэтому я постараюсь рассказать об остальном более подробно в будущем, если мне представится такая возможность. Я бы хотел пожелать опытным разработчикам побольше интересных проектов, а начинающим — успехов и интересных открытий. Спасибо, что уделили внимание данной статье.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *