‹ troublecurve.me

Tags / vr


As I have a Quest 3 and think that the excellent colour passthrough is hugely important, I suspect that the upcoming Steam Frame VR headset might feel a slight downgrade. However, I was interested in the wireless dongle that will come with the Frame to allow high-quality streaming from PC to headset.

I’d been using a Ubiquiti U7 Pro as a 6GHz access point for the Quest 3, but because of moving computers around rooms I could no longer have the Windows gaming PC wired to Ethernet, so would have to have the U7 connected to the PC itself for low-latency streaming. This looked like it would also require me to run the Unifi server software on the PC–and when that appeared to be some kind of containerised Linux on Windows pacman kludge I thought there must be a simpler way. Wouldn’t a Wifi 6E/7 USB adaptor just be able to create a wireless access point for direct streaming? Isn’t that just what the Steam Frame dongle will do?

There’s a great site by morrownr on Github about which USB adaptors have good Linux support, so although I planned to use the adaptor on a Windows machine, I went with the Netgear Nighthawk A9000 just in case. Lucky I did, as although it works absolutely fine on Windows to connect to wifi networks, it refused to enter “hotspot” mode (which is what Windows calls bridged wireless access points). Morrownr’s site had said that it could work in AP mode, however, so it was clearly a Windows thing rather than a lack of device functionality.

In came my Raspberry Pi 4 running NixOS. Previously used as a squeezlite music streamer with Hifiberry outputs and simple web server (including this site!) I could relocate it next to the PC, plug in the USB adaptor and then run a short Ethernet cable to the gaming PC. It has ended up working well, but there was somewhat of a learning curve…

Bridges

I’m bridging the Pi’s Ethernet port with the Netgear adaptor so the gaming PC and Quest are on the same subnet. However, don’t add the USB wifi adaptor to the bridge in configuration.nix as it won’t initialise correctly. The hostapd service will do the bridging later on.

networking = {
	bridges = {
      br0 = {
        interfaces = [
          "end0"
        ];
      };
    };
    
    interfaces.br0 = {
      useDHCP = false;
      ipv4 = {
        addresses = [{
          address = "192.168.3.1";
          prefixLength = 24;
        }];
      };
	};
};

You’ll also need the following lines for IP forwarding:

boot.kernel.sysctl = {
    "net.ipv4.conf.all.forwarding" = true;
};

I wasn’t sure if problems I had when troubleshooting were kernel-related, so I also forced an upgrade to Linux Kernel 7.0:

  boot.kernelPackages = pkgs.linuxPackages_7_0;

Apparently you should also add some lines to set region for the adaptor:

  boot.extraModprobeConfig = ''
  options cfg80211 ieee80211_regdom=GB
  '';

Then I needed to use DNSMasq as a simple DHCP server to give addresses to the PC and Quest 3. wlan0 is the Pi’s internal wifi adaptor that I don’t want using DNSMasq (it gets its address from the router):

 services.dnsmasq = {
    enable = true;
    resolveLocalQueries = false;
    settings = {
      server = [ "ADD.YOUR.DNS.SERVER" ];
      interface = [ "br0" ];
      bind-interfaces = true;
      except-interface = [ "wlan0" ];
      dhcp-host = [ "DEVICE:MAC:ADDRESS,STATIC.IP.FOR.THAT.DEVICE" ];
      dhcp-range = [ "IP.RANGE.FROM,IP.RANGE.TO,24h"];
      dhcp-option = [
        "option:router,192.168.3.1"
        "option:dns-server,ADD.YOUR.DNS.SERVER"
      ];
    };
  };

The hardest part was making hostapd’s configuration turn on Wifi 6E (the 6Ghz band). Most of the below was taken from morrownr’s example config on his site and then converted to Nix-friendly formatting. There is also some fussiness about which setting goes in which section, which led to some hair-pulling (and troubleshooting about how NixOS generates config files for services–far above my pay grade).

The Netgear USB wireless adaptor was detected as wlp1s01u1.

  services.hostapd = {
    enable = true;
    radios.wlp1s0u1 = {
      band = "6g";
      channel = 69;
      countryCode = "GB";
      driver = "nl80211";
      settings = {
        op_class = 134;
        country3 = "0x49";
        bridge = "br0";
        logger_syslog = -1;
        logger_syslog_level = 2;
        beacon_int = 100;
        dtim_period = 2;
        skip_inactivity_poll = 1;
        max_num_sta = 12;
        macaddr_acl = 0;
        okc = 1;
        wpa_key_mgmt = "SAE";
        wme_enabled = 1;
        wmm_enabled = 1;
        ieee80211n = true;
        ht_capab= lib.mkForce "[LDPC][HT40+][HT40-][GF][SHORT-GI-40][TX-STBC][RX-STBC1][MAX-AMSDU-7935]";
        he_oper_centr_freq_seg0_idx = 79;
        he_6ghz_max_mpdu = 2;
        he_6ghz_max_ampdu_len_exp = 7;
        he_6ghz_reg_pwr_type = 0;       
        he_bss_color = 37; 
        sae_require_mfp = lib.mkForce false;
      };
      wifi6 = {
        enable = true;
        operatingChannelWidth = "160";
      };
      networks.wlp1s0u1 = {
        ssid = "YOUR_SSID_HERE";
        settings = {
          ieee80211w = 2;
        };
        authentication = {
          mode = "wpa3-sae";
          saePasswords = [
	    { password = "YOUR_SSID_PASSWORD_HERE"; }
            ];
        };
      };
    };
  };  

Anyway, all that gets me a rock-solid 6Ghz connection with my Quest 3 streaming 250mb/s VR flawlessly. Not quite as easy as a dongle, but…

Apr 19, 2025

It’s holiday-time for me, which means there is a little more time available to play games. It has also meant more time thinking about how I play games and sometimes wondering why I play at all.

First off is what GOG tells me is risibly called LEGO® Indiana Jones™: The Original Adventures. My 5⅚ year-old daughter and I play a level or so a day of this as her preferred screen time, and we sit in the living room in front of the big HDTV plugged into to my PC. She loves the stress-free co-op, and although it’s no masterpiece I do think that playing the Temple of Doom levels actually might be more entertaining than watching that film again.

Next, I was looking for something straightforward to play, and ended up downloading the Kega Fusion emulator to play the original Sonic the Hedgehog. Simple games with big old pixel graphics look great on my Logitech G Cloud handheld, and although I could run an emulator directly on the handheld, I am so used to using Sunshine/Moonlight to stream from the main PC that I just do that. I’m sure it adds some few microseconds of latency but I am too old to notice or care about such things. I am just as bad at Sonic as I ever was–but it brings back happy early 1990s memories for me. Being handheld I can just do it on the sofa or in bed for a few minutes. Save states are the other thing that make these games far more playable than they used to be–and frankly every game should have them. Let the player decide how they want to play the game.

In terms of contemporary games I’m alternating between Indiana Jones the Great Circle and The Last of Us Part II. As the TV is inevitably already in use I find another room and put on my Quest 3 and use Virtual Desktop to stream to a giant floating screen. These kind of games just aren’t as impressive on portables, and the added benefit of VR is that I can run them at arbitrary resolutions–2560x1080 in the case of these two. Ultrawide gives a great wraparound feeling that works well for first and third-person games. When I was recently completing Astral Chain on the Switch I couldn’t stream or ultrawide it, but I still used a cheap HDMI to USB-C adapter so I could play on a big screen in the Quest. When I tried Astral Chain in handheld mode it just wasn’t as engaging. I’d also note that it’s the decent passthrough the Quest 3 provides that makes putting on the headset far less alienating than in the past.

Finally, I did actually play a few games in “full” VR. Minecraft Bedrock, as it turns out, has a VR mode built in you can access simply by launching it with a special shortcut. Worth it for a visit to a world you’ve spent some time in. Slime Rancher also has a recent VR mod out (not the official one) so I gave that a go, and despite the cheery music it is faintly terrifying trying to manage these greedy alien creatures by yourself on a desolate planet. Not as cosy as I expected.

Each game (and way of playing) really has felt pretty unique–and that is a testament to the amazing diversity in gaming available nowadays.

Dec 18, 2024

Yes, Zuckerberg’s Meta has proved deleterious to the Internet and society in general, but their hardware team does deserve credit for producing the best value VR headset out there. I upgraded from a Quest 2, mainly to play Batman: Arkham Shadow and to see how much a difference pancake lenses make, but the “killer feature” for me is something I didn’t expect: good passthrough.

Apple were right when they added a dial to control passthrough to the Vision Pro (though calling it the “digital crown” is obnoxious). VR headsets’ chief advantage is hiding the real world; but that’s their chief disadvantage as well. However, when I turn on the Quest 3 it immediately shows a good-enough colour passthrough that I don’t feel like I am being cut off entirely from reality. This makes putting on the headset feel significantly less disconcerting.

Since I’ve got the Quest 3, then, I’ve spent less time in full-VR experiences, but more in mixed-reality scenarios. Using Virtual Desktop to bring up a multi-monitor setup while sitting on the sofa, and being able to see people come in and out of the room (and where my mug of tea is). Punching targets flying out of my walls in Les Mills Bodycombat (and not worrying about hitting my inquisitive five year-old by mistake). Watching the 3D version of Tron: Legacy on a giant screen while in bed (and feeling only moderately anti-social). Having the passthrough there as an anchor to what’s going on around me makes me feel comfortable.

And when I’m feeling braver, I still also have the option of turning off the passthrough, clenching my jaw, feeling the rage, and punching goons in Gotham. I’m enjoying Arkham Shadow, too.

2025-01-02 It turns out my realisation that passthrough is important is shared by users of the Quest 3: this post by Meta’s Andrew Bosworth notes that “[o]ne of the first trends that we discovered after the launch of Quest 3 last year was people using mixed reality to watch videos while multitasking in their home—doing the dishes or vacuuming their living rooms”.

« Older posts Newer posts »