Skip to main content

On Sale: GamesAssetsToolsTabletopComics
Indie game storeFree gamesFun gamesHorror games
Game developmentAssetsComics
SalesBundles
Jobs
TagsGame Engines

NoTaMu

43
Posts
1
Following
A member registered Aug 19, 2020

Recent community posts

Thank you for the clarification, I got a bit dizzy while looking for the correct flags 😂

(5 edits)

You can disable it per layer by using the T and I (talking and idle) buttons next to the Individual Motion sub-menu (breathing would be idle, by the way):


But if there are many layers that you want to fix, I'd suggest opening the .xml file of your model with a text editor and replacing (Ctrl+R in Notepad) all breathing="true" with breathing="false"

I hope that helps!

Edit: I've realized non-minimal layer also add a "talking" motion (the T button in the screenshot above), so if you want to get rid of that too with the text editor method, you'd have to replace motionStretch="2" with motionStretch="0"  bounceType="1" with bounceType="0"

Psst, let me tell you a secret... It already is open source, it always has been 😉

I was testing Nobara/Fedora 42 in a virtual machine recently and I only managed to run RahiTuber after installing these libraries:

  • portaudio
  • portaudio-dev
  • SFML
  • SFML-dev
(2 edits)

Looks like it's working as intended: as it's set up, it will trigger the state any time between 0.4-11 seconds.

Variation is added-substracted to the interval, so if you want the timing to be, for example, between 3 and 8 seconds, interval would be set to 5.5s and variation to 2.5s (because 5.5-2.5=3 and 5.5+2.5=8).

Tell me if you need any more help or I explained something poorly, English isn't my first language.

TLDR: set interval to 5.5s and variation to 2.5s 😅

(1 edit)

Folders!

There are many possible ways to do it using folders, but the way I would do it is by creating a folder for every hand toggle with the gloved and ungloved sprites inside (with the one I don't want by default set as hidden).

Then, for the "gloves" state, I'd make a single toggle state that hides all the default sprites (e.g. all gloved sprites) and shows all ungloved ones; and for the hand states (set as permanent, not toggles) each one would hide all "hands" folders except the one I want to switch to (that one should be set to "show", don't leave it as "no change"!).

I hope that made sense 😅

Oooh, my C++ is pretty basic and when I saw that part of the commit changes I thought that was it haha. I'm glad to help!

(3 edits)

Awesome! I think Stretch has this bug too (I peeked at the code and I saw that lines 4117 and 4118 in LayerManager.cpp still use floating point precision for stretch, but I don't know if that's it), but with that turned off it looks like it's indeed fixed! Woohoo!

(5 edits)

Unofficial Tutorial: DIY Head Tracking

DISCLAIMER: THIS IS NOT A RAHITUBER FEATURE. IT'S A CREATIVE WAY OF USING SOME SOFTWARE ALONG WITH IT AND THERE ARE NO GUARANTEES THAT THIS WILL WORK FOR YOU.

Did you add mouse tracking to your RahiTuber model, but your favorite game loves to hold your mouse for itself and leave your character still as a... Well, a PNG?
Luckily, with the addition of Controller tracking, you can now use opentrack to get some basic head tracking (Yaw, Pitch and Roll).

Requirements

This should also be possible on Linux, but I lack the knowledge to do so, so this tutorial will be focused on getting it working under Windows 10/11 (Windows 10 32-bit is not compatible).

The only hardware requirement is a webcam with at least 640x480 resolution at 30fps (lower resolutions/framerates might work, but at the cost of movement quality or delay).

We will use three pieces of open source software:

  • opentrack, a program originally meant for tracking user's head rotation and transmitting it to flight simulation software and military-themed video games.
  • vJoy to simulate a controller that RahiTuber can use.
  • HidHide to hide said controller from games and make vJoy work as intended.

Only the opentrack and vJoy versions linked above will make this setup work and we will have to follow some steps to make them work together.

I also made a basic demo model for you to test the setup and analyze how it works. Unzip it in your RahiTuber folder.

Installation and initial setup:

  1. Install opentrack, but don't run it yet.
  2. Install vJoy and restart if asked to.
  3. Go to vJoy's install folder (“C:\Program Files\vJoy” by default) and copy the file vJoyInterface.dll that's inside the x64 folder.

  4. Go to opentrack's install folder (“C:\Program Files (x86)\opentrack” by default) and replace the file inside the modules folder with the one we copied (you will be asked to provide administrator permission to that action).

  5. Go to your Windows Start menu and look for the vJoy folder. Click “Configure vJoy” inside of it.
  6. Deselect all of the axes except for X, Y and Rx. Click “Apply” and wait for it to finish saving the configuration before closing the window.
  7. Install HidHide and restart if asked to.
  8. Run HidHide. In the Applications tab we will add any program that we want/need to see our virtual controller. Click the + button and add opentrack's executable (That's “C:\Program Files (x86)\opentrack\opentrack.exe” by default) and do the same for RahiTuber (add “RahiTuber.exe”, “RahiTuber_64.exe” or both). If you move your RahiTuber folder down the line, you will need to add it here again. In the Devices tab, check the Virtual Joystick entry and the “Enable device hiding” option. You can close HidHide now.


  9. Run opentrack.

Opentrack configuration

First, I will give you the basic settings you will need for this to work, and I will give you my personal recommendations for a smooth result later.

Main window


Here we need to set our Input (the head detection) and Output (the virtual controller). We can leave the Filter option by default for now, we'll talk about this later

  • Input: “neuralnet tracker”
  • Output: “Joystick emulation -- vjoystick”

Options window

Output tab


For some reason, only 3 of the six axes work for our purpose: Yaw, X and Y (this is why we configured vJoy to only use those axes and prevent unwanted effects). We need to re-assign where they get their data from:

  • Yaw <- Roll (Post-invert)
  • Pitch <- Disabled
  • Roll <- Disabled
  • X <- Yaw
  • Y <- Pitch (Post-invert)
  • Z <- Disabled

This will make the preview octopus placeholder move funny when it's running, but don't worry, that’s normal.

Tracker tab


We could leave this tab untouched and it would work, but changing the model used for head tracking to the newer model will use less CPU and give a smoother result (try the big version if your camera is too noisy, but be advised that it is more CPU intensive):

  • Select Pose Net ONNX (last option at the bottom): head-pose-0.2-small.onnx

You can now hit opentrack’s Start button, run RahiTuber and load the demo model to test it. If the smiley face imitates your head movements, congratulations! You've made it through the hardest part!

Personal recommendations

There are some settings that depend on your particular hardware/illumination/webcam and you'll need to fine-tune them. These are my suggested starting points, but don't feel afraid to try and find what suits you best!

Filter


The default Accela filter can be a good starting point, but I personally recommend using the NaturalMovement one. Next we can click the hammer icon next to it (or go to the Options>Filter tab) and adjust its settings. I set both Responsiveness sliders to 15 and the Drift speeds to 7.50 as a starting point. If you like the result, you can leave it there, but if you need to fine-tune it, lowering the Responsiveness will reduce jerkiness and increasing Drift speeds will make it so you will need faster head movements for them to register. Try to find your sweet spot.

Shortcuts (Options window tab)


It's a good idea to set a keybind to Center, that way you can recalibrate your head position to neutral any time you want. Enable tray and Minimize to tray on startup are recommended for less screen clutter.

Relative translation (Options window tab)


Enabling Neck displacement can make your movements register better. 15 cm is a good starting point for me, but increase or decrease it if you think your head is somewhat larger or smaller than standard.

Game detection (Options window tab)


If you add a program to this list, opentrack will auto-start tracking when you launch said program, so it's recommended to add RahiTuber's executable using the + button.

Tracker (Options window tab)

If you know your webcam's FOV, enter it here for more accurate calculations. If your camera uses MJPEG it may be a good idea to check the option to reduce CPU use.

Mapping

In this window you can adjust the ranges of movement you need to do. As we routed the output axes, the tabs are now:

  • Yaw tab is your Roll. Start at 20º and tune from there to your liking (this is your real world angle, so the lower it is the more exaggerated the model’s roll will be)
  • X tab is your Yaw. The default numbers are a good starting point. The higher/lower the input number is, the more/less angle movement you need to do in real life.
  • Y tab is your Pitch. Same as the X tab but for vertical movement.

You can also modify the response curves if you need more control over it. Vertical axis is the "gamepad" output and Horizontal axis is the head detection input.

How to use

If you set up your motion tracked layers to use Controller -> Left axis they will follow your Yaw and Pitch.

Any layer you set to use the Right axis will register your Roll movements as an horizontal movement. You can get different effects by using only Rotation Limits or by combining it with Movement Limits, but only the horizontal field will have an effect.

Feel free to see how the demo model is set up to better understand it.

Get creative!

I’ve shown you a way to use this, but the real fun begins when you get creative with it. Does your character have wings, long ears or other appendages? Why not use “Roll” to make them move at will? And remember you can always mix mouse and controller tracking if you want to! Please, do share how you use it, I'd love to see it!

Rahi, this is amazing!!! 😲

I haven't tested the new tracking much (I need to get my gamepad back first 😅), but the rotation limits are so fun!! And the smooth setting is great too!

I noticed an itty-bitty bug though: The restore button for smooth seems to be broken 😛

Don't stress too much, you're already doing an amazing work! I can't believe how far RahiTuber has come in a few months!

As a workaround, I've managed to kind of restore the un-clipped blend for my clipped shadows (using Multiply, I don't know if this approach would word for other blend modes) by reducing the layer's alpha by 75% (that's A:191 for anyone wondering) with the tint option.

(1 edit)

Hellooo!

I've noticed something inconsistent with blend modes and layer clipping when setting up some shadows.

It looked like the Multiply blend mode was stronger when the layer was clipped (as in it's darker than if it's not clipped), so I did some testing and it seems like blend modes act weird if the layer texture has partial transparency and it's clipped.

Edit: In this example you can see that the clipped layer it's darker and the only different setting is the clipping.

(1 edit)

I suggest you use 127.0.0.1 instead of localhost as it's being deprecated (maybe it has something to do)

I changed the default port to 8001 too because 8000 seemed to be used by some games or programs I use.

Also, try using the "Copy Request" button inside the states (it was added after that post you followed) just in case there's some kind of typo.

I hope all this helped 😅

I found a bug again! (Why do I always break things? lol)

The software crashes if a layer that is clipped inside another is duplicated or re-arranged in the list.

(3 edits)

Awesome!!!

PSA: Since the Scale Filter variable has changed from Boolean (true or false) to binary, those that used it before will find it defaults to "Nearest pixel" in this version. A workaround if you need to restore many layers is to edit your .xml file (must NOT have been saved with this version) with a text editor and replace :

Replace:With:
scaleFilter="false"
scaleFilter="1"
scaleFilter="true"scaleFilter="0"

^Fixed

There's no need for credit! 😄 But if you really want to, either NoTaMu or NotamuVic are fine!

I made this "Powered by Rahituber" Twitch Panel. Feel free to use and share 😉

Rahituber_Twitch_Panel.png

Awesome! Thanks for the fixes and extra features once again! 😄

I think "Soft Fall" (in Audio Input settings, right below the layer manager) is what you're looking for 😉


Oh, so that's why it didn't go up to 120 before!

I've been investigating and it seems like it's a driver problem (NVIDIA in my case) and not a SFML one. Turning off "Threaded Optimization" in NVIDIA Control Panel solved it. I guess that's a partial win 😅

Going off on a slight tangent, I've noticed the FPS determine the physics movements and I came across this article that might be helpful to make them consistent 

I hope all of this helps!

To be honest the misalignment isn't noticeable in a normal use case, but while playing with more exaggerated values I started seeing it and I cranked it all up to see what it was 😂

The one that was annoying was the VSync because it worked perfectly before and at first I didn't understand why the CPU usage was so high all of the sudden. Oh also, in 13.32 and before, VSync On used to limit the frames to 60 in both my monitors and now it goes to 120 in my main, but I don't know if that's related and helps tracking the issue.

Oh that makes sense, I felt it was intentional. It would be great!

(3 edits)

13.4 Bug Report incoming!

  1. Motion Inherit Stretch:
    1. I'm not sure this one is a bug. For clarity I'm going to call a horizontal stretch Squish and a vertical one Stretch.
      I've noticed it works like this: Left to Right and Down to Up cause a Stretch and the oposite movements cause a Squish effect (and the other way around when setting negative strength values).
      In a way, I find that effect weird for horizontal movements. I kind of expected it to do the same deformation when moving either left or right. But I also like the effect it has when moving vertically, I guess it resembles gravity in some way.
      Whether it's a bug or intentional, I'd like to be able to make one axis "symmetrical" (as in doing the same effect when moving left or right/up or down) if possible.
    2. When using this feature, child layers get slightly misaligned temporarily when the deformation is being applied. I've got the feeling it has something to do with how the Stretch effect stores the coordinates, like it needs more resolution, maybe (I exaggerated the settings and applied inherited rotation to be able to take this screenshot showing the misalignment. It's way more subtle/barely noticeable with normal settings).

      This doesn't happen with Stretch off.
  2. VSync/FPS Limit:
    When trying the new FPS limit I've found some performance issues with Vertical Sync.
    I use two screens, a main 120hz monitor and a second 60hz one (I run RahiTuber on this one). If I turn on VSync, the FPS get limited to 60 as expected and the GPU goes down, but the CPU usage stays the same. It only goes down to normal levels if I turn it off and manually limit the frames per second to 60.


    I did an experiment with no layers (to be sure of the bare performance) and VSync turned on in both 13.32 and 13.4 and... Yeah, something about it is eating the CPU now:

I'll update you if I notice anything else, for now I'll be squishing parts, I'm loving this feature hehe

It works!! Also, the Inheritance Graph is great! Thank you!
I've fixed my rotations too, I didn't know they were broken. I did set them up negative by feeling 😅

I've started checking the new changes and I think I've found a bug or two, I'll make a new post to keep this organized 😛

Thanks! I'll try the new version during the weekend and I'll let you know how it goes! ^^

(3 edits)

I'm going to try to recreate the broken state and send the model to you. I did notice something weird with the folders, so I hide the contents too to be sure. (Sorry for a deleted reply earlier, I thought it fixed by itself while recreating it and it turned out I just deleted a folder and not it's contents 😓)

I've just tried replicating your setup with two empty layers that both have mouse tracking enabled, the inheritance goes like this:
someMoreMotion > someMotion > heart 
I couldn't find any issues with this setup.
Did I miss something?
Do all your layers have "hide with parent" turned off?

Yes, "hide with parent" is turned off and I believe that order is correct, but in my case someMoreMotion would probably inherit from another sprite that inherits from aDifferentMotion, etc... So maybe I'm stressing the software too much 😅

(1 edit)

Sadly the transparent sprite didn't work so I guess it must be a stacked mouse tracking issue, and I found a huge bug in the new Contrast theme: it's missing the "load"/"save" buttons in the dialogue boxes! 😅

UPDATE: I came up with a workaround for the mouse tracking: I made an intermediary, always on simple layer that sits between the two motions (Subtle -> Intermediary -> Exaggerated) and now things work as expected. So it's definitely a problem with consecutive mouse tracking inheriting.

I hope this helps.

(3 edits)

Yesterday I managed to do my initial idea of toggling between two mouse tracking states, but I've found some caveats in the way:

  1. My layers with mouse tracking inherit motion mostly in this way (-> = inherits from): Part -> Subtle Motion (no sprite) -> Exaggerated Motion (no sprite). Most of the exaggerated motions inherit from other parts in a branched way, it's a bit complicated :P. Alternating between the two motions work as expected, but today I tried hiding both layer groups to make a new "no tracking" state and it freezes the position of some parts, instead of returning them to the original position (some do return, but only if i go from subtle to no motion, and I don't know why only some of them do).
  2. While testing the states I noticed my HTTP requests were being irresponsive some times and I managed to fix it by using 127.0.0.1 instead of localhost. It may be a good idea to change the URL the program suggests (in the hint popup and the copy state option) or to include this info somewhere.
  3. If a state is deactivated from the state list (by unchecking it) and it's called using a HTTP request, it will halt all HTTP requests until that state is activated again.

I think that's all I've noticed, I'll let you know if I find any other weird things.

EDIT: Regarding #1, if I discard the "exaggerated motion" layers, then all positions reset properly, I think it may have something to do with stacking empty layers with mouse tracking. I'll try to use a 1x1 transparent image to see how that works later.

As far as I can tell both the rotation and the mouse tracking thing are working perfectly, you're the best ^^

(2 edits)

It worked in 12.0, but while making sure of it I've realized it only did if the rotated part was a non-inheriting parent (any child part would rotate independent of their own child parts)

Rotating a non-inheriting parent part in v12.0


Rotating a inheriting parent part in v12.0

In previous versions transform rotation was inherited by child parts, but in the latest version (13.1) it doesn't work anymore. I don't know if it was intended, but it made adjusting rotation motions better (I used it to make an appendage rotate 6 degrees and offset it's rotation to -3 to make it centered).

While in the same topic, would it be possible to have an option to stop mouse tracking when the part is hidden? (I'd love to use empty layers to turn on-off mouse tracking of certain parts using states hehe).

Thanks ❤

Just a QoL suggestion: Can we get the states index numbers next to their names? (Something like "▶ [7] StateName")

(1 edit)

This is awesome!!! I also noticed the new "Name windows separately" option and I love it! (I was previously copying and renaming RahiTuber to do this lol).

Keep up the good work! ❤

(1 edit)

Hello again!

I was wondering if a "soft body deformation" feature would be possible. Making tentacles/tails is a pain right now, if I had to duplicate and move each part of it I'd have nightmares. The result is a bit rough too, but that might be my fault, I couldn't find info or examples and mostly improvised.

Thanks again for everything! ❤

Related to this, is it possible for child parts to have their own breathing/bounce (eg: chest inherits movement, but has it's own breathing/bounce)? Or is it an engine limitation?

I had this bug where the last layer I was tinkering with would go to the bottom after clicking in an empty part of the layer manager, and I've managed to find what causes it.

It seems like the last layer stays somehow selected after clicking it and holding the mouse button for slightly too long made it as if I moved it to the bottom:

So I've been investigating SFML a bit and:

-Clipping masks have been requested for a long time and they seem to be coming to SFML3. The only workaround I found (if I'm not mistaken, It's all a bit confusing for me) is to make a custom GLSL shader. I also found this but I can't fully understand it.

-There's this tutorial that I think could be used to improve the layer blends to limit where to apply shadows, highlights, erase blend, etc. I think a checkbox for folders to turn them into groups individually would be useful.

Is any (or both) of these things possible?

Also, an unrelated request. Can we get an option to make the mouse tracking movement limits be elliptical instead of rectangular? Corners are a bit broken when using it for circular things like eyes or faces, although right now it's perfect for effects similar to SPUD tablet.

Either way, awesome job. The rate at which you add new features is awesome ^-^

(1 edit)

Somehow I didn't notice the folder feature before and it's a gamechanger for the erase blend!!! I've just realized an inverted version of that blend called "Alpha mask" or something like that would be enough to make it more functional (and it would hopefully be easier to implement? I have no idea)

Edit: Nevermind, I thought folders would limit the layers that the erase blend would affect. I guess that would be its own request 😓

(1 edit)

I did a quick UI mockup of how I think it could be implemented. I don't know if it's a good idea but I'll share it here anyways:

Thanks! That was fast! :D

I don't know if this is a bug or a feature request: While trying the latest mouse track, I found out that you can have a child layer (child as in "inherits movement") inherit a parent's mouse track, but mouse track won't work for any layer that inherits movement from another.
I think they should be stackable; so for example you can have separate mouse tracking for the head, face and pupils. Pupils inherit from face, which inherits from head and they all move with synched bounce, breathing, etc and individual limits.