Загальна інформація
опис
VR Hand – це рука, якою користується гравець. Рука використовує фізику, і всі взаємодії також використовують фізику. Клас використовує компонент фізичних обмежень для досягнення фізичних взаємодій.
Основні особливості
Фізика
Зіткнення пальців
Фізичні взаємодії
Взаємодія зброї
Взаємодія обладнання
Пальцевий І.К
Ручні анімації
Меню функціональне
Радіальна підтримка інвентаризації
компоненти
Коренева сцена ( SceneComponent )
TeleportCylinder ( StaticMeshComponent )
Стрілка ( StaticMeshComponent )
RoomScaleMesh ( StaticMeshComponent )
ArcEndPoint ( StaticMeshComponent )
Руки ( SceneComponent )
HandSocket ( SphereComponent )
FakeHandMesh ( SkeletalMeshComponent )
ArcNiagara ( NiagaraComponent )
WidgetInteractionComponent ( WidgetInteractionComponent )
PhysicsHandSocket ( SphereComponent )
RealHandMesh ( SkeletalMeshComponent )
FLineTraces ( Thumb-Pinky, по 3 кістки кожна ) ( ArrowComponent )
FingerSceneComponets(Tip-Start) ( SceneComponent )
GrabRoot ( SceneComponent )
GrabDirection ( ArrowComponent )
GrabBox ( BoxComponent )
PickPhysicsConstraint ( PhysicsConstraintComponent )
CA_Inventory ( ChildActorComponent )
MenuWristLoader ( WidgetComponent )
BoxHands ( BoxComponent )
FingerCollisions(Thumb-Pinky) ( CapsuleComponent )
RealHandCollision ( StaticMeshComponent )
HandPhysicsConstraint ( PhysicsConstraintComponent )
HandPhysicsConstraintPD ( PhysicsConstraintComponent )
MenuCusrsor ( StaticMeshComponent )
WidgetSphereMesh ( StaticMeshComponent )
TeleportCylinder, Arrow, RoomScaleMesh, ArcEndPoint, ArcNiagara - використовуються для телепортації.
FakeHandMesh – Це скелетна сітка рук, яка не імітує фізику. WidgetInteractionComponent – цей компонент використовується для взаємодії з актором меню або іншими віджетами.
RealHandMesh – цей компонент приєднується до HandSocket , який імітує фізику.
HandSocket - це компонент сфери, який імітує фізику. Він використовується, тому що ми прикріплюємо додаткові об’єкти зіткнення ( FingerCollisions і RealHandCollision ). Якщо ми приєднаємо додаткові об’єкти зіткнення до компонента скелетної сітки, зіткнення не матиме жодного ефекту.
FingerCollisions - це компоненти капсули для кожного пальця.
FingerSceneComponets - це місця, в яких будуть відбуватися зіткнення пальців.
RealHandCollision - це статична сітка для зіткнення руками.
FLineTraces - це компоненти стрілки для захоплення пальцем IK.
GrabDirection - це компонент стрілки для захоплення.
GrabBox - це компонент коробки для захоплення. Об'єкти в цьому полі можна захоплювати.
PickPhysicsConstraint – це фізичний обмежений компонент, який використовується для захоплення об’єктів.
CA_Inventory – це дочірній компонент актора, який використовує клас Hand Inventory VR. Цей компонент необов'язковий.
MenuWristLoader – це компонент віджета, який відображає панель завантаження меню паузи.
HandPhysicsConstraint – це обмежений фізичний компонент, який з’єднує FakeHandMesh і PhysicsHandSocket . Вмикається при зіткненні рук.
HandPhysicsConstraintPD – це компонент із фізичними обмеженнями, який з’єднує FakeHandMesh і PhysicsHandSocket . Вмикається, коли рука не стикається.
MenuCusrsor - це курсор, який відображається на віджеті під час взаємодії.
Позначте Огляд алгоритму
CheckAimToGrab – ця функція наближає руку до об’єкта поруч за допомогою компонента фізичного обмеження .
Hand Physics Tick – ця функція перемикає між Physics Constraint і PhysicsConstraint Parent Dominate, встановлюючи параметри лінійного/кутового приводу.
UpdateHandAnimation – Ця функція оновлює анімацію руки.
UpdateRoomScaleOutline – ця функція оновлює розташування контуру кімнати відносно цілі телепорту.
CheckMenuStatus – ця функція перевіряє наявність меню та приховує фізичну ручну сітку, якщо необхідно (показує підроблену ручну сітку, яка не імітує фізику). Все налаштовує.
UpdateWidgetCursor - Ця функція переміщається по сітці меню.
CheckHandsAndControllerDist - ця функція перевіряє відстань між контролером руху та ручною сіткою. Якщо відстань перевищує обмеження, рука рухатиметься без реакції на зіткнення.
CheckControllerAndPickDist - Ця функція перевіряє відстань між контролером руху та захопленим об'єктом. Якщо відстань перевищує обмеження, рука впустить предмет.
CheckGrabPoss - ця функція перевіряє можливість захоплення пальців. Якщо предмет занадто важкий і відстань перевищує ліміт, рука відпустить предмет.
CheckMenuButtonPress - ця функція перевіряє, як довго натиснуто кнопку меню.
UpdateAllFingersCollision – ця функція оновлює зіткнення для кожного пальця.
MakeUpdateWidgetLookAtCamera - ця функція робить завантажувальний віджет завжди спрямованим до камери.
Фізичні обмеження
VR Hand використовує 3 фізичні обмеження: HandPhysicsConstraint , HandPhysicsConstraint PD і PickPhysicsConstraint. HandPhysicsConstraint і HandPhysicsConstraint PD використовуються для підключення FakeHandMesh і PhysicsHandSocket . У функції « HandPhysicsTick » Physics Constraint і PhysicsConstraint Parent Dominate перемикаються. HandPhysicsConstraint вмикається, коли рука стикається, і HandPhysicsConstraint PD, коли рука не стикається (Це прокидається подіями попадання, тому переконайтеся, що для кожного зіткнення пальців, зіткнення рук та інших об’єктів, які приєднав розробник, для «Simulation Generate Hit Events» встановлено значення true).
У категоріях «Змінні/Фізика» та «Змінні/PD» (батьківське домінування) є параметри для фізичних обмежень. Найважливішим параметром є крива перетягування , яка впливає на обмеження залежно від відстані руки та контролера (не забудьте встановити змінну кривої перетягування. Принаймні використовуйте змінну за замовчуванням, інакше проект аварійно завершить роботу).
Скелет руки
У налаштуваннях за замовчуванням використовується скелет SteamVR, але можна використовувати скелет Unreal Engine XR. У налаштуваннях є розділ «Рука», у якому можна знайти такі змінні: «Віддзеркалення лівої руки» , використання скелета Steam VR і кісток пальців (це використовується під час зіткнення пальців).
Зіткнення пальців (UE 5.2)
Finger Collision використовує компоненти капсули та FingerSceneComponets(Tip-Start) ( SceneComponent ). Налаштування зіткнення вимагає розміщення компонентів сцени. Кожен компонент кінчика пальця (ThumbFingerTip - PinkyFingerTip) має бути розташований на кінчику кожного пальця. Кожен компонент початку пальця (ThumbFingerStart - PinkyFingerStart) має бути розташований на кінчику кожного пальця. Перед зміною розташування кожного компонента розробнику необхідно додати UpdateAllFingerCollision до сценарію конструкції. UpdateAllFingerCollision розміщуватиме зіткнення кожного пальця між кінчиком і початком.
Зіткнення пальців (UE 4.27)
Зіткнення пальців використовує суміш фізики (працює лише зі скелетом SteamVR). Потрібне налаштування ресурсу скелетної фізики (Див. приклад демо-ресурсу скелетної фізики).
Ручна анімація
Для належного використання FakeHandMesh і RealHandMesh потрібен план анімації рук. Екземпляр Animation Blueprint має бути створений з екземпляра анімації VR Hand (Animation Blueprint має бути налаштовано, інакше проект аварійно завершить роботу. Щоб отримати інформацію про налаштування, перегляньте клас екземпляра анімації VR Hand Animation).
Траси ліній для Grab IK
Рука використовує 4 лінії (компоненти стрілок) для кожного пальця. Значення обертання кожного пальця становить від 0 до 1, тому значення кожної лінійної траси дорівнює 1/NumberOfTraces(4)=0,25 (Траса 1: 0-0,25, Траса 2: 0,25-0,5, Траса 3: 0,5-0,75 і Траса 3: 0,75-1). Для налаштування потрібен анімаційний проект (для позицій налагодження), у якому IK-суміш для кожної кістки підключено до виходу (малюнок нижче). Положення стрілок для пальця має збігатися з положенням пальця в діапазоні значень.
Налаштування меню
Меню (Актор, приєднаний до FakeHandMesh) може бути створено після утримання кнопки A на лівому контролері (кільце завантаження з’являтиметься, якщо утримувати кнопку). Клас головного меню та клас меню паузи — це класи, які створюватимуться за певних умов (головне меню, якщо гравець має значення true у статусі меню, і меню паузи, якщо гравець натиснув кнопку). Можна вказати анімацію захоплення меню. (Не забудьте вибрати класи, інакше проект вийде з ладу)
(Потрібно вибрати віджет завантаження меню, інакше проект аварійно завершить роботу)
Ручний радіальний інвентар
CA_Inventory (компонент дочірнього актора) — це актор інвентаризації, який можна створити, натиснувши кнопку великого джойстика на правому контролері (щоб уникнути проблем, для класу слід вибрати принаймні значення 0. Для отримання додаткової інформації див. інвентар VR Hnad).
Потягніть Захопіть
Can Pull Grab - вмикає тягу.
Pull Grab Type – Тип можна встановити на Gravity Pull (стиль HL:A) або Direct Pull (стиль Boneworks). Pull Grab Distance - Максимальна відстань тяги.
Pull Check Delay - Затримка між перевірками захоплення.
Інші налаштування
Ammo Clips - це масив класів, у якому зберігається інформація про класи боєприпасів. Index — це тип калібру, який отримується від Player (див. VR Player). Ця змінна використовується у функції захоплення. Якщо рука знаходиться в коробці з боєприпасами, а гравець має патрони, це породить актора класу з цього масиву за калібром ( Індекс ).
Тактильний ефект ударної поверхні - це тактильний ефект, який відтворюється, коли рука торкається поверхні.
Телепорт — змінні, які впливають на телепорт.
Grab - змінні, які впливають на телепорт ( швидкість, звук тощо ).
Довідник API Blueprint
Публічні функції члена | |
| AVR_Hands () |
| |
віртуальна порожнеча | Перевизначення OnConstruction (const FTransform &Transform). |
| |
віртуальна порожнеча | Перевизначення BeginPlay (). |
| |
віртуальна порожнеча | Tick (float DeltaTime) перевизначення |
| |
віртуальна порожнеча | Перевизначення EndPlay (EEndPlayReason::Type EndPlayReason). |
| |
недійсний | SetParentMotionController ( UVR_MotionControllerComponent *MotionController) |
| |
недійсний | |
| |
недійсний | |
| |
недійсний | |
| |
bool | |
| |
недійсний | GrabActor () |
| Якщо натиснуто кнопку захоплення. |
| |
недійсний | ReleaseActor () |
| Реліз додається Актор. |
| |
недійсний | |
| |
недійсний | |
| |
bool | TraceTeleportDestination (TArray< FVector > &TracePoints, FVector &NavMeshLocation, FVector &TraceLocation, FRotator &TraceRotation) |
| Відстежує пункт призначення телепорту, перевіряє, чи можливий телепорт. |
| |
недійсний | ClearArc () |
| Очищає дугу. |
| |
недійсний | UpdateArcSpline (bool FoundValidLocation, TArray< FVector > SplinePoints) |
| Оновлення Arc Spline. |
| |
недійсний | UpdateArcEndPoint (bool ValidLocationFound, FVector NewLocation) |
| Оновлює кінцеву точку дуги. |
| |
недійсний | GetTeleportDestination (FVector &MyLocation, FRotator &MyRotation) |
| Отримує пункт призначення телепорту. |
| |
недійсний | |
| Встановлює всі Пальці IK. |
| |
недійсний | ShowTeleportDestenation (bool IsValidTeleportDestination, FVector TraceLocation, FRotator TraceRotation) |
| |
недійсний | SetSingleFingerIK (UArrowComponent FingerTrace1, UArrowComponent FingerTrace2, UArrowComponent FingerTrace3, UArrowComponent FingerTrace4, EFinger Finger) |
| Встановлює Ik для SingleFinger. |
| |
недійсний | LineTraceAlongArrow (клас UArrowComponent *ArrowToTrace, bool &Hit, float &TraceLength, FHitResult &OutHits) |
| Проведіть лінію вздовж компонента стрілки. |
| |
плавати | CalculateRatio (float TraceLength, int ArrowNumber) |
| Розраховує обертання. |
| |
недійсний | CalculateIKLocations (FVector WorldImpact, FVector &EffectorLocation) |
| |
недійсний | ApplyIKToABP (FVector EffectorLocation, float Ratio, EFinger Finger, bool hit) |
| Застосуйте обертання до креслення анімації. |
| |
недійсний | |
| Налаштування масштабу приміщення. |
| |
недійсний | |
| Оновити схему масштабу приміщення. |
| |
недійсний | RumbleController (плаваюча інтенсивність, UHapticFeedbackEffect_Base *HapticEffect) |
| Вібруйте контролер за допомогою Habtics. |
| |
недійсний | OnComponentBeginOverlap (клас UPrimitiveComponent OverlappedComp, AActor OtherActor, клас UPrimitiveComponent *OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult &SweepResult) |
| Для Rumble Controller, коли накладається дійсний StaticMesh. |
| |
недійсний | |
| |
недійсний | Встановити TeleportRotation (FRotator &NewTeleportRotation) |
| Встановіть поворот телепорту, що використовується в Player_Pawn. |
| |
недійсний | |
| Перевіряє відстань між контролером і обраним об'єктом. |
| |
недійсний | |
| Перевіряє відстань між руками та контролером. |
| |
недійсний | |
| |
bool | TryAimToGrab (FHitResult &Hit, bool ForceInteraction) |
| |
недійсний | |
| Перевіряє, чи активний Teleport. Оновлює Arc Spline за допомогою UpdateArcSpline(bIsValidTeleportDestination, TracePoints) ; Оновлює кінцеву точку дуги за допомогою UpdateArcEndPoint(bIsValidTeleportDestination, TraceLocation). |
| |
віртуальна порожнеча | |
| Курок натиснутий. |
| |
віртуальна порожнеча | Index_Touch () |
| Тригер Touch. |
| |
віртуальна порожнеча | |
| Ручка натиснута. |
| |
віртуальна порожнеча | |
| Великий палець натиснутий. |
| |
віртуальна порожнеча | |
| Тригер звільнено. |
| |
віртуальна порожнеча | |
| Запустити UnTouch. |
| |
віртуальна порожнеча | |
| Ручка відпущена. |
| |
віртуальна порожнеча | |
| Великий палець відпущений. |
| |
віртуальна порожнеча | A_Pressed () |
| A Натиснуто. |
| |
віртуальна порожнеча | A_Released () |
| A Звільнений. |
| |
віртуальна порожнеча | B_Pressed () |
| B Натиснуто. |
| |
віртуальна порожнеча | B_Released () |
| Б Звільнений. |
| |
віртуальна порожнеча | |
| Встановлює значення true, якщо торкнутися трекпада. |
| |
віртуальна порожнеча | |
| |
віртуальна порожнеча | SetIndexPushInst (float inst) |
| |
віртуальна порожнеча | SetGripPushInst (float inst) |
| |
віртуальна порожнеча | SetTrackpad_Y (float inst) |
| |
віртуальна порожнеча | SetAllowAmmo (bool Дозволити) |
| |
віртуальна порожнеча | HandsPickObjHandle (bool Attach) |
| |
AAактор * | |
| |
недійсний | SetDontLostConnection (bool DontAllow) |
| |
недійсний | SetMainMenuStatus (bool MainMenuStatus) |
| Вмикає/вимикає компонент віджета. |
| |
недійсний | SetOwnerPawn (AActor *ActorToSet) |
| Встановлює власника MotionController(Player) |
| |
недійсний | |
| |
недійсний | UpdateFingerCollision (UCapsuleComponent Collision, USceneComponent Start, USceneComponent *Tip) |
| |
недійсний | WakePhysics () |
| |
недійсний | EnableFingerCollision (bool Enable) |
| |
bool | |
| |
недійсний | |
| |
недійсний | |
| |
недійсний | SetCurrentWidgetHand (bool ThisHand) |
| Встановлює віджет на поточну руку. |
| |
недійсний | |
| Оновлює курсор віджета. |
| |
недійсний | |
| Перевірте, чи можливе захоплення. |
| |
недійсний | CheckPhysBlend (bool force=false) |
| |
недійсний | UpdatePhysBlendForFinger ( EFinger Finger, FFingerCurls CurrentFingerCurls, bool force=false) |
| |
недійсний | SetLessPhysHands (bool newstatus) |
| Набори bLessPhysHands. |
| |
недійсний | |
| |
недійсний | SpawnMenu () |
| |
недійсний | DestroyMenu () |
| |
недійсний | |
| |
bool | DoTryGrabbing (FHitResult &Hit, bool ForceInteraction) |
| |
bool | TryGrabbing (FHitResult &Hit, bool ForceInteraction) |
| |
недійсний | CheckFingerCollisionOverlap (TArray< FName > &FingerSocketsNames, TArray< FName > &FingerBonesNames) |
| |
недійсний | UpdateGrabAnimation (UAnimSequence *NewAnimation) |
| |
недійсний | UpdateTriggerPressedAnimation (UAnimSequence *NewAnimation) |
| |
недійсний | UpdateAPressedAnimation (UAnimSequence *NewAnimation) |
| |
FORCEINLINE бул | GetIsGrabbed () const |
| |
FORCEINLINE бул | GetHasWeapon () const |
| |
FORCEINLINE uint8 | GetCaliber () const |
| |
FORCEINLINE USkeletalMeshComponent * | GetHandMesh () const |
| |
FORCEINLINE USkeletalMeshComponent * | GetFakeHandMesh () const |
| |
FORCEINLINE FВектор | GetHandLocation () const |
| |
FORCEINLINE FВектор | GetControllerLocation () const |
| |
FORCEINLINE EControllerHand | GetHand () const |
| |
FORCEINLINE UPhysicsConstraintComponent * | GetPhysicsConstraint () const |
| |
FORCEINLINE USceneComponent * | GetMCSceneComponent () const |
| |
FORCEINLINE AAктор * | GetAttachedActor () const |
| |
FORCEINLINE AAктор * | GetLastAttachedActor () const |
| |
FORCEINLINE AAктор * | GetOwnerPawn () const |
| |
FORCEINLINE бул | GetAllowAmmo () const |
| |
FORCEINLINE AVR_HandInventory * | GetInventory () const |
| |
FORCEINLINE бул | IsClimbing () const |
| |
FORCEINLINE USphereComponent * | GetPhysicsHandSocket () const |
| |
FORCEINLINE UStaticMeshComponent * | GetHandCollision () const |
| |
недійсний | EnableLoadingRoom (bool Enable) |
| |
недійсний | SetHandIsColliding (bool IsColliding) |
| |
FORCEINLINE бул | IsHandClosed () const |
| |
FORCEINLINE бул | GetIsUsingSteamVRSkeleton () const |
| |
FORCEINLINE FВектор | GetPhysicsClimbVector () const |
| |
FORCEINLINE FFingerCurls | GetFingerCurls () const |
| |
недійсний | OnHit (AActor SelfActor, AActor OtherActor, FVector NormalImpulse, const FHitResult &Hit) |
| |
недійсний | SetInventoryAccess (логічний доступ) |
| |
недійсний | SetInventoryBox ( UVR_InventoryBox *InventoryBox) |
| |
FORCEINLINE FRotator | GetInitialControllerRotation () const |
| |
FORCEINLINE бул | GetIsValidTeleportDestination () const |
| |
FORCEINLINE бул | GetIsTeleporterActive () const |
| |
FORCEINLINE бул | HasInventoryAccess () const |
|
Публічні атрибути | |
bool | |
| |
bool | |
| |
bool | |
| |
bool | |
| |
bool | bHitHand = false |
| |
bool | HandIsColliding = false |
| |
bool | |
| |
bool | |
| |
bool | |
| |
плавати | |
| |
плавати | |
| |
плавати | |
| |
плавати | |
| |
FВектор | |
| |
EControllerHand | |
|
Захищені функції члена | |
недійсний | |
| |
недійсний | |
| |
USceneComponent * | GetNearestGrabComponent (AActor *Actor, FVector TestLocation, bool ForceCheckPriority) |
|