04/03/2022
Virtual reality (VR) har revolutioneret måden, vi interagerer med digitale verdener på, og en central komponent i denne fordybende oplevelse er motion controllere. Disse intuitive enheder giver dig mulighed for at kommunikere med VR-verdenen på en naturlig og direkte måde, hvilket forbedrer følelsen af tilstedeværelse og gør interaktioner mere engagerende. Uanset om du griber fat i virtuelle objekter, skyder med en bue eller navigerer gennem komplekse menuer, er præcis og responsiv controller-input afgørende. I denne omfattende guide vil vi dykke ned i, hvordan du effektivt opsætter og udnytter motion controllere i Unreal Engine 4 (UE4) til VR-udvikling. Vi vil dække alt fra grundlæggende opsætning til avancerede teknikker for at forbedre brugeroplevelsen, herunder visuel repræsentation, interaktion med laser-sigter og håndtering af forskellige controller-inputs. Vores mål er at give dig de nødvendige værktøjer og viden til at skabe uforglemmelige og dybt fordybende VR-oplevelser.

Opsætning af Motion Controllere
At få dine motion controllere til at fungere i UE4 er det første skridt mod at bygge en engagerende VR-oplevelse. UE4 tilbyder fleksibilitet ved at lade dig opsætte disse controllere enten via Blueprint visuel scripting eller direkte i C++ kode. Begge metoder har deres fordele, afhængigt af dit projekts kompleksitet og dine personlige præferencer som udvikler.
Blueprint Opsætning
For dem, der foretrækker en visuel og mere tilgængelig tilgang, er Blueprint et fremragende valg. UE4's officielle dokumentation er yderst detaljeret og trin-for-trin, når det kommer til opsætning af motion controllere i Blueprint. Den beskriver præcist, hvordan du tilføjer og konfigurerer Motion Controller-komponenter til din Player Character, forbinder dem til input-events og visualiserer dem i din virtuelle verden. Vi anbefaler på det kraftigste at gennemgå denne dokumentation for at få en solid grundforståelse, da den dækker de visuelle aspekter og event-håndtering på en meget brugervenlig måde. Typisk involverer det at trække en 'Motion Controller' komponent ind i din Character Blueprint, vælge hvilken hånd den skal repræsentere (venstre eller højre), og derefter tilknytte statiske eller dynamiske meshes til den.
C++ Opsætning
Hvis du foretrækker at arbejde med kode for større kontrol, ydeevneoptimering eller for at integrere med eksisterende C++ systemer, er opsætning via C++ den rette vej. Her er et kodeeksempel, der viser, hvordan du kan opsætte motion controllere i en tom karakterklasse. Dette giver dig fuld kontrol over komponenterne fra start.
// VRCharacter.h #pragma once #include "CoreMinimal.h" #include "GameFramework/Character.h" #include "VRCharacter.generated.h" class UCameraComponent; class USceneComponent; class UMotionControllerComponent; UCLASS() class VRFIRSTPERSON_API AVRCharacter: public ACharacter { GENERATED_BODY() public: AVRCharacter(); protected: virtual void BeginPlay() override; public: virtual void Tick(float DeltaTime) override; virtual void SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent) override; private: UPROPERTY(VisibleAnywhere, Category = "Components") UCameraComponent* CameraComp; /* Komponent til at specificere oprindelse for HMD (Head-Mounted Display) */ UPROPERTY(VisibleAnywhere, Category = "Components") USceneComponent* VROriginComp; UPROPERTY(EditDefaultsOnly, Category = "VR") bool bPositionalHeadTracking; /* Motion Controllere */ UPROPERTY(EditDefaultsOnly, Category = "Components") UMotionControllerComponent* LeftHandComponent; UPROPERTY(EditDefaultsOnly, Category = "Components") UMotionControllerComponent* RightHandComponent; }; // VRCharacter.cpp #include "VRCharacter.h" #include "Camera/CameraComponent.h" #include "Components/SceneComponent.h" #include "MotionControllerComponent.h" #include "HeadMountedDisplayFunctionLibrary.h" // For HMD-funktioner, hvis nødvendigt AVRCharacter::AVRCharacter() { PrimaryActorTick.bCanEverTick = true; // Opsætning af VR Origin Component VROriginComp = CreateDefaultSubobject<USceneComponent>(TEXT("VRCameraOrigin")); VROriginComp->SetupAttachment(RootComponent); // Brug SetupAttachment i stedet for AttachTo // Opsætning af Kamera Komponent CameraComp = CreateDefaultSubobject<UCameraComponent>(TEXT("CameraComponent")); CameraComp->SetupAttachment(VROriginComp); // Knyt kameraet til VR Origin // Opsætning af Venstre Hånds Motion Controller LeftHandComponent = CreateDefaultSubobject<UMotionControllerComponent>(TEXT("LeftHand")); LeftHandComponent->SetTrackingSource(EControllerHand::Left); // Specificer venstre hånd LeftHandComponent->SetupAttachment(VROriginComp); // Knyt til VR Origin // Opsætning af Højre Hånds Motion Controller RightHandComponent = CreateDefaultSubobject<UMotionControllerComponent>(TEXT("RightHand")); RightHandComponent->SetTrackingSource(EControllerHand::Right); // Specificer højre hånd RightHandComponent->SetupAttachment(VROriginComp); // Knyt til VR Origin } void AVRCharacter::BeginPlay() { Super::BeginPlay(); // Nulstil VR-sporingens oprindelse, hvis HMD er tilgængelig if (GEngine->XRSystem.IsValid() && GEngine->XRSystem->Get ; HMDDevice.IsValid()) { UHeadMountedDisplayFunctionLibrary::ResetOrientationAndPosition(); } } void AVRCharacter::Tick(float DeltaTime) { Super::Tick(DeltaTime); // Tilføj yderligere tick-logik her, f.eks. til laser sigte } void AVRCharacter::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent) { Super::SetupPlayerInputComponent(PlayerInputComponent); // Tilføj input-bindinger her } I dette eksempel oprettes VROriginComp som rod for VR-relaterede komponenter, hvilket giver et stabilt referencepunkt. Kameraet (CameraComp) og begge motion controller-komponenter (LeftHandComponent, RightHandComponent) fastgøres derefter til VROriginComp. Bemærk brugen af SetTrackingSource til at differentiere mellem venstre og højre hånd. Denne struktur sikrer, at alle VR-komponenter bevæger sig korrekt i forhold til hinanden og spilleren.
Tabel: Sammenligning af Opsætningsmetoder
| Funktion | Blueprint | C++ |
|---|---|---|
| Læringskurve | Lavere, visuelt baseret | Højere, kræver kendskab til C++ |
| Udviklingshastighed | Hurtigere for simple opgaver | Langsommere for opsætning, hurtigere for komplekse systemer |
| Ydeevne | God, men kan være langsommere for meget komplekse logikker | Optimal, direkte adgang til engine-funktioner |
| Kontrolniveau | Højt, men abstrakt | Meget højt, fuld kontrol |
| Anvendelsesområde | Prototyping, spil med mindre kompleks logik | Store projekter, højtydende VR-applikationer |
Tilføjelse af Mesh
Når du har opsat dine motion controllere, vil du sandsynligvis repræsentere dem visuelt i VR-verdenen med et 3D-mesh. Dette mesh kan være en simpel controller-model, en hånd eller endda en fuld arm. En almindelig faldgrube er, at meshet ikke bevæger sig eller vises korrekt. For at forhindre dette problem er det afgørende at sikre, at meshet er et child component af controller-komponenten. Når meshet er et barn af motion controller-komponenten, vil alle bevægelser og rotationer fra motion controlleren automatisk blive anvendt på dets børn, hvilket sikrer, at det følger controllerens bevægelser præcist.
Hvis meshet stadig ikke vises, skal du kontrollere, at det ikke er indstillet til at være skjult i spillet ('Hidden in Game'). Dette kan få meshet til at være synligt i editoren, men usynligt i selve spillet. Dobbeltcheck også materialer og kollisioner, da disse også kan påvirke, hvordan et mesh gengives og interagerer.
Øg Immersionen
For at forbedre den overordnede immersion i din VR-oplevelse kan du gøre mere end blot at vise en flydende mesh-model af controlleren. En mere virkelighedstro tilgang er at tilføje arme og hænder, der visuelt repræsenterer, at brugeren holder controllere. Dette skaber en stærkere forbindelse mellem brugeren og den virtuelle avatar.

Hvis du bruger et statisk mesh til motion controlleren, kan du overveje at udskifte det med et dynamisk mesh. Et dynamisk mesh kan afspille forskellige animationer som reaktion på forskellige controller-inputs. Forestil dig, at en virtuel hånd lukker sig, når du trykker på grebsknappen, eller at en pegefinger strækkes ud, når du sigter. Sådanne detaljer bidrager markant til følelsen af tilstedeværelse og realisme, hvilket gør oplevelsen langt mere engagerende for brugeren.
Tilføj Laser Sigte til Motion Controllere
Et laser sigte fra din VR-controller kan være yderst nyttigt i mange situationer. Måske skal du bruge motion controllere til at vælge noget i en menu, eller din VR-oplevelse kræver præcis sigtning. UE4 har en indbygget funktion til dette formål, kendt som raycast (eller line tracing), som lader dig skyde en usynlig stråle ud fra et punkt og registrere, hvad den rammer.
Raycast Eksempel
I dette eksempel vil vi vise, hvordan du opretter en laser, der peger fremad i forhold til din motion controller. Vi vil arbejde med en Blueprint Character, der er opsat til VR, specifikt med en kamerakomponent til HMD og to motion controller-komponenter.
Tegn Laser for Venstre Motion Controller
Denne Blueprint-opsætning tegner en fremadrettet laser fra den venstre motion controller. Variabelen 'Forward Distance' definerer, hvor langt laseren rækker. 'LineTraceForObjects'-noden er selve raycasten (laseren i dette eksempel) og kræver, at 'Draw Debug Type'-parameteren er indstillet til 'For One Frame' for at visualisere strålen under debugging. Når laseren overlapper med et objekt, er returværdien 'true', og du kan udtrække information om det overlappede objekt via 'Out Hit'-variablen. Desuden kan du specificere, hvilke aktører der skal ignoreres, og hvilke objekttyper der skal udløse et svar fra laseren.
For at definere, hvilke objekttyper der skal reagere, kan du gøre noget i stil med denne Blueprint-opsætning (forestil dig en node, der tager en array af Object Types, f.eks. 'WorldStatic', 'WorldDynamic', 'Pawn' osv.). For at få motion controllerens placering og rotation i realtid kan du bruge en lignende Blueprint-opsætning, der henter 'World Location' og 'World Rotation' fra LeftHandComponent.
Tegn Laser for Højre Motion Controller
Blueprint-opsætningen og strukturen er næsten identisk med den for den venstre controller. Den eneste forskel er, at alle komponenter, der refererer til den venstre motion controller, erstattes med den højre motion controller-komponent. Dette sikrer symmetrisk funktionalitet for begge hænder.
Tegn Laser for Begge Motion Controllere
Nu hvor du kan tegne en laser for hver motion controller, kan du kombinere Blueprints i en praktisk funktion. Opret en ny funktion i din Character Blueprint (f.eks. 'DrawMotionControllerLasers'), som indeholder logikken for begge hænder. Dette gør din Blueprint mere organiseret og genanvendelig.

Du kan derefter kalde denne Blueprint-funktion fra 'Event Tick' Blueprint-noden for at tegne laseren hver 'tick' for motion controllerne. Hvis du ønsker at styre, hvornår laseren skal vises, kan du nemt gøre det ved at bruge en boolean-flag og ændre dette flag i løbet af dit projekt (f.eks. 'bShowLaser', som du kan toggle).
Debug Laser
Det kan være nyttigt at teste, om din laser fungerer korrekt. For eksempel, ignorerer den de korrekte objekter og aktører? Her er en Blueprint-sekvens, som du kan tilføje til din laser-tegnefunktion for at hjælpe dig med at teste. Dette kan inkludere 'Draw Debug Sphere' ved hit-lokationen eller 'Print String' med navnet på det ramte objekt.
Håndtering af Motion Controller Inputs
UE4 gør det simpelt at håndtere motion controller-inputs. Der er en enkelt Blueprint-event, der håndterer input fra Vive Wands og Oculus Touch-controllere, hvilket strømliner udviklingsprocessen. I event-grafen kan du højreklikke på et tomt sted og søge efter 'motioncontroller' for at få en udtømmende liste over, hvilke knap-inputs der understøttes.
Vive Wands Mapping
Vive Wands har en række knapper og touchpads, der kan mappes til handlinger i dit spil. Typiske inputs inkluderer:
- Trigger (Akse og Knap): Bruges ofte til at skyde, gribe eller aktivere.
- Grip (Knap): Bruges til at gribe objekter eller udløse sekundære handlinger.
- Touchpad (Akse og Knap): Kan bruges til navigation (bevægelse), menupunkter eller som en retningsbestemt knap.
- Menu Knap: Bruges ofte til at åbne spillets menu eller indstillinger.
Oculus Touch Mapping
Oculus Touch-controllere tilbyder også en rig mængde inputmuligheder, herunder unikke touch-kapacitive funktioner:
- Trigger (Akse og Knap): Ligesom Vive, bruges til primære handlinger.
- Grip (Akse og Knap): Ofte brugt til at gribe eller holde objekter.
- Thumbstick (Akse og Knap): Bruges til bevægelse, rotation eller som en klikbar knap.
- A/B/X/Y Knapper: Standard ansigtsknapper for interaktioner.
- Menu/Oculus Knap: Til systemfunktioner eller spilmenuer.
Touch-controllere er også touch-kapacitive. Dette betyder, at det er muligt at finde ud af, om spilleren hviler sin tommelfinger på thumbsticken, om den er løftet, eller om de griber controlleren eller ej. For at få adgang til den touch-kapacitive API, højreklik på et tomt område i Event Graph og søg efter 'captouch'. Disse avancerede inputs kan bruges til at skabe mere nuancerede og realistiske interaktioner, f.eks. at en virtuel hånd åbner sig, når fingeren løftes fra en knap.
Interaktion med Motion Controllere og VR-miljøer
At håndtere input er kun den halve kamp; den anden halvdel er at skabe meningsfulde interaktioner med dit VR-miljø. Dette kan omfatte at gribe og slippe objekter, interagere med brugergrænseflader, kaste genstande eller udløse specifikke hændelser i verden. Nogle almindelige interaktionsmønstre omfatter:
- Direkte Manipulation: At gribe og flytte objekter fysisk.
- Teleportation: At bruge en laser-sigte til at vælge et sted at teleportere til.
- UI-interaktion: At pege og klikke på virtuelle knapper eller menuer.
- Våbenhåndtering: At holde og affyre virtuelle våben.
Disse emner er brede og dækker mange specifikke implementeringer. For dybdegående information om specifikke VR-interaktioner, såsom grabbable objekter, UI-interaktioner eller avancerede fysikbaserede interaktioner, anbefales det at udforske yderligere ressourcer og tutorials dedikeret til disse emner.
Bonus: Vive Tracker som Motion Controller
Hvis du har en Vive tracker, er dens primære anvendelse typisk til at spore objekter eller til mixed reality-videoer. Der er ikke mange tilbehør, der kommer ud for Vive trackeren, og spilmotorer som UE4 og Unity arbejder i øjeblikket på at få fuld understøttelse for Vive trackeren som en generisk sporingsenhed.
Den gode nyhed er, at du kan ændre Vive trackeren, så den genkendes som en Vive wand controller. Knap-inputs kan opnås enten via pogo-pins, USB eller en kombination af begge. Pogo-pins er simple at bruge, men fungerer ikke for alle inputs. USB-tilstand tilbyder understøttelse for alle inputs, men det kræver en mikrocontroller, der er kompatibel med USB-stakken, og en vis teknisk kunnen.

I udviklerdokumentationen kan du finde information om, hvordan USB-datapakker skal formateres, for at Vive trackeren kan genkende dem i USB-tilstand. Dokumentationen inkluderer også layoutet for, hvad hver pogo-pin gør. Denne avancerede brug giver dig mulighed for at integrere specialfremstillede fysiske objekter i din VR-oplevelse og give dem controller-funktionalitet, hvilket åbner op for helt nye interaktionsmuligheder.
Ofte Stillede Spørgsmål (FAQ)
Q: Hvordan får jeg min motion controller mesh til at blive vist i spillet?
A: Sørg for, at dit mesh er et child component af din UMotionControllerComponent. Kontroller også, at meshet ikke er markeret som 'Hidden in Game' i dets detaljer, og at materialerne er korrekt opsat.
Q: Kan jeg bruge C++ til at opsætte motion controllere i UE4?
A: Ja, du kan opsætte motion controllere fuldt ud i C++ ved at oprette UMotionControllerComponent-instanser og fastgøre dem til din karakter. Dette giver dig større kontrol og potentielt bedre ydeevne.
Q: Hvad bruges raycast (line tracing) til med motion controllere?
A: Raycast bruges ofte til at simulere laser-sigter, til at interagere med UI-elementer på afstand, til at vælge objekter eller til at teleportere spilleren i VR-miljøet. Den detekterer, hvad controlleren "peger på".
Q: Er der forskel på, hvordan Vive og Oculus inputs håndteres i UE4?
A: UE4 abstraherer mange af disse forskelle, så du kan bruge generiske 'Motion Controller' input-events. Dog har Oculus Touch-controllere unikke touch-kapacitive funktioner, som kan tilgås specifikt, og knap-mappings er forskellige mellem controller-typerne.
Q: Kan en Vive Tracker bruges som en fuldgyldig motion controller?
A: Ja, det er muligt at konfigurere en Vive Tracker til at blive genkendt som en Vive Wand controller, hvilket giver den knap-inputfunktionalitet. Dette kræver dog en mere avanceret opsætning, ofte involverende pogo-pins eller USB-kommunikation med en mikrocontroller, som beskrevet i Vive's udviklerdokumentation.
Konklusion
At mestre håndteringen af motion controllere i Unreal Engine 4 er afgørende for at skabe overbevisende og fordybende VR-oplevelser. Fra den grundlæggende opsætning i Blueprint og C++ til avancerede teknikker som dynamiske meshes for øget immersion og raycast til interaktion, har vi dækket en bred vifte af emner. Ved at følge disse retningslinjer kan du ikke kun få dine controllere til at fungere, men også designe interaktioner, der føles naturlige og intuitive for brugeren. Husk, at detaljerne i den visuelle feedback, nøjagtigheden af inputhåndteringen og den sømløse integration med dit virtuelle miljø alle bidrager til en højere grad af brugerengagement. Fortsæt med at eksperimentere, og lad din kreativitet blomstre i den spændende verden af VR-udvikling.
Hvis du vil læse andre artikler, der ligner Sådan Håndterer UE4 Motion Controller Inputs i VR, kan du besøge kategorien Teknologi.
