Skip to content

feat: vrcft module tracking mode support#16

Open
N1ades wants to merge 1 commit into
Jeka8833:mainfrom
N1ades:main
Open

feat: vrcft module tracking mode support#16
N1ades wants to merge 1 commit into
Jeka8833:mainfrom
N1ades:main

Conversation

@N1ades
Copy link
Copy Markdown

@N1ades N1ades commented Mar 13, 2026

Add VRCFT module tracking mode support

For me, this is useful because I can get better face tracking in the headset by using Foxy Face "mediapipe" for mouth tracking and Project-Babble/Baballonia app for eye tracking.

Summary

Implements tracking mode support in the FoxyFaceVRCFTInterface module, allowing users to selectively enable eye tracking, mouth/expression tracking, or both. The module now dynamically reports its capabilities to VRCFT based on the selected tracking mode.

Changes

  • Added TrackingModeEnum: New enum in Python code defining three tracking modes: mouth, eyes, and both
  • Dynamic module reporting: The VRCFT module now reports supported tracking types based on the active tracking mode

Behavior

  • Mouth mode: Only expression/face tracking is active, eye tracking is disabled and reset
  • Eyes mode: Only eye tracking is active, expression tracking is disabled
  • Both mode (default): Both eye and expression tracking are active

@N1ades
Copy link
Copy Markdown
Author

N1ades commented Mar 13, 2026

I had an issue using both modules in VRCFT: even though I configured Baballonia to use only the eyes, my face still flickered. So I tried to fix it by adding the same mod selection feature to the Foxy Face module, and now everything works perfectly for me.

@Jeka8833 Jeka8833 self-requested a review March 13, 2026 13:38
@Jeka8833 Jeka8833 added the enhancement New feature or request label Mar 13, 2026
@Jeka8833
Copy link
Copy Markdown
Owner

I'm curious how you did that.

  1. Did you install the FoxyFace module in Baballonia? Or did you use the official version of VRCFT and install the FoxyFace module in it?
  2. Do you use FoxyFace when you're wearing a VR headset?

@N1ades
Copy link
Copy Markdown
Author

N1ades commented Mar 14, 2026

I'm curious how you did that.

  1. Did you install the FoxyFace module in Baballonia? Or did you use the official version of VRCFT and install the FoxyFace module in it?
  2. Do you use FoxyFace when you're wearing a VR headset?
  1. I instal foxy face module and baballonia module in VRCFT
    I use eyes only mode on baballonia and mouth only on foxyface

  2. I'm using baballonia to track my eyes cameras and foxy-face mediapipe to track mouth camera in VR instead built in babble tracking, so I can get better results this way, but I still experimenting.

I want to achieve similar to quest pro ft quality with my beyond headset

Copy link
Copy Markdown
Owner

@Jeka8833 Jeka8833 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I need some time to think about the best way to do this.

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think that's unnecessary; it won't have much of an impact on UDP performance.

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

At first, I didn't understand what you were trying to do. Your idea won't work well for the eyes, since eyebrows in VRCFT aren't eyes but expressions. That's why VRCFT will ignore them anyway, even if you send them (as far as I understand). However, it will work perfectly for the lower part of the face (the case you're using).

Comment on lines +31 to +40
# Add tracking mode combo box
from PySide6.QtWidgets import QLabel
self.__tracking_mode_lb = QLabel("Tracking Mode")
self.__ui.verticalLayout_7.addWidget(self.__tracking_mode_lb)
self.__tracking_mode_cb = QComboBox()
self.__tracking_mode_cb.addItem("Both", "both")
self.__tracking_mode_cb.addItem("Mouth Only", "mouth")
self.__tracking_mode_cb.addItem("Eyes Only", "eyes")
self.__ui.verticalLayout_7.addWidget(self.__tracking_mode_cb)

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If you change the design, make sure to update the .ui files as well (they get recompiled into Python code).

Comment on lines +34 to +40
public override (bool SupportsEye, bool SupportsExpression) Supported =>
_trackingMode switch
{
"mouth" => (false, true),
"eyes" => (true, false),
_ => (true, true)
};
Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This code simply won't work and will always return (true, true); So just write (true, true);

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You can simply not call UpdateEyes and UpdateExpression in FoxyFaceVRCFTInterface — why keep two identical trackingMode variables? No changes are needed in this class.

Comment on lines 143 to 144
_packetProcessor.UpdateEyes(packet.Values);
_packetProcessor.UpdateExpression(packet.Values);
Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You can simply not call these methods if you need to disable part of the face.

@Jeka8833
Copy link
Copy Markdown
Owner

image

Try the beta version of VRCFT. I think that in the release version, the modules are loaded in parallel, which is why FoxyFace turns on all parts of the face.

image

It also seems that disabling parameter sending works as well (Don't forget to restart VRCFT after turning off the parameters).


Please try both methods and let me know the result.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants