Pavlov Vr Gameplay
Asset flip with gameplay ripped straight from CSGO (which doesn't even work well in VR). It's a low effort attempt at filling a void in VR. I woudn't call it an asset flip with 50% of the assets made by me there's more original 3d art in Pavlov than in other VR Shooter. Seeing as I’m also a VR enthusiast and experienced VR Rapid Prototyper, I try to stay on top of new releases in the VR industry. Now I had heard of Pavlov VR for a little while at this point (maybe a year or so) and I had even seen plenty of videos on YouTube showing it off, comparing it to the likes of Counter-Strike but in VR.
Contents.Remap your keys and controls from the Windows Desktop without being in the VR World:(1.) Open SteamVR from a Windows PC(2.) Be on the desktop and navigate your browser toControls Scheme:The example shows the scheme for the righthanded setting. For left handed, its invertedHTC Vive:Pick up gun: put a hand on the gun's handle and press the grip buttons. At this point, it is safe to let go because the gun is attached to your hand.Let go of the gun: While holding the gun, press the grip buttons.To fire: Pull the trigger of the hand gripping the handle of the gun, with assault rifles, SMGs, and the m249 LMG firing with one hand will increase recoil and make the gun fire in an upward fashion. Firing the AWP, hunting rifle and Kar98k with one hand will make you let go of it and the gun will be launched to the ground behind you.To steady the gun: reach your free hand towards the muzzle of the gun and press the grip buttons, this will decrease recoil and allow you to keep hold of your sniper rifles.To buy equipment: before the round starts, press the right quadrant on the touchpad, this will open the buy menu. To navigate through the menu use the touchpad.To drop magazine: press the bottom quadrant of the touchpad holding the handle of the gun.To reload: press down on the touchpad to eject the magazine (on some weapons the magazine can also be removed by pressing and holding the trigger r hand over it). With your non-dominant hand to the left of your hip, press and hold the trigger to grab a new magazine, then move it to the gun.To cock the gun: on SMGs, the m249, and assault rifles after loading for the first time pull the bolt back and release with non-dominate hand. For pistols pull slide and release.
After the first time for rifles if there is still a bullet in the chamber press the upper quadrant of the trackpad and there is no need to pull the bolt back. Some rifles need to be cocked every shot.To talk: currently there is no push to talk option and the microphone is always on, when just talking normally your voice can be heard by both teams within twenty feet from you. To talk to team mates further away reach a free hand up to a shoulder and pull the trigger, when you hear static, your radio is on and you can start talking.To holster primary/pistol/knife/jades/bomb: move your hand to one of the circles on your chest and press the grip button. For the primary, holding the gun only with the dominant hand, move it to behind your back and press the grip buttons.
You should hear a sound when you holster a weapon/piece of equipment. This game is still in beta so the controls may change, if they are wrong please change so as not to cause confusion.Oculus Rift:Pick up gun: Reach out to the gun, wait for it to glow, and grab it by pulling the grip button with your index finger.Drop the gun: Let go of the grip button. You may need to reach out in order for the gun not to snap onto your body.To fire: Pull the trigger of the hand gripping the handle of the gun, with assault rifles, SMGs, and the m249 LMG firing with one hand will increase recoil and make the gun fire in an upward fashion. Firing the AWP, hunting rifle and Kar98k with one hand will make you let go of it and the gun will be launched to the ground behind you.To steady the gun: Reach your free hand towards the muzzle of the gun and press the grip button of your free hand, this will decrease recoil and allow you to keep hold of your sniper rifles.To buy equipment: Click your main hand's joystick. Push your stick outward and turn it around until you hit the desired category of weapon. To enter a category, turn the joystick in it's direction and click the joystick in again.
To exit the menu completely, click the middle joystick without moving it.To drop magazine: Press the B button (right hand on the trigger) or press the Y button (left hand on the trigger).To reload: Reach your free hand to either one of your hips and pull and hold the trigger. Bring your magazine/clip to the port of your gun, and it will snap into place.To cock the gun: on SMGs, the m249, and assault rifles after loading for the first time pull the bolt back and release with non-dominate hand. For pistols pull slide and release. After the first time for rifles if there is still a bullet in the chamber press the upper quadrant of the trackpad and there is no need to pull the bolt back.To talk: currently there is no push to talk option and the microphone is always on, when just talking normally your voice can be heard by both teams within twenty feet from you. To talk to team mates further away reach a free hand up to a shoulder and pull the trigger, when you hear static, your radio is on and you can start talking.Sections of the Oculus guide suffixed with a '.' were taken from the HTC Vive guide above.Windows Mixed Reality (Default):SEE ALSO:There are a few things you need to know and a few settings you should change before playing. Let's start with the controls that are available on your controllers.Grip - It's the button on the side of your controller, one that you press with your middle finger.Trigger - It is on the back of your controller, you press it with your index finger.Menu button - This is NOT the one with the windows logo on it!
It's the very small button between your joystick and trackpad.Now that you know the controls available, let's change a few settings. First off, you need to access the Main menu. To do so, you need to hold down the menu button and then press the trigger on your left hand. The menu will appear to hover above your left arm. Select items with the trigger of your right hand. Visually an important setting that you need to change is how the hands are mapped.
On WMR controllers, by default the hands are mapped the wrong way around. Enter the main menu and select settings, then toggle the auto-swap option. The other options discussed further are optional.
Since you're using WMR, it's likely your cables are too short to do 360 rotations (unless you bought extensions), so I would suggest going to the last tab in the options menu and map one of the inputs to RotationReset. This maps your snap turning to the left or right menu button (right preferred as your left one is used for menu and scoreboard access). Also, by default the movement is based on the direction of your left controller.
At the time of this wiki entry, if you lift your left hand while walking forwards, you will start walking backwards, so toggling Head Locomotion on the input tab is suggested to avoid this.And now the gun mechanics:Pick up gun: Reach out to the gun, wait for it to glow, and grab it by pulling the grip button with your middle finger.Drop the gun: Press the grip button. If you want to stick it to your body, hold the controller close to your left or right side, whichever is free and press the grip button. You can also put it on your back, but do it quick so the controller doesn't lose tracking (Works 99.9% of the time, at least for me).To fire: Pull the trigger (index finger) of the hand gripping the handle of the gun, with assault rifles, SMGs, and the m249 LMG firing with one hand will increase recoil and make the gun fire in an upward fashion. Firing the AWP, hunting rifle and Kar98k with one hand will make you let go of it and the gun will be launched to the ground behind you.To steady the gun: Reach your free hand towards the muzzle of the gun and press the grip button of your free hand, this will decrease recoil and allow you to keep hold of your sniper rifles.To buy equipment: Push the right side of your right trackpad will open the buy menu.
Touching the trackpad you can select the wanted category, and when it's highlighted just press down on the trackpad (make sure your finger stays in the same position, otherwise you may end up clicking on the wrong thing). To exit the menu completely, click in the middle of the trackpad.To drop magazine: Press on the bottom of your right trackpad, this acts as a mag release bolt. Good company tone.
(On AK you need to actually grip the magazine, you can't just drop it out of the weapon)To reload: Reach your free hand to either one of your hips and pull the trigger. Bring your magazine/clip to the port of your gun, and it will snap into place.To cock the gun: on SMGs, the m249, and assault rifles after loading for the first time pull the bolt back and release with non-dominate hand (using trigger button). For pistols pull slide and release. After the first time for rifles if there is still a bullet in the chamber there is no need to pull the bolt back.To talk: currently there is no push to talk option and the microphone is always on, when just talking normally your voice can be heard by both teams within twenty feet from you.
To talk to team mates further away reach a free hand up to a shoulder and pull the trigger, when you hear static, your radio is on and you can start talking.By default, you can only use your left trackpad for movement. If you want to use the joysticks, opt into SteamVR beta, where you can remap your controllers. There are already mappings shared on controller binding menu, so just use them and edit as suitable. Also, at the time of this entry the controller binding menu only works by accessing, you need to have SteamVR running with both controllers connected for it to load properly.Sections of the WMR guide were taken from the HTC Vive and Oculus guides above.
PrologueFor the past couple of years, I’ve been a pretty avid player of Rainbow Six: Siege. The masterful mix of strategy, reflexes, completely destructible environments, well-designed levels, audio design, and gameplay mechanics had me captivated from the get-go.Seeing as I’m also a VR enthusiast and experienced VR Rapid Prototyper, I try to stay on top of new releases in the VR industry. Now I had heard of Pavlov VR for a little while at this point (maybe a year or so) and I had even seen plenty of videos on YouTube showing it off, comparing it to the likes of Counter-Strike but in VR. However, the game’s lack of user-created content at the time made me think otherwise, so it drifted off of my radar.Fast-forward a year or so and my good friend is streaming Pavlov VR on Twitch, he said he just couldn’t get enough of it. And from the looks of his stream, he really wasn’t lying.
He invited me to play a few games of the custom game type Trouble In Terrorist Town with him. He’s a good friend and I hadn’t played any VR titles with him in a little while so I was happy to join and kill an hour or so hanging out with him.Needless to say, it lasted a bit longer than just an hour as we were having a blast. “This game really has evolved. There were just generic Counter-Strike clone maps the last time I saw this game,” I told him. “Yeah, that’s because these are custom maps.
They apparently have a mod kit,” he replied. “How did I miss this?” I thought to myself. Not too long after learning this newfound knowledge, I was already researching this supposed “mod kit”.
Turns out, Pavlov VR is made using Unreal Engine 4, and they’ve got an engine plugin that allows for easy custom map/game type integration into the game.Need I say more? The MissionAt this point in time, Rainbow Six: Siege is still highly regarded as one of, if not the, most competitive and watched FPS games in the world. This is also while Pavlov VR is the #1 VR shooter on Steam. It seems like a match made in heaven, right? Well, let’s find out! The Vertical SliceIn order to get a good idea of whether this idea is going to work, I need to create what’s called a vertical slice.
I need to take what makes Rainbow Six: Siege Rainbow Six: Siege, make it from the ground-up for VR, and confine it to a small section of a single level. By confining it to a smaller portion of a single level, it allows me to quickly iterate on the core mechanics and asset workflows that will be required to create an entire level, and ultimately prove whether this idea will work. If I deem the vertical slice worthy, then I take what I learned while creating it and apply it to the rest of the level(s).Wouldn’t it just be awful if I created the entire level from the start, only to find out that I created all of the destructible walls incorrectly, setting me back days and possibly even weeks? I should make this quickly. After all, I am a rapid prototyper.For the vertical slice level design, I decided I would go with replicating the basement portion of the popular House level.
The Basement BlockoutIn order for me to really get this level design right, I need to be accurate with the dimensions and layout, and I’d preferably like to do that quickly so I can get to the good stuff; VR interaction mechanics. But I can’t be quick or accurate by just referencing images of the level. Why not reference the level itself using by using our good friend, photogrammetry?Luckily Rainbow Six: Siege has a local spectator view that allows for birds-eye viewing of specific floors of a level. I’ll go ahead and open fraps, record sweeps of the basement floor at different angles and at the monitor’s full resolution/refresh rate (3440x1440@120hz in this case). After slicing off the sides, rotating, and rescaling (using a standard 10’ wall as reference), I got this result, and it only took a total of about 30-40 minutes!
Obviously, a lot of the geometry is smoothed out, jagged, and even non-existent in some areas, but thankfully I don’t really care about that. As long as the overall dimensions and layout are intact, it should act as a great starting point.
Now I’ll go ahead and model/UV all of the walls, wall studs, floors, stairs, and doorways based off of this photogrammetry model. In Unreal Engine 4Placing the walls in the editor was pretty straightforward, I just copied the transforms from 3ds Max and pasted them into the UE4 editor for each wall. LightingIn order to properly test a level design you need to actually be able to see the level, so I did a quick and dirty lighting setup that roughly imitates that of the basement from Siege. I also made a quick first pass of each environmental mesh and made sure that the lightmap densities were relatively uniform, as seen below.
ModelingEach base (non-fractured) wall panel was basically a modified cube at the industry standard drywall thickness of ½”. However when it came to creating the wooden studs between said panels, that required a bit more work due to the fact that they too were destructible.
I ended up modeling the base (non-fractured) stud frames using industry-standard stud spacing of about 16”. After I was done modeling and UVing the base studs, I used a 3ds Max plugin called FractureVoronoi which allowed me to quickly fracture the studs into the appropriate pieces, while still retaining the UVs (except for the inner UVs of course, since those did not exist before fracturing).
A large downside when fracturing a mesh with lots of spaced pieces such as stud frames is that the fracturing algorithm doesn’t take into account those spaces, which can lead to two separately spaced objects technically being considered a single object. This meant that I had to go in by hand and manually detach and reattach objects to make sure they were all properly separated pieces after fracturing.Textures/Materials Wall PanelsFor efficiency’s sake, I only created a single drywall material for the wall panels even though ultimately there will end up being wall panels that are actually painted or even have exposed wood paneling. I made the tileable drywall material using Substance Painter and Photoshop. Painter was used for base material layering/blending, placing the nails, and stamping the serial numbers/barcodes, while Photoshop was used to create the alpha textures for the aforementioned red serial numbers/barcodes. Inner Material SetupHere’s where things started to get a little tricky and actually required quite a few iterations.
Since Pavlov VR uses UE4 4.21, that means that I’m still limited to UE4’s Apex destructible mesh system (Pre-Chaos destruction which is available in 4.23). This Apex destructible mesh system is pretty outdated at this point, so much so in fact that UE4 has quite a few interesting problems when it comes to niche cases like this, and they’ve acknowledged that the problems will not be fixed so I guess I just have to deal.
With that said, I was quite hell-bent on making sure that when the wall panel fractured, there should be a separate material on the inside of the panel to help further sell that this wall really is a wall. Unfortunately, UE4 4.21 was not a fan of this idea.Upon importing a fractured mesh (the pre-fractured wall panel modeled in 3ds Max) to use as the Depth 1 mesh, UE4 would create a new material for each chunk of the imported fractured mesh, resulting in over 200 separate materials, aka draw calls, which is obviously a huge no-no. I needed there to be a maximum of 2 material draw calls per destructible mesh (One for outer, one for inner), so I started looking for different routes.Was this reproducible in 4.20? What about 4.19? How about 4.18? Looks like 4.18 doesn’t contain this bug as long as you fracture the mesh within the destructible mesh editor.
Strange workflow, but doable. In fact, this probably saves me time as I no longer have to worry about fracturing the wall panels in 3ds Max. So I went on to import every base (non-fractured) wall panel into a separate 4.18 project (making sure to keep the same folder structure as my 4.21 Pavlov project), fracture it, and then migrate them all over to my 4.21 Pavlov project. Due to keeping the same folder structure as the 4.21 Pavlov project, the migration was seamless, assisting in creating a smoother workflow.The materials and fracture properties just so happened to have carried over without a hitch. Although trying to fracture the mesh again in 4.21 led to reproducing the huge amounts of materials found before. So if I need to re-fracture the wall panels, I need to be sure to do so in the 4.18 project and migrate it over.
Again, strange workflow, but I guess it could be worse.StudsThere are two different types of studs in Barrage; wood and metal. The only difference between the two is indicating which walls are completely destructible. Wooden studded walls will allow complete destruction through both the panels and the studs, allowing users to walk through, given a large enough hole of course. However, metal studded walls will only allow the wall panels to be destroyed, meaning the user can use it to shoot or peak through, but not to create a new walking path.When it came to creating the material for the studs (especially wooden) I wanted to make sure that the grain ran in the proper directions, so I made sure to rotate the UV islands in 3ds Max to correspond with the tileable wood material seen below in Substance Painter. Was this workaround worth not going back and redoing the UVs for each fractured stud model? Probably not, since this method will ultimately consume slightly more video memory in the end, but it was fun to implement!Upon finishing the wooden studs material, I went ahead and quickly created the material for the metal studs since it’s pretty straightforward.
According to a little research, almost all metal studs are made out of galvanized metal, so off to Substance Source yet again. Turns out Source had the perfect match, so I went ahead and threw it into Painter and adjusted some of the parameters until I was happy with it.
I came to the conclusion that each destructible wall was going to consist of a wall panel for each side and wooden studs to fill in the center. From there I would be able to create a single parent actor in UE4 that would allow me to simply swap out the destructible mesh components for each child while still retaining all of the functionality found in the parent. Now I can basically just copy-paste destructible walls where need be. This allowed me to place all of the destructible walls in their respective locations within a matter of minutes. Perfect.The DestructionThis part took quite a bit of iteration to get right, as there’s quite a few facets that go into making sure the walls are an actual fun gameplay element rather than just frustrating scenery. I don’t want the walls to be so easy to destroy that players can knock them down in a matter of seconds, ruining the flow of the gameplay.
I also don’t want it to be so difficult that it completely discourages the fun of destructible environments. All the while trying to keep performance in check. After all I am developing for not just VR, but VR on lower spec hardware than my own.I’ll go ahead and start with tweaking the fracture damage threshold for both the studs’ and panels’ destructible meshes. But first, I don’t have a baseline of how much damage the walls are taking depending on the weapon. So how do I figure this out?
I’ll take the damage value from Event AnyDamage, plug it into a Print String, shoot the walls in the game, and write down the values. Easy enough.Unfortunately, when using Pavlov’s UE4 plugin to create the pak file to deploy to the game’s local directory, it packages the project in the Shipping configuration, meaning that there’s absolutely no typical debugging methods available to use while in the game itself. That definitely complicates things. Time to get creative!Luckily UE4 has TextRenderComponents, which can actually be seen properly in Shipping configured packaged games, I just have to be sure to place them in an easy to view spot. That appeared to do the trick. I just used the same method that I would have used with Print String, except applied it to the text component. Now I could see the damage values being applied to the wall of each weapon upon shooting at it in-game.
At this point, I won’t go down the rabbit hole that is showing debug damage events. From my findings, a single bullet’s damage ranged from 36 (pistols or individual shotgun pellets) all the way up to 250 (Revolver or snipers) depending on range of course, since Pavlov appears to have a damage falloff system.Alright so now that I knew that, I could start to play with some middle-of-the-road values and see what works best.
After about 5 iterations of different damage values, this is what I settled on for both the studs and panels. Damage Threshold.Studs: Thick wood is obviously going to be quite a bit more enduring than ½” drywall in terms of damage, so the damage that it takes to destroy a single chunk should be quite a bit higher.Panel: This value ended up striking a pretty decent balance between fun and challenging. It won’t take a matter of seconds to create a hole large enough to walk through, but it also won’t discourage players from trying to get a peak on someone in a pinch.DebrisRemember when I mentioned performance? Well this is where that mostly comes into play. You’ll notice how the debris parameter values are all set to zero.
This means that when a chunk breaks free, that chunk can now have timeout/separation values applied to it which determine how/when it should be destroyed, therefore removing a draw call. Having physics looks nice and all, but it starts to become quite the performance hog when you have double, and sometimes even triple, digits worth of simulated objects on top of the object draw calls. So in this instance, we’re setting the debris values to zero which causes the chunks to be destroyed immediately once they take enough damage to fracture. This is applied to both the studs and the panels.Note: These debris values will not actually work unless the flags Enable Debris, Debris Timeout, and Debris Separation are enabled alongside Debris Depth being set to 1.Outer Stud PiecesI figured it would be kind of strange for the player to destroy the entirety of the studs, since 1) it would leave an oddly unnatural square hole for players to walk through and 2) that would mean the insides of the accompanying walls would be visible, which would not be preferred. So I selected each outer chunk of the studs in the destructible mesh (except for the bottom once since that would prevent players from walk through) and I enabled the Do Not Damage flag. Upon clicking the checkbox, the engine crashed.
Okay, I’ve had plenty of strange flukes that caused UE4 engine crashes, so I’ll just try it again. I opened the engine again, selected the chunks, and clicked Do Not Damage. Oh boy, here we go again.So of course I start trying older versions of the engine to see if the bug is present there as well. Luckily, my first shot trying it in 4.20 worked. I could enable the proper flags to prevent chunks from being damaged or fractured. Migrating over to my Pavlov 4.21 project also appeared to be a success.