Announcement

Collapse
No announcement yet.

VR Expansion Plugin

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

    VR Expansion Plugin

    VR Expansion Plugin

    *Updated: 10/107/2019*


    Playable Template Demo
    Template Packaged Download

    Plugin Website:
    https://vreue4.com/

    Plugin Partial Features List:
    https://vreue4.com/features

    Documentation
    https://vreue4.com/documentation

    Website Hosted Patch Notes
    https://vreue4.com/patch-notes


    This plugin is intended to ease the creation of VR games/experiences in UE4. It is up to quite a few different additions now and has a fleshed out wiki to help ease into it (may be a version or two behind at times, I attempt to update it when I can, the template is generally the best informational tool). It is also intended to be compatible with multiplayer experiences without any direct changes from the end user, most of the relevant components / actors replicated themselves over the network with some customization included.

    It is fully Blueprint implemented but can be manually linked to and used in c++ if needed.

    Consider Supporting Me On Patreon

    Latest informational video


    Some Games In progress or released that currently use the plugin (These are just ones I know about)
    https://vreue4.com/games


    Plugin Pre-built Downloads
    https://vreue4.com/binaries


    Plugin Repository
    https://bitbucket.org/mordentral/vrexpansionplugin

    Plugin Example Template Repository
    https://bitbucket.org/mordentral/vrexppluginexample


    Open Input Module (Knuckles/ect until its a main part of the engine it will be a separate module)
    https://vreue4.com/ovri-howto


    Repository Installation articles By Community Member kusogaki77

    Basic Installation Step-By-Step


    Specific Commit Download Tutorial


    Pre-built binary useage

    Template Note:

    I would like to note by the way that everything currently in the template is an example of what I think is best practices (though maybe not implemented as well as I would for an actual game), not everyone is going to need the same set up and not everyone is going to need a full VRcharacter. Custom pawns that just use the motion controllers and camera / parent relative component would be useful to people that don't want gravity / collision. It also has to give examples of far more things than an average game is likely to use, so there WILL be refactoring involved if it is used as a base for one (input bindings for one).

    Template Change Log
    Code:
    04/26/2019
    
    Brought the manual interface implemented objects up to the new IsHeld changes and switched to querying with GripIDs where IsHeld is used elswhere.
    
    11/07/2018
    
    Changed the Gripping sphere trace to use HitLocation instead of ImpactLocation for the socket in range checks, while impact location is supposed to
    fall back to hit location if it wasn't able to be validated, there was an instance with a specific user where that behavior
    was not being shown (even though it works as intended for everyone else...). Since I don't know the engine level cause for this
    inconsistancy and since the actual difference is only up to the radius of the trace sphere (generally very small) I moved to the
    other variable.
    
    08/22/2018
    
    Re-wrote how the character / player controller is initialized to be far cleaner.
    
    Added Knuckles EV2 default controller profile and changed some of the character logic to check for it in OpenVR.
    
    Changed the FPS test pawn to load its profile in a different area
    
    Removed a corrupt BP and prepped everything so that packaging with PackageAllDirectorys works without issues on the template.
    
    Removed unused content that was just bloating the repository (left over EpicVR template content)
    
    Reference BP Grip script will be coming later.
    
    Changed Sedan actor to use a Boxmesh around it for the navigation modifier.
    
    07/18/2018
    
    Added a filter to "CanBeClimbed" to always ignore grip interfaced objects.
    
    Added a VRPlayerStart to the template level in place of the PlayerStart that
    was there before.
    
    Changed drawer actor to use sliders and the new momentum settings
    
    Changed the player controller to wait around for tracking before
    spawning. Checks for valid tracked position and if it isn't valid yet it
    waits before sending the players HMD info to the server (so server delays itself).
    
    05/25/2018
    
    Overhauled how the teleport controllers get the player state and set themselves up a bit.
    
    Added socketing capability to the sample gun for the body component on the example pawn.
    
    Added a socketing check to the VivePawnCharacter in the CallCorrectDropEvent area of the event graph (really simple).
    More complex implementations could skip querying the object and check themselves, or do other things.
    
    05/20/2018
    
    Remade the controller model loading and controller profile support to use the new bOffsetByControllerProfile option
    on the GripMotionControllers.
    
    05/16/2018
    
    Changed controller model loading to be per hand and safe for oculus platform in the template
    
    Corrected Epics roomscale rotation for teleport boundries (unsure if they fixed this in their base template ever).
    
    Added optional tracking sensors to the teleport outline
    Plugin Change Log
    Code:
    06/24/19
    
    Removed Physx and Apex dependancies, massive overhaul to the new physics interface added to the engine, prep work for Chaos
    
    Path notes here: https://vreue4.com/patch-notes?secti...actor-06-24-19
    
    06/13/19
    
    Added some prelim physics changes and replication improvements prior to the more major physics changes coming down
    
    Path notes here:
    https://vreue4.com/patch-notes?secti...eanup-06-13-19
    
    06/04/19
    
    Put out a revision for the LerpToHand grip script
    
    Patch Notes Here: https://vreue4.com/patch-notes?secti...nd-gs-06-04-19
    
    05/16/19
    
    Pushed a fix for throwing with SetAndGripAt center of mass setting with physics grips (the default one)
    
    Patch Notes Here: https://vreue4.com/patch-notes?secti...m-set-05-16-19
    
    05/08/19
    
    Added a new COM (center of mass) calculation / setting setup, this fixes some weird engine interactions with how
    Epic intended that you set COM and welded attachments (it doesn't work correctly with welded children).
    
    Patch notes here: https://vreue4.com/patch-notes?secti...-change-5-8-19
    
    04/26/2019
    
    Pushed another commit to both repositories, I figured that as long as I was requiring some re-factoring of how people connect to IsHeld, that I might as well finish it out fully with where I wanted it to be.
    
    Patch notes here: https://vreue4.com/patch-notes?secti...tor-04-22-2019
    
    04/22/19
    
    Added a beta FlightStick mode to the VRLever class
    
    See Patch Notes:
    https://vreue4.com/patch-notes?secti...de-for-vrlever
    
    04/18/19
    
    Changed the IsHeld Implementation and added AllowsMultiGrip to the VRGripInterface to prepare for some future features.
    
    See Patch Notes:
    https://vreue4.com/patch-notes?secti...anges-04-18-19
    
    04/16/19
    
    Pushed a new update live to both repositories yesterday, forgot to update this thread. I made a bucket updating system for 4.22 to manage the client auth throwing addition and when I saw the new subsystem engine capability I decided it made more sense as one of those. Figured that as long as I was cleaning it up and generalizing it more that I would add some blueprint accessibility to it as well for others to use if they choose too.
    
    Patch notes here: https://vreue4.com/patch-notes?secti...date-subsystem
    
    04/02/2019
    
    Added the GrippablePhysicsReplication class that overrides the default PhysicsReplication class in engine
    to allow for server side smoothing. If "bUseClientAuthThrowing" is enabled (On a grippable actor, not available
    for grippable components) and the grippable is set to a Client auth movement mode. The object will sends
    its state to the server at "UpdateRate" speed and the server will smoothed the replicated physics state
    and replicate back down to the other clients. After the thrown object hits a sleep state or hasn't changed
    status for a time-out period or is picked up it will end the replication.
    
    This is a very alpha feature and will need improvements likely over time.
    
    
    Ported epics 4.22 late update race condition fixes
    
    its also generally cleaner overall now
    
    
    Moved to using epics new local auth check that came in with 4.22, HasLocalOwner is a new component function
    and walks up the ownership chain for authority.
    
    
    Improved oldmove sends missing some special movement flags with CMC's.
    
    Added initial replication state to the button component.
    Fixed initial replication somewhat with the VRSlider.
    
    Made all interactibles and grippable components turn off movement replication when gripped.
    This makes it significantly safer to keep them replicating movement.
    
    
    Fixed some initialization issues with the lever on initial replication of the
    initial transform (specifically not re-calculating the angle correctly).
    
    
    Removed the bReplicatesMovement requirement on InitialRelativeTransform for
    all interactibles. Having that was pretty counterproductive. Just turning off
    replication for the component is better if this is needed to be disabled.
    
    
    Large header function body refactor, was about time that I committed to doing this, removing
    function bodies out of headers and moving them into the .cpp.
    
    
    Switched unique render commands with new format in 4.22
    
    
    Added EndPlay to grip scripts to allow people to manage timers and cleanup better.
    
    Move Grip Script Beginplay to a seperate function being called so that I can run custom logic in the
    future (like tick event registration) without the user being able to override the parent
    and delete it.
    
    Removed Grip Script BeginPlay being blueprint callable, that was never intended.
    
    Fixed a display issue with instanced objects in 4.22 and their property
    categories.
    
    
    Added a colorspace check to the openVR library texture creations
    
    02/11/2019
    
    Now caching the secondary attachment pointer, this lets me
    make sure that the server gets a valid pointer on release of secondary grips, also lets me throw drop events
    when the secondary attachment changed but its still a secondary.
    
    Changed to sending the full transform on drop with client auth grips instead of just position / rotation.
    
    Fixed a Z axis bug introduced with the lever angle re-write
    
    Moved EVRInteractibleAxis to the VRInteractibleFunctionLibrary header,
    it belongs there instead.
    
    Switched levers over to use the Interactible library functions
    
    Also made the dial use the same basic logic as the lever for rotation,
    with an option to revert back to direct hand sampling.
    
    Added new grip type "EventsOnly", will skip ALL extra logic of grips and only store the grip
    data and fire the events for it. Whether you do anything else with it or not is up to you.
    Like a CustomGrip except even more barebones as it does not fire TickGrip or obey any of the
    dropping simulation logic, it is also auto excluded from late updates.
    
    Stopped calling "StopSimulating" on Custom Gripped objects automatically.
    It is legal to start and keep a custom grip simulating, that call should have
    never been there. Anyone who needs their custom grips to auto stop simulating on grip
    will need to call it in the OnGrip event themselves.
    
    02/02/2019
    
    Fixed a net smoothing bug with linear smoothing that could cause crashes
    when rotating. Exponential smoothing is the engine default when using smoothing
    and smoothing is off by default in the plugin so this took awhile to run into.
    
    Now initializing some vars that Oculus may not be setting on mobile
    This would be a bug in the base engine source, engine source is still bugged but plugin motion controllers
    should function. Issues happen when tracking is lost on oculus platforms (IE: Oculus GO controller and app loses focus)
    
    
    Made GunTools virtual stock settings part of the global settings structure
    this makes it easier to store a copy in the character and replicate it to the server
    as well as from the server to the gripped object for setting.
    
    Also added the option to UseGlobalVirtualStockSettings in the gun tools grip script.
    When enabled it will load the current settings from the global settings (default true and only for locally controlled).
    When disabled it uses local settings of the script.
    
    
    Added custom movement events for climbing and low grav movement modes. (EventUpdateClimbingMovement/LowGrav)
    
    Is a better way of getting the hand offset than in the actors main tick, run the same logic but here so that it is taken in
    the same frame instead of the next.
    c++ projects can still override PhysCustom_Climbing to do the same or they can overide the EventUpdateClimbingMovement_Implementation
    
    Also am now properly setting / clearing the climbing variables, the time moments when it
    was being done wouldn't work with the new placement of the query.
    
    
    Many lever improvements on the back end
    mostly fixing Axis_Y issues since it is the last order of operations with Quats.
    Also added SetLeverAngle function
    
    Moved button overlap bindings later in init to avoid an editor copy error.
    
    
    Added a BP Accessible IsLocallyControlled to the motion controllers, it can be very useful, mostly
    with avoiding extra casts to check for local owner OnGrip ect.
    
    
    Changed LerpToHand to be a fixed time period of lerp, not speed based.
    
    Added a control distance variable to the LerpToHand gripscript
    If the distance to the hand is smaller than this value then the lerp
    script won't activate on grip.
    
    Default of 0.0f means that it will always activate.
    
    Also added a curve editor to it that is optional.
    
    
    Added some brief descs to the headers for the Grip scripts and removed the
    SHOULD NOT BE USED warning from gun tools.
    
    Fixed a scaling bug with the auto SnapToSocket setup when gripping.
    
    01/04/2019
    
    Many of these changes go for 4.20 and 4.19 versions as well (except for the new gun tools, it is 4.21 only)
    
    Finalized beta version of GunTools Grip Script, supports pivot offsets, recoil instances, virtual mount settings, extended smoothing.
    
    Moved smoothing settings out of default grips and into the gun tools grip script.
    This will lower default grip overhead and also let me specifically fine tune
    the smoothing for gunplay.
    
    Added "WantsDenyLateUpdates" to grip scripts allowing grip scripts to deny late updates when they don't want them.
    
    Opened up Grip Scripts to be editable per instance again instead of just in defaults.
    
    Added remote grip pivot setting to the motion controllers, allows easier remote gripping and custom operations / mobile VR ease of use.
    
    Fixed it so that attachment grips will now have full use of the late update settings
    and features. Also moved the interface late update deny checking to the end of the logic checks
    to save some perf on grips that will be denied anyway.
    
    Also fixed it to support Custom pivot component for attachment grips
    
    Move setting collision on to post moving capsule in seated mode
    Also use teleport for movement from seated position. Fixes some collision issues exiting a physics vehicle.
    
    
    Made bDenyGripping defaults visible for all interactibles.
    Also made BreakDistance be ignored if value is 0.0f on all interactibles (to match
    general grip settings).
    
    Added new DeltaTeleportation, a new teleport type added to help alieviate teleporting with physics simulating skeletal bodies in hand.
    
    Am now filling in the Component Velocity member of the GripMotionControllers.
    
    Added OnStartedTracking and OnEndedTracking events to the motion controllers.
    
    Added prelim OnBeginInteraction and OnEndInteraction events to the button component.
    Also added the Interacting Component to the button events as it is useful in itself.
    
    Removed IgnoreActorWhenMoving from grip inits, it was causing overlap spam as the primitive bodies
    were not correctly clearing overlap passes.
    
    11/07/2018
    
    Set multiple variables to initialize due to 4.21 warnings, regardless of if they really needed to be or not....
    
    Fixed multiple missing includes that UBT was hiding.
    
    Updated openVR tracked device properties to openvr .16
    
    Am now turning off physics simulation locally on all clients on Socketing operations to cover some edge cases / packet miss issues.
    
    The attachment grip type now calls attach on all clients to cover some edge cases / packet miss issues.
    
    Moved the NavMoveCompleted event into BaseMovementComponent so that SimpleCharacters can trigger it as well.
    
    Added teleporting flag to the "Exit Seated Mode" event so that the pawn teleports physics bodies (can't throw things in the way around)
    
    Seated mode now replicates and throws the OnSeatedModeChanged event to ALL players, not just the server and owning client.
    This allows you to react to it locally on simulated proxies as well.
    
    No longer using Epics TimeTick in phys_walking, this causes errors when the framerate gets really high (like when oculus rift is removed
    and the rendering is paused). This actually appears to be a potential bug in general with the root motion addition that I was basing my
    original implementation on.
    
    Changed the gesture components material that you can set for spline drawing to be a material interface instead of a UMaterial *.
    This way you can pass in material instances.
    
    Added in a bool to ignore gesture scaling for specific gestures, Also the ability to save gestures without autoscaling them to the database.
    
    Merged in a client authed movement mode fix that Epic added.
    
    Fixed multiple replication issues with grip scripts and net relevancy, they should be solid now.
    
    Removed dropping a grip if killing the motion controller and we are not the grip authority.
    
    Added a flag to grip scripts that allows the user to notify the gripping controller that it should drop the object as soon as possible.
    It is not safe to directly drop inside of a grip script due to some memory management that the engine is doing when passing back into
    c++.
    
    Added bIsForTeleport to grip scripts GetWorldTransform variables, useful to know on the grip end.
    
    Added BlueprintType to the base grip script class so that they can be directly referenced in BP.
    
    Fixed multiple bugs in the new Interactible Settings grip script.
    
    
    09/21/2018
    
    Added UAISense_Sight_VR, a drop in replacement for UAISense_Sight that offsets to a VR characters HMD location.
    
    09/16/2018
    
    4.19 and 4.20 changes (got back ported to 4.19)
    
    Simplified and improved the HybridWithSweep grip type.
    It should now performs less operations while also being of a higher quality.
    
    
    Allow gripping static mobility objects if the grip type is custom..why not
    Corrected a bad commit on the dial component that was causing some incorrect rotations.
    
    
    Moved SetHeld being called when an object is dropped to before OnGripReleased
    is called.
    
    Also moved it before OnSecondaryRelease is called
    
    Also moved the call to the objects own OnRelease to before its parent
    OnChildGripReleased as it makes sense that the object performs actions on
    itself first.
    
    This brings the flow of execution for dropping to parity with how it is done on grip.
    
    
    4.20 only
    
    Added GripStruct input Add/Remove Secondary Attachment point functions
    
    Many many optimizations and clean ups regarding the gripping and dropping functions, lowering code bloat.
    
    Added GripID as an input to DropObject and DropObjectByInterface, if the passed in object is
    empty it will attempt to use the grip ID to drop instead.
    
    I also added INVALID_VRGRIP_ID = 0 define for code use and locked out index 0 from being
    used as a grip id, this lowers the total number of possible simultanious grips per hand from 127 to 126.
    
    
    Exposed the GripMotionControllers DefaultGripScript pointer to blueprints so
    that people can access it and set variables on it (if it is a blueprint base script that is).
    
    Also Changed the default and gun tools grip scripts so that the pivot point is attained
    from the ParentTransform instead of getting the controller location again. This is not
    only slightly faster, but it also allows people to override the parent transform with something
    else (say a remote component) so that the grip doesn't have to be based on the controller
    itself.
    
    (force/remote grips for instance could provide a proxy components transform instead)
    
    
    Took a byte out of the positional replication for controllers and camera
    by making the logical assumption that 419.43 meters is a size big enough for any
    current roomscale technology.
    
    THEN Took back 1 of the 8 bits that I saved everyone in order to add a
    flag for quantization of the rotation on controllers / cameras.
    
    You can now set it from its default Short quantization to a 10 bit per axis
    quantization method, effectivly saving 2.5 bytes per rep and with 4x the granularity
    of the engine BYTE rotator quantization.
    
    This makes up for the lack of precision on the BYTE method but still allows for some
    decent savings.
    
    Also dropped a byte out of the CustomVRInputVector and RequestedVelocityVector.
    41,943.04 UU's should be MORE than enough leg room for these values.
    
    Also am now rounding MoveAction_Custom vector values to 2 digit precision. I was
    already doing this for all built in movement actions but the custom ones should
    also be restricted like this.
    
    08/22/2018
    
    Added GripScripts fully into the master branch with four reference c++ implementations
    GS_Default (default gripping logic)
    GS_LerpToHand (lerp initial grips to the hand)
    GS_InteractibleSettings (Functions like the removed InteractibleSettings options)
    GS_GunTools ( Currently unfinished set of tools for advanced gun interactions)
    
    Removed rollback on custom movement modes
    This is to remove "climbing mode" hanging in place and seated mode issues.
    Really only an issue in really high packet loss situations, but wanted to cover it.
    
    Also added a GetReplicatedMovementMode function that returns the current Conjoined movement
    mode.
    
    Set OnClimbingSteppedUp to a BlueprintNativeEvent so that c++ users could use it.
    
    Set GetOpenVRModelAndTexture node to not fail out if a texture is missing and to just pass out a nullptr now.
    It was failing on Knuckles Left controllers as they are missing a texure in full model mode from the OpenVR
    RenderModels api.
    
    Corrected an oversight with the new OnDropped event on the motion controllers having a possibly stale variable (thanks SlimeQ)
    
    08/14/2018
    
    GripScripts mostly final form has been added to 4.20 GripScripts Dev branches in
    both repositories. They need some testing and to be put through their paces prior
    to merging into the master branches.
    
    
    Initial knuckles porting and profile setup - (not public for awhile)
    
    
    Skipping some calls to slightly speed up nav agent retrieval
    
    
    Adding OnFinishedLerping events to the slider and lever
    Also enabling throwing slider progress events during lerping by default
    
    Added dial lerping, lerping speed, Finished lerping event
    Also added SetDialAngle function
    
    
    Corrected the HMD offset for the dynamic navigation mesh generation with
    a VRRootComponent.
    
    
    Correcting an oversight where a grip could not simulate on client side
    if replicate movement was never on the object.
    
    Also if a child component is supposed to simulate on drop, we need to also set it clientside
    if the component is not the root component, non root components do not replicate simulation
    state by default so in that case the client also calls it now.
    
    
    Defaulting welding to true for plugin attachment operations, didn't realize that the
    default setting is inverse between c++ and BP.
    
    Fixing socketing by adding a one tick delay after the socket and re-applying
    the relative transform. This is only done if both the parent and the child are simulating
    and is only there to avoid a race condition with the physics thread where the
    original grip constraint can reset the transform out of order prior to destruction.
    
    
    switched sweep detection on grips to component multi instead of sweep single.
    That function automatically accounts for the pivot offset / collision local pose.
    
    
    Worked around a physics replication issue that
    Epic introduced in 4.20, physics replication period is acting kind of badly now. They moved to
    a different (more efficient) system of handling the simulating position replication that
    they ported from Fortnite, however it has some little issues like not ending a targeted
    physics frame position setting when replication is turned on/off / when simulated or
    unsimulated.
    Last edited by mordentral; 10-08-2019, 09:36 PM.


    Consider supporting me on patreon

    My Open source tools and plugins
    Advanced Sessions Plugin
    VR Expansion Plugin

    #2
    Fantastic! That replication is going to make life so much easier for me.
    Gonna have to download it and give it a try!

    Comment


      #3
      Awesome work, this looks great!

      [MENTION=4285]mordentral[/MENTION] - If I wanted to use Mitch's template for the pickup system, do you think I'd be able to just replace the Attach calls with your Grip function (e.g., would replication still work there?)? I found the system in the SteamVR template that uses the GripMC to be a little cryptic in terms of being able to easily extend it and implement different sorts of items.

      ---------

      As an aside, I still think it would be beneficial to change how the Lock to HMD functionality works so that it would move the *actor* itself, rather than just components attached to the camera. I looked into it and it seems like that could be done by just recalculating the camera's matrix relative to the new actor matrix and then setting it on the actor where it currently does the component-move.

      I still think only moving the components could eventually cause gameplay problems (especially in cases of larger levels, multiplayer etc.), and have seen a few posts to that effect.
      Last edited by n00854180t; 07-12-2016, 06:56 PM.
      Storyteller - An immersive VR audiobook player

      Dungeon Survival - WIP First person dungeon crawler with a focus on survival and environmental gameplay ala roguelikes

      Comment


        #4
        Originally posted by n00854180t View Post
        Awesome work, this looks great!

        [MENTION=4285]mordentral[/MENTION] - If I wanted to use Mitch's template for the pickup system, do you think I'd be able to just replace the Attach calls with your Grip function (e.g., would replication still work there?)? I found the system in the SteamVR template that uses the GripMC to be a little cryptic in terms of being able to easily extend it and implement different sorts of items.
        Yeah it shouldn't be a problem, you'd have to keep in mind that Mitch's examples use attached simulating components with max Damping to keep them relative to the controller (if interactive), this plugin uses the sweeping functions to move items manually relative to the controller instead (and sends their components to the late update function). So there would have to be "some" changes, the plugin forces simulation off when gripping an actor so a bunch of nodes could / should be skipped from his example if using the grip function. I was considering implementing AttachTo as well as an option but after playing with it I didn't like how it worked so I scrapped my plans to support it.

        In my demo project I run all of the "Character has this in his left/right hand, drop this if he picks up that, ect ect" logic in BP and just call Grip/Drop in the plugin on what I decided to do from the server. It is game logic agnostic and just handles holding and dropping and triggering OnHit events.

        The steamVR template is very WIP and I get the idea that proteus is lacking in free time at the moment. The basics of gripping an object with my plugin is fairly simple, there is a write up on the motion controller wiki page with the basics and some best practices. I would have used Epics "World/Relative/Snap" enum like in attachment but passing in actual transforms has more total flexibility.

        wiki/VRGrippableMotionController

        *Note* Attachment is already replicated by default in the engine, when you attach a component it turns off replicating movement from the server and the clients handle it from then on out (until detached). That is one of the reasons why it doesn't sweep hit events on attached actors. You don't actually have to use the grip functions at all if you don't want to, they are just my preferred way of doing it.

        I may add back in having the server manually sweep actors attached to the controllers so that OnHit events still trigger, it was originally something I had it doing but removed it when I went over to only using the grip functions.

        Originally posted by n00854180t View Post
        ---------
        As an aside, I still think it would be beneficial to change how the Lock to HMD functionality works so that it would move the *actor* itself, rather than just components attached to the camera. I looked into it and it seems like that could be done by just recalculating the camera's matrix relative to the new actor matrix and then setting it on the actor where it currently does the component-move.

        I still think only moving the components could eventually cause gameplay problems (especially in cases of larger levels, multiplayer etc.), and have seen a few posts to that effect.
        It wouldn't be that difficult to create a custom pawn that samples the HMD position instead of the camera and offsets its location by the difference from the last sample point.

        The thing is that OpenVR returns the HMD location in relative space to the tracking volume you have set up so using the camera in relative space to the chaperone in the engine is a very clean solution to it as the pawn can act as the tracking space (that you move with teleport / other movement inputs) and the components as the relative location within that tracking space, you are essentially moving around the tracking volume with you.

        Do you have any quotes/links about the concerns? As I said it wouldn't be hard to implement I just don't see the point in doing so, but I would like to read about any issues that the current method presents as if they are significant enough I would have to reconsider LockToHMD. I haven't been able to think of anything that would be a problem for me so far and also haven't run into any issues with the default setup. You aren't moving component farther from the pawn itself than the size of the tracking volume in the default setup.
        Last edited by mordentral; 07-12-2016, 09:45 PM.


        Consider supporting me on patreon

        My Open source tools and plugins
        Advanced Sessions Plugin
        VR Expansion Plugin

        Comment


          #5
          Originally posted by lambomang View Post
          Fantastic! That replication is going to make life so much easier for me.
          Gonna have to download it and give it a try!
          I'm looking into smoothing replication at lower update rates by the way. I'll need to test of bunch of different rates and try some lerp/prediction tests to see what feels best and where it actually becomes a problem first. The default 100htz (matching pawn default) rate didn't need any smoothing that I could see so I left it out to get it out the door but I could see needing to add it in for 30htz or so (though it is only a per client network load and isn't that heavy).


          Consider supporting me on patreon

          My Open source tools and plugins
          Advanced Sessions Plugin
          VR Expansion Plugin

          Comment


            #6
            Hey Mordentral. Thanks for putting in the effort to make this awesome plugin! It really helps with jumping straight into VR and building stuff. I've been using your VRGrip plugin for about a month now. It helped a lot, but I have run into some issues.

            Migrating to VR Expansion Plugin
            I'm interested in migrating from your old plugin to this one, but I'm seeing some issues trying to rip out the old one and replace it with this one. I wonder if there's something simple I'm missing. Depending on how many people used your other plugin, it might be helpful to add a How-To to the readme.

            Collision Event Bug.
            I have a SphereCollision component parented under the grip controller. I'm using the begin/end overlap events on this collision to determine which object I can pick up. I'm noticing that when the grip controller is holding an object then BOTH overlap begin and end events are triggered on every tick. The events are only triggered on the colliders close to the object, but they are triggered on every tick regardless of which controller is holding the object. That is to say, if I hold an object in my right hand, then my right collider is triggered on every tick. Then if I bring my left hand close enough to my right hand, that collider is also being triggered on ever tick - even though the right hand is holding the object.

            This rapid-fire of begin/end overlap events is causing incorrect results when I poll which objects I can pickup. If I had to guess, I'd say something about the way the plugin is updating the gripped object position is causing collision events to freak out. I noticed the wiki suggests that I use a sphere trace instead of overlap events - probably for this reason. I'll use the sphere trace for now, but performing a sphere trace every tick is probably more expensive than using overlap events.


            Better Physics Behavior
            Have you read Nick Abel's article and TomorrowTodayLabs' followup on how they solved physics-based object movement in unity? It's a really interesting read, and they put their work up as a plugin for Unity called NewtonVR. Here's a sweet video from the article of the final interaction they achieved:




            Obviously their solution won't be ideal for everyone, but I do think they address a number of areas that the sweep-to method falls short in. Namely...

            Objects get caught on floor easily.



            You can't pick up objects with another object on top.



            You can't push/pull objects, and objects have no mass.



            What do you think about trying to port some of their ideas to UE4?

            Comment


              #7
              Originally posted by AssumptionSoup View Post
              Hey Mordentral.

              Migration
              Being a new plugin the classes technically are considered separate from their old versions, you actually have to place them back into the pawn and re-place their functions. I decided to rename it as the old name no longer suited the project but this is a sad consequence being a one time hit of placing the nodes again.

              Overlap Triggering
              I set move ignore to the controller when gripping an object, it is possible that overlap is triggering anyway as the current movement is swept location. You can either not use overlaps or set it to ignore the channel you place the overlap on after gripping (I have a special collision channel for traces / overlaps). I also don't call traces every frame, I call it on button press, but if you are looking to highlight objects to pick up I see your point. But you can always run traces on a timer set to 30-60 htz for highlighting and call the trace on button press for the actual pick up (my voxel project does this for block highlights).

              Push / Pull
              Yes you actually can, the object has to be simulating though for it to move it, i'll agree that the interaction is less than steller currently and I am going to provide a better option for real physics. The current grip is intended just for when you don't need full physics solving on the gripped object itself as it will be cheaper. It was also the fastest one out of the gate to implement so I could look at other things.

              New Grip Styles
              I fully intend to make a better grip option using physics, I originally had AttachTo set up and ran into it not being up to what I wanted from it and removed it from the grip function. Unity's solution is effectually what I am currently doing with location but done through the physics system instead so it actually slots right in. It is next on my Trello list actually to look into it now that I have decided to throw away AttachTo (spent my free time in the last day mulling over if AttachTo was worth it and trying it out).

              I don't like the visual drag latency in how they are doing it in Unity though and am pretty sure that there is a way around it by extending my current solution and using constraints (ripping from grab handles but forcing late updates and removing the lerp). I really like the interaction in say Hand Guns, Horseshoes, and Hand Grenades but don't like that the guns themselves lag behind hand movements visually (for actual shooting location they are correct so there is something to be said for that).


              TL;DR yes all of those things bug me as well and as a user of my own plugin I am fixing them. I'll move experiments to the side for now (was playing with movement options) and just implement the new grip option instead.

              The cool thing about the plugin is when the new grip is in you'll just have to select it from the grip style drop down and it should work.


              *Edit* Oh and I was looking into both hands on the same object interactions. Eventually both options should support that as well; but I will wayside it until the new grip is in too.
              Last edited by mordentral; 07-14-2016, 08:59 AM.


              Consider supporting me on patreon

              My Open source tools and plugins
              Advanced Sessions Plugin
              VR Expansion Plugin

              Comment


                #8
                Originally posted by AssumptionSoup View Post
                Hey Mordentral.
                I actually had this done yesterday but got side tracked trying to make a hybrid system (not sure how stable I can get that one yet). It needs some going over to make sure that multiplayer works fine with the new grip style before I merge it in but I think the video is pretty much what you wanted.

                Its up to 5 grip methods now I think (6 with hybrid if it makes it), you pick what one you want per item you are picking up and how you want it to behave. When it comes out this method will have several configurable options (you probably don't notice in the video but I have the grip strength 1000x higher on my right hand than my left so it doesn't free float as much in the video).

                I'll get it pushed out to the main branch of the plugin by the end of the weekend, I was off on a tangent for awhile there experimenting with a bunch of random things (VR gets me excited) or this would have already been in.

                Cheers



                Consider supporting me on patreon

                My Open source tools and plugins
                Advanced Sessions Plugin
                VR Expansion Plugin

                Comment


                  #9
                  Migration
                  Being a new plugin the classes technically are considered separate from their old versions, you actually have to place them back into the pawn and re-place their functions. I decided to rename it as the old name no longer suited the project but this is a sad consequence being a one time hit of placing the nodes again.
                  Thanks for the help. As it turns out, I had to delete the original VRGrip components before deleting the plugin, or my game would crash on load. After deleting the components, it was okay if I still had any variables with the VRGrip type (they got reset to Object). Then I just had to put the new plugin in place and run around reconnecting everything (that was less fun). Next time around, I think I'll integrate the plugin with my game via C++ so it's easier to refactor things. Blueprints makes refactors surprisingly hard with it's propensity to disconnect nodes! And speaking of C++, I don't know if you intended the plugin to be using in C++ or not. I'm definitely a noob at both C++ and Unreal, but it looks like the plugin classes are missing the VREXPANSIONPLUGIN_API (macro? keyword?) in order to be exposed to game logic. I can send a pull request that adds this if you're interested.

                  Overlap Triggering
                  I set move ignore to the controller when gripping an object, it is possible that overlap is triggering anyway as the current movement is swept location. You can either not use overlaps or set it to ignore the channel you place the overlap on after gripping (I have a special collision channel for traces / overlaps). I also don't call traces every frame, I call it on button press, but if you are looking to highlight objects to pick up I see your point. But you can always run traces on a timer set to 30-60 htz for highlighting and call the trace on button press for the actual pick up (my voxel project does this for block highlights).
                  You're correct, I'm using it for highlighting. I forgot to mention that in my original post. I'll have to play around with running my traces on a slower frequency, that's a good idea! I'm a little worried that there will be a disconnect between the feedback the user sees and the action that occurs - but I won't know how bad it is without testing.

                  I don't like the visual drag latency in how they are doing it in Unity though and am pretty sure that there is a way around it by extending my current solution and using constraints (ripping from grab handles but forcing late updates and removing the lerp). I really like the interaction in say Hand Guns, Horseshoes, and Hand Grenades but don't like that the guns themselves lag behind hand movements visually (for actual shooting location they are correct so there is something to be said for that).
                  I totally agree. I think having really good physics interaction is worth the trade off of having some latency on gripped objects, but it's definitely not a compromise I'd like to make if I don't have to.


                  I actually had this done yesterday but got side tracked trying to make a hybrid system ...
                  Oh man, this looks super awesome!! Yeah, it looks like most of the things I was interested in. I can't wait!

                  Comment


                    #10
                    Yeah I forgot the macro on the classes, I'll add it in to them today.


                    Consider supporting me on patreon

                    My Open source tools and plugins
                    Advanced Sessions Plugin
                    VR Expansion Plugin

                    Comment


                      #11
                      Merged the physics grip branch into main, it needs more play time to lock down bugs but was working for me during initial multiplayer testing (don't forget to replicate movement on physics objects so they stay sync'd). The hybrid setup "works" but needs to be finished still.


                      InteractivePhysicsGrip is the style you were looking for, it also adds two properties to the motion controllers for Stiffness and Damping when holding physics simulating objects, I may break that out into a object by object basis later.

                      There are also a few new functions and features, i'll document them tomorrow.
                      Last edited by mordentral; 07-17-2016, 10:38 PM.


                      Consider supporting me on patreon

                      My Open source tools and plugins
                      Advanced Sessions Plugin
                      VR Expansion Plugin

                      Comment


                        #12
                        Would any of the exposed OpenVR functions be able to return what kind of HMD is in use? Rift/Vive/OSVR. I need to change player class since the haptic events are very different on Vive vs Rift.

                        Comment


                          #13
                          Originally posted by Fantasifall View Post
                          Would any of the exposed OpenVR functions be able to return what kind of HMD is in use? Rift/Vive/OSVR. I need to change player class since the haptic events are very different on Vive vs Rift.
                          I think someone requested of Rama to have his library include that function. It is already in GEngine so I will throw it in anyway since it makes sense and is easy, but if you don't intend to use the rest of my plugin and already use Rama's library then you should be able to find it there.

                          Regardless I'll have it in this by the end of the day (have to push out some cleanup for things anyway later).


                          *Edit* Pushed the new function early as the rest of my work today will be on a new branch

                          GetHMDType - static
                          Last edited by mordentral; 07-18-2016, 11:49 AM.


                          Consider supporting me on patreon

                          My Open source tools and plugins
                          Advanced Sessions Plugin
                          VR Expansion Plugin

                          Comment


                            #14
                            Oh my, this Plugin couldn't have come at a better time. Literally just spent this last weekend testing my Vive game with some friends, and one of the biggest issues was the grabbing system I had made. My solution, using merely the built in blueprint functions was to turn off gravity on grabbed components. This wasn't the ideal solution but it worked for the most part. That said it seems this plugin gives far better control and I hope to implement it.

                            Could you by chance give some insight into the setup of the "New grip style" video? I've got a line trace on the controller trigger, then checking my grabbed object and then calling grip actor from your plugin, but it seems to go a bit crazy once attached. Will have a further tinker, but this does look promising. Great work!
                            Portfolio

                            Default Interactive

                            A Skip And A Hop Too Far Into Light Speed

                            Comment


                              #15
                              Thank you so much for the HMD type! This makes my life so much easier. However, ParentRelativeAttachmentComponent does not seem to work at all. I looked at the code and it seems like it should but all that's happening is occasionally, there will be an offset of the child component of the ParentRelativeAttachmentComponent. It just sticks at an odd rotation, and keeps following the HMD rot at that offset rotation 1 to 1. I tried with both Static and Skeletal meshes, and tried yaw values between 1-3 as well as much higher, locked on pitch and roll.

                              Comment

                              Working...
                              X