Jump to content

Hi There

Welcome to Klub Exile. If you happened to make your way to the site either from Lovers Lab or a Search on Google, we are glad you found us.  To unlock the entire site you will need to have a account registered.  Don't worry it is free but in the mean time you can read up on why we made the site and other little tidbits.  Feel free to join or Discord Server also if you have any more questions.  Thanks for stopping by and See You on the other side.

admin admin
  • 1

Request Add-On: Tongue Sliders


ElitistSwine

Question

11 answers to this question

Recommended Posts

  • 0

Isn't the tongue section in PoseEdit enough for you ? With the help of the sliders and cluster manipulators present there, you can easily solve the problem of the tongue sticking out of the chin.

  • Agree 1
Link to comment
Share on other sites

  • 0

Actually no. Being able to change the model's position of the tongue in the Customizer would save exactly that step in PoseEdit.

In a way this is no small request for something like an XTongue add-on, yet another tongue replacer, but I saw some sliders built for torso/shoulder size.

Edited by ElitistSwine
Link to comment
Share on other sites

  • 0

I suspect that it has not occurred to anyone so far that such a thing is needed 🙂 You can't see the tongue until you animate it, and decently animating the tongue requires manipulating its entire shape anyway (not just its movement, like limbs), which would disrupt most of the Customizer changes anyway and made them rather obsolete. Perhaps it would make a few steps of animation easier.... but as I said, it apparently didn't occur to anyone that it was worth the effort 🙂 

I'm not saying it's a bad idea, or a ridiculous idea, or anything like that, it's just that I think there's a certain ratio that modders usually consider, between the expected usefulness of something and the willingness to take the time to work on something, and apparently so far no one has needed it that much, content with what's already in the game 🙂

  • Thumbs Up 1
Link to comment
Share on other sites

  • 0
Just now, ElitistSwine said:

so far looking like a diy project...

I don't think that connecting to Customizer the same blends that control the tongue in PoseEdit is something impossible to do, it could at least somewhat meet your expectations 🙂 If you wait a bit (it's late at my place, I'm tired right now and going to bed soon), I'll try to roughly come up with something like this.

  • Agree 1
  • Thumbs Up 1
Link to comment
Share on other sites

  • 0

like other people have said. its not something really visible until you want to use the tongue and when i do use it i pose it in pose edit. sometimes making small addon like this could be more hours to program in then its worth. i get the results i want easy enough with pose edit sliders

Link to comment
Share on other sites

  • 0
  • Administrator
19 hours ago, ElitistSwine said:

there are sliders for teeth depth, size, vertical - any notion of making those for those tongues?

Tongue Problem 2.jpg

Tongue Problem.jpg

This is due to the 'topography' of face being drastically different than what it was meant for. If you look at the teeth, the vanilla version match better than the z teeth and any new teeth. In other words, the mouth is too high!

Also the mouth is a 'odd' thing to mod and what not. Another modder was telling me that he was having culling issues and could not find a solid fix.

I get that adding something to move the tongue can work - its just putting it to practice

  • Thanks 1
  • Agree 1
  • Thumbs Up 1
Link to comment
Share on other sites

  • 0

Well, you're lucky. There are several unoccupied param IDs that can be used, so why not:

c_tongue.jpg

The bad news is that there is a reason Customizer and PoseEdit almost never use the same blends. In short, PE will always reset these values.

Here is the code if anyone needs it:

Spoiler
local customizer_body_path = "Scripts/Shared/Person/CcPersonDefaultBody.[bs*]"

customizer_parameters = [[
:Parameter_tonguec_tip .ParamID I32(1895);

CustomParameter :Parameter_TongueOut . {
	.ParamID I32(1896);
	.IconID I32(6815);
	.ParamName "TongueOut";
	.ParamDescription "Tongue Out:";
	.CategoryID :Cat_Body;
	.ParamType CustomParamType .Slider;
	.SliderDefault F32(0.5);
	.PoseBlendNameArray [ "Person" + :person + "AnimFace:tongue_poseBlend_tongue_front" ];
	.PoseBlendClampArray [ ( F32(-1) , F32(1) ) ];
	.PoseBlendMulAddArray [ ( F32(2) , F32(-1) ) ];
	.LookAt "Person" + :person + "Anim:Model01:tongue_pos_group";
	.LookAtID :LookAtMouthOpen;
};
CustomParameter :Parameter_TongueStraight . {
	.ParamID I32(1897);
	.ParamName "TongueStraight";
	.ParamDescription "Tongue Straight:";
	.CategoryID :Cat_Body;
	.ParamType CustomParamType .Slider;
	.SliderDefault F32(0.5);
	.PoseBlendNameArray [ "Person" + :person + "AnimFace:tongue_poseBlend_tongue_straight" ];
	.PoseBlendClampArray [ ( F32(-6) , F32(6) ) ];
	.PoseBlendMulAddArray [ ( F32(12) , F32(-6) ) ];
	.LookAt "Person" + :person + "Anim:Model01:tongue_pos_group";
	.LookAtID :LookAtMouthOpen;
};
CustomParameter :Parameter_TongueTipUp . {
	.ParamID I32(1898);
	.ParamName "TongueTipUp";
	.ParamDescription "Tongue Tip Up:";
	.CategoryID :Cat_Body;
	.ParamType CustomParamType .Slider;
	.SliderDefault F32(0.5);
	.PoseBlendNameArray [ "Person" + :person + "AnimFace:tongue_poseBlend_tongue_tip_up" ];
	.PoseBlendClampArray [ ( F32(-1) , F32(1) ) ];
	.PoseBlendMulAddArray [ ( F32(2) , F32(-1) ) ];
	.LookAt "Person" + :person + "Anim:Model01:tongue_pos_group";
	.LookAtID :LookAtMouthOpen;
};
CustomParameter :Parameter_TongueTipDown . {
	.ParamID I32(1899);
	.ParamName "TongueTipDown";
	.ParamDescription "Tongue Tip Down:";
	.CategoryID :Cat_Body;
	.ParamType CustomParamType .Slider;
	.SliderDefault F32(0.5);
	.PoseBlendNameArray [ "Person" + :person + "AnimFace:tongue_poseBlend_tongue_tip_down" ];
	.PoseBlendClampArray [ ( F32(-1) , F32(1) ) ];
	.PoseBlendMulAddArray [ ( F32(2) , F32(-1) ) ];
	.LookAt "Person" + :person + "Anim:Model01:tongue_pos_group";
	.LookAtID :LookAtMouthOpen;
};
CustomParameter :Parameter_TongueTipLeft . {
	.ParamID I32(1900);
	.ParamName "TongueTipLeft";
	.ParamDescription "Tongue Tip Left:";
	.CategoryID :Cat_Body;
	.ParamType CustomParamType .Slider;
	.SliderDefault F32(0.5);
	.PoseBlendNameArray [ "Person" + :person + "AnimFace:tongue_poseBlend_tongue_tip_left" ];
	.PoseBlendClampArray [ ( F32(-1) , F32(1) ) ];
	.PoseBlendMulAddArray [ ( F32(2) , F32(-1) ) ];
	.LookAt "Person" + :person + "Anim:Model01:tongue_pos_group";
	.LookAtID :LookAtMouthOpen;
};
CustomParameter :Parameter_TongueTipRight . {
	.ParamID I32(1901);
	.ParamName "TongueTipRight";
	.ParamDescription "Tongue Tip Right:";
	.CategoryID :Cat_Body;
	.ParamType CustomParamType .Slider;
	.SliderDefault F32(0.5);
	.PoseBlendNameArray [ "Person" + :person + "AnimFace:tongue_poseBlend_tongue_tip_right" ];
	.PoseBlendClampArray [ ( F32(-1) , F32(1) ) ];
	.PoseBlendMulAddArray [ ( F32(2) , F32(-1) ) ];
	.LookAt "Person" + :person + "Anim:Model01:tongue_pos_group";
	.LookAtID :LookAtMouthOpen;
};
CustomParameter :Parameter_TongueLickClean . {
	.ParamID I32(1902);
	.ParamName "TongueLickClean";
	.ParamDescription "Tongue Lick Clean:";
	.CategoryID :Cat_Body;
	.ParamType CustomParamType .Slider;
	.SliderDefault F32(0.5);
	.PoseBlendNameArray [ "Person" + :person + "AnimFace:lick_clean" ];
	.PoseBlendClampArray [ ( F32(-1) , F32(1) ) ];
	.PoseBlendMulAddArray [ ( F32(2) , F32(-1) ) ];
	.LookAt "Person" + :person + "Anim:Model01:tongue_pos_group";
	.LookAtID :LookAtMouthOpen;
};
CustomParameter :Parameter_TongueStickOut . {
	.ParamID I32(1903);
	.ParamName "TongueStickOut";
	.ParamDescription "Tongue Stick Out:";
	.CategoryID :Cat_Body;
	.ParamType CustomParamType .Slider;
	.SliderDefault F32(0.5);
	.PoseBlendNameArray [ "Person" + :person + "Anim:Model01:tongue_stick_out" ];
	.PoseBlendClampArray [ ( F32(-1) , F32(1) ) ];
	.PoseBlendMulAddArray [ ( F32(2) , F32(-1) ) ];
	.LookAt "Person" + :person + "Anim:Model01:tongue_pos_group";
	.LookAtID :LookAtMouthOpen;
};
CustomParameter :Parameter_TongueTwist . {
	.ParamID I32(1904);
	.ParamName "TongueTwist";
	.ParamDescription "Tongue Twist:";
	.CategoryID :Cat_Body;
	.ParamType CustomParamType .Slider;
	.SliderDefault F32(0.5);
	.PoseBlendNameArray [ "Person" + :person + "AnimFace:tongue_ik_twist" ];
	.PoseBlendClampArray [ ( F32(-1) , F32(1) ) ];
	.PoseBlendMulAddArray [ ( F32(2) , F32(-1) ) ];
	.LookAt "Person" + :person + "Anim:Model01:tongue_pos_group";
	.LookAtID :LookAtMouthOpen;
};
CustomParameter :Parameter_TongueCluster05 . {
	.ParamID I32(1905);
	.IconID I32(8105);
	.ParamName "TongueCluster05";
	.ParamDescription "Tongue Cluster05 Position:";
	.CategoryID :Cat_Body;
	.ParamType CustomParamType .Vector3f;
	.DefaultVector3f ( F32(0) , F32(0) , F32(0) );
	.MinVector3f ( F32(-0.1) , F32(-0.1) , F32(-0.1) );
	.MaxVector3f ( F32(0.1) , F32(0.1) , F32(0.1) );
	.ObjectNameArray String [ "Person" + :person + "Anim:Model01:Stongue_clusterHandle05" ];
	.ObjectMemberArray [ @ STransform .RotationPivotTranslation ];
	.LookAt "Person" + :person + "Anim:Model01:tongue_pos_group";
	.LookAtID :LookAtMouthOpen;
};
CustomParameter :Parameter_TongueCluster06 . {
	.ParamID I32(1906);
	.IconID I32(8105);
	.ParamName "TongueCluster06";
	.ParamDescription "Tongue Cluster06 Position:";
	.CategoryID :Cat_Body;
	.ParamType CustomParamType .Vector3f;
	.DefaultVector3f ( F32(0) , F32(0) , F32(0) );
	.MinVector3f ( F32(-0.1) , F32(-0.1) , F32(-0.1) );
	.MaxVector3f ( F32(0.1) , F32(0.1) , F32(0.1) );
	.ObjectNameArray String [ "Person" + :person + "Anim:Model01:Stongue_clusterHandle06" ];
	.ObjectMemberArray [ @ STransform .RotationPivotTranslation ];
	.LookAt "Person" + :person + "Anim:Model01:tongue_pos_group";
	.LookAtID :LookAtMouthOpen;
};
CustomParameter :Parameter_TongueCluster07 . {
	.ParamID I32(1907);
	.IconID I32(8105);
	.ParamName "TongueCluster07";
	.ParamDescription "Tongue Cluster07 Position:";
	.CategoryID :Cat_Body;
	.ParamType CustomParamType .Vector3f;
	.DefaultVector3f ( F32(0) , F32(0) , F32(0) );
	.MinVector3f ( F32(-0.1) , F32(-0.1) , F32(-0.1) );
	.MaxVector3f ( F32(0.1) , F32(0.1) , F32(0.1) );
	.ObjectNameArray String [ "Person" + :person + "Anim:Model01:Stongue_clusterHandle07" ];
	.ObjectMemberArray [ @ STransform .RotationPivotTranslation ];
	.LookAt "Person" + :person + "Anim:Model01:tongue_pos_group";
	.LookAtID :LookAtMouthOpen;
};

:Parameter_Ear01 .ParamID I32(1908);
:Parameter_Ear02 .ParamID I32(1909);
:Parameter_earsz_earsize .ParamID I32(1910);
:Parameter_earsz_x .ParamID I32(1911);
]]

cb_insert(customizer_body_path,customizer_parameters,false,false)

I personally think there should be a better solution. Maybe just standard Translation/Rotation/Scaling sliders would be enough. Tongue animation is surprisingly complex and looks like at least 2-3 modders were working on it at different times, all those sliders are implemented differently 🙂

  • Thanks 2
Link to comment
Share on other sites

  • 0

Tongue, eyes, teeth (lower and upper) are different objects than the body. Problem is those are parented in a different way.

For tongue I think it must be moved as a whole maybe altering its default SSkinPolygonGeometry.

I know that this is a problem with many custom heads, were the mouth location is different, so the original game tongue that every is using is no longer inside that mouth.

Tongue is the only one that has values like:

 SSkinPolygonGeometry.GeometryMatrix Matrix4f(  ( 1, 0, 0, 0 ), ( 0, 0.9959644079, 0.0897493884, 0 ), ( 0, -0.0897493884, 0.9959644079, 0 ), ( 0, 1.607498527, 0.02820063941, 1 ));

while for the body or other stuff you get much cleaner geometry matrix (an actual identity matrix) like:

MeshData.GeometryMatrix Matrix4f(  ( 1, 0, 0, 0 ), ( 0, 1, 0, 0 ), ( 0, 0, 1, 0 ), ( 0, 0, 0, 1 ));

 

For the tongue I've marked with RED Color the part in the Matrix that corresponds to the translation vector. So you might be tempted to fix this (by trial and error) until your tongue is properly positioned inside the mouth.

But wait, there is another problem.

Some genius, long time ago, in his incredible wisdom decided that teeth and mouth and who knows what else should not be included in the body file, instead the teeth and the tongue should be kept in their own files. So fixing the tongue in the body is a dead track.

AcTongue01.bs file tells us that how actual tongue is loaded and rigged:

AppModel . {
	.ComponentArray [ AppImportScene . {
		.NodeName "Person" + :person + "Tongue01";
		.ParentPath "/Primary01";
		.SceneFile "Shared/Body/body01_tongue01";
	};
	AppReplaceSkeleton . {
		.SourcePath "/Person" + :person + "Tongue01/TRS_group";
		.TargetPath "/Person" + :person + "Anim/Model01:TRS_group";
		.SourceRootPath "/Person" + :person + "Tongue01";
		.TargetRootPath "/Person" + :person + "Anim";
	};
	];
};

so our file is "Shared/Body/body01_tongue01".

But alas, there is no such file in VX-Mod (or Addons usually unless you download a tongue addon). The only file is the original file, which can be found in Archives (Archives\2.158.001\Scenes.zip -> Scenes\Shared\Body\body01_tongue01.[bs*]).

So you can take that file, make it a bs file then you can make your own addon, or put it directly in the VX-Mod if you are a fan of a messy life style.

You can now edit the GeometryMatrix and fix your tongue location, but beware that this will work nicely if you don't drift away too much from original tongue location. Reason is simple. The tongue armature is still there, if you don't fix this armature as well you will get your tongue acting crazy.

 

There might be other solutions, I do have some in my mind, but need to test those first. (example the entire tongue armature and the tongue mesh object (obviously) is parented to tongue_group TTransform, so if you wire this as a customizer slider might work for you)

  • Thanks 2
  • Agree 1
Link to comment
Share on other sites

  • 0

And lo and behold, people smarter than me came to the rescue and saved my weekend ☺️ It probably would have taken me hours to figure out why something wasn't working even though I thought it wouldn't be hard to do.

I'm sorry, I'm not touching it now, I don't have as much free time as I did the last two weeks 🙂

  • Thanks 1
  • Haha 1
Link to comment
Share on other sites

  • 0
13 hours ago, PsychoCatGirl said:

And lo and behold, people smarter than me came to the rescue and saved my weekend ☺️ It probably would have taken me hours to figure out why something wasn't working even though I thought it wouldn't be hard to do.

I'm sorry, I'm not touching it now, I don't have as much free time as I did the last two weeks 🙂

That's so funny and I'm glad you were spared going down that rabbit hole!

At one point I used Driver's Tongue Revamped but found it disabled in my add-ons...I will revisit Driver's addon with the wealth of suggestions (cr532 & hfg2 thank you!) so far on this thread and poke around some. I would also like to add I'm consistently astonished and grateful for the helpfulness of this community.

,

 

I have to disagree with you Smoke that the mouth is too high. It's the tongue that's rigged too low!

  • Thumbs Up 1
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

WARNING! Adult Only Content You must be 18 years of age or older to enter. By accepting you agree to Klub Exile's Terms of Use and Guidelines upon creating an account.