raycasthit unity что это

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:

Источник

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

Краткое введение в 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 что это. Смотреть фото raycasthit unity что это. Смотреть картинку raycasthit unity что это. Картинка про raycasthit unity что это. Фото raycasthit unity что это

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

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

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

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

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

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

Источник

Тир. Стрельба рейкастами на Unity 3D

Учебные материалы для школы программирования. Часть 17

В этом проекте рассмотрим процесс работы:

с рейкастами и векторами;

с методами других пользовательских классов;

с AudioSource и с Rigidbody через код;

три основных составляющих выстрела, психологически действующих на игрока (звук, свет и свечение, анимация и след от выстрела);

Ключевыми темами проекта выступают именно рейкасты и векторы. Последним, необходимо уделять довольно много времени каждый день, и на простых примерах объяснять, как они устроены. Но если вам удалось быстро выполнить проект с учениками, то в этом уроке будет уместно рассмотреть mecanim-систему.

Порядок выполнения

Создаём новый проект, импортируем приложенный ассет.

Помимо стандартных ресурсов пакет имеет сторонний плагин для рисовки декалей. Его работа в контексте данного урока не рассматривается.

Во время этой части урока необходимо объяснить, каким образом работает рейкаст и то, как можно взаимодействовать с другими скриптами из него.

raycasthit unity что это. Смотреть фото raycasthit unity что это. Смотреть картинку raycasthit unity что это. Картинка про raycasthit unity что это. Фото raycasthit unity что это

Внутри проекта есть скрипт DecalShooter, который создаёт декали, и в котором расположен весь код стрельбы, включая рейкаст. В нём будет вводиться код взаимодействия с мишенью.
Для начала, необходимо подготовить саму мишень. Ею служит цилиндр, который необходимо уменьшить по Y до состоянии платины, удалить CapsuleCollider и поставить MeshCollider с галочкой Convex. Дополнительно, на цилиндр устанавливается текстура мишени, внутри цилиндра создаётся point light, подсвечивающий мишень, и объект с AudioSource для воспроизведения звука, а на сам цилиндр устанавливается Rigidbody с обработкой коллизий типа Continius Dynamic и галочкой isKinematik. У AudioSource не забудьте убрать галочку PlayOnAwake и закинуть звук попадания в мишень.

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

raycasthit unity что это. Смотреть фото raycasthit unity что это. Смотреть картинку raycasthit unity что это. Картинка про raycasthit unity что это. Фото raycasthit unity что это raycasthit unity что это. Смотреть фото raycasthit unity что это. Смотреть картинку raycasthit unity что это. Картинка про raycasthit unity что это. Фото raycasthit unity что это

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

Данный код пытается получить компонент из объекта hitInfo и, если это удаётся, вызывает метод ​shoot.​ Мишень падает, свет от мишени выключается, звук попадания воспроизводится. Далее, желательно дать группе свободное задание по кастомизации своего проекта. Как альтернативу, можно предложить изменить код таким образом, чтобы мишень меняла цвет при попадании. Делается это заменой в Target строк:

Таким образом, свет меняется и не удаляется.

Гранаты

Эта часть урока должна ещё больше закрепить понимание векторов и работы рейкастов.

Скрипт закинем в FPScontroller/FirstPersonCharacter. В Canvas создадим текст, закинем его в скрипт.
В этом скрипте реализован простейший рейкаст, и на его примере мы разбираем, как рейкаст передаёт информацию в структуру и как нам получать из структуры эту информацию.
При срабатывании рейкаста мы выводим дальность на экран.

raycasthit unity что это. Смотреть фото raycasthit unity что это. Смотреть картинку raycasthit unity что это. Картинка про raycasthit unity что это. Фото raycasthit unity что это

Закидываем на сцену гранату, на меш Body ставим коллайдеру Convex, добавляем гранате RIgidbody и наш скрипт. Получившуюся гранату добавляем в префаб и удаляем со сцены.

raycasthit unity что это. Смотреть фото raycasthit unity что это. Смотреть картинку raycasthit unity что это. Картинка про raycasthit unity что это. Фото raycasthit unity что это

Скрипт удаляет объект, на котором висит, но до этого инстантиирует объект, который мы выбираем в качестве эффекта взрыва.

raycasthit unity что это. Смотреть фото raycasthit unity что это. Смотреть картинку raycasthit unity что это. Картинка про raycasthit unity что это. Фото raycasthit unity что это

Создадим эффект взрыва. В нём должен быть свет от взрыва, AudioSource с галочкой PlayOnAwake и звуком взрыва, Spital Blend на 90 процентов переведённый в 3д и увеличенный радиус распространения звука.

Для правильной отработки всех эффектов и разлёта Rigidbody нужно создать ещё один скрипт. Его мы назовём Explosion:

Его нужно закинуть на эффект взрыва и создать префаб.

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

Источник

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

raycasthit unity что это. Смотреть фото raycasthit unity что это. Смотреть картинку raycasthit unity что это. Картинка про raycasthit unity что это. Фото raycasthit unity что это

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

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

raycasthit unity что это. Смотреть фото raycasthit unity что это. Смотреть картинку raycasthit unity что это. Картинка про raycasthit unity что это. Фото raycasthit unity что это

На самом деле большую часть про это можно прочесть в этом материале 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 что это. Смотреть фото raycasthit unity что это. Смотреть картинку raycasthit unity что это. Картинка про raycasthit unity что это. Фото raycasthit unity что это

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

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

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

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

raycasthit unity что это. Смотреть фото raycasthit unity что это. Смотреть картинку raycasthit unity что это. Картинка про raycasthit unity что это. Фото raycasthit unity что это

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

raycasthit unity что это. Смотреть фото raycasthit unity что это. Смотреть картинку raycasthit unity что это. Картинка про raycasthit unity что это. Фото raycasthit unity что это

raycasthit unity что это. Смотреть фото raycasthit unity что это. Смотреть картинку raycasthit unity что это. Картинка про raycasthit unity что это. Фото raycasthit unity что это

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

raycasthit unity что это. Смотреть фото raycasthit unity что это. Смотреть картинку raycasthit unity что это. Картинка про raycasthit unity что это. Фото raycasthit unity что это

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

raycasthit unity что это. Смотреть фото raycasthit unity что это. Смотреть картинку raycasthit unity что это. Картинка про raycasthit unity что это. Фото raycasthit unity что это

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

raycasthit unity что это. Смотреть фото raycasthit unity что это. Смотреть картинку raycasthit unity что это. Картинка про raycasthit unity что это. Фото raycasthit unity что это

raycasthit unity что это. Смотреть фото raycasthit unity что это. Смотреть картинку raycasthit unity что это. Картинка про raycasthit unity что это. Фото raycasthit unity что этоraycasthit unity что это. Смотреть фото raycasthit unity что это. Смотреть картинку raycasthit unity что это. Картинка про raycasthit unity что это. Фото raycasthit unity что этоraycasthit unity что это. Смотреть фото raycasthit unity что это. Смотреть картинку raycasthit unity что это. Картинка про raycasthit unity что это. Фото raycasthit unity что это

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

raycasthit unity что это. Смотреть фото raycasthit unity что это. Смотреть картинку raycasthit unity что это. Картинка про raycasthit unity что это. Фото raycasthit unity что этоraycasthit unity что это. Смотреть фото raycasthit unity что это. Смотреть картинку raycasthit unity что это. Картинка про raycasthit unity что это. Фото raycasthit unity что этоraycasthit unity что это. Смотреть фото raycasthit unity что это. Смотреть картинку raycasthit unity что это. Картинка про raycasthit unity что это. Фото raycasthit unity что это

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

raycasthit unity что это. Смотреть фото raycasthit unity что это. Смотреть картинку raycasthit unity что это. Картинка про raycasthit unity что это. Фото raycasthit unity что это

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

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

Дискриминант равен 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 и других вещей в трёхмерной графике.

В заключении

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

Источник

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-12-17.

Источник

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

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