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
Creating a Blog? Don't Forget the Feature Photo!! ×

Whats the symmetricity


Driver

617 views

I'm preparing minor update of GECartoon face mod.

screenshot_23_09_16 02_28_20.jpgscreenshot_23_09_16 02_28_201.jpg

Have you ever been disappointed when you flipped a portrait you thought you got well done? That may be because model's face is not symmetrical in TK. The face meshes are perfectly symmetrical in Blender, but somehow they get distorted in the game. In this update (0.8) I distorted the mesh in Blender to get the face look more symmetrical in the actual game play.

07.jpg082.jpg

Edited 18/09/2003
I'm going to deeper in this problem and I found GEC v0.8 was completely mistake because I didn't set the camera in right orientation strictly when I worked on it. So probably the distortion of the nose became worse than v7.0. You can throw v0.8 away from your window. I'm working on from different approach right now, via anim script, hoping it can fix the distortions of all the face mod.

  • Thumbs Up 7

8 Comments


Recommended Comments

Maybe I am blind but I did not even notice the face was not symmetrical lol I appreciate the update nonetheless. 

  • Thanks 1
Link to comment
8 minutes ago, erikku90 said:

Maybe I am blind but I did not even notice the face was not symmetrical lol I appreciate the update nonetheless. 

It's normal not to notice if something is symmetrical or not until you flip it horizontally. This happens more often in drawing, if you have a favorite portraits try flip them horizontally. If the author didn't care about how symmetry his art is, then they'll look completely "off". 😄

Link to comment

The problem is actually with the head armature. Asymmetry in anim01 will always distort the model's face, no matter how symmetrical a head mod is 🙂 Maybe this was done to avoid the "uncanny valley" effect, or maybe just out of sloppiness. Whatever it was, to actually fix face asymmetry, you need to do a full revision of the head joints in anim01. I took a couple of steps in this direction once, AnimAsymmetryFix from here https://www.klubexile.com/files/file/7304-murka/ should correct at least brows and eyes, but completely recalculating all the necessary joints is a non-trivial task.

 

  • Like 1
  • Thanks 1
Link to comment
1 hour ago, cr532 said:

The problem is actually with the head armature. Asymmetry in anim01 will always distort the model's face, no matter how symmetrical a head mod is 🙂 Maybe this was done to avoid the "uncanny valley" effect, or maybe just out of sloppiness. Whatever it was, to actually fix face asymmetry, you need to do a full revision of the head joints in anim01. I took a couple of steps in this direction once, AnimAsymmetryFix from here https://www.klubexile.com/files/file/7304-murka/ should correct at least brows and eyes, but completely recalculating all the necessary joints is a non-trivial task.

 

oh that's interesting information, but how you calculate to back them to symmetrical? My target is only nose and lips, mostly nose. Then maybe the target is SJoint :local_56533, 56535, and 56537? They are like this.

Spoiler

SJoint :local_56537 . {
    SJoint.JointOrientation Vector3f( 88.876694, 0, -90 );
    SSimpleTransform.Translation Vector3f( -0.0202144, 0, 0 );
    Object.Name "Model01:Snose_jointEnd";
};
SJoint :local_56535 . {
    SJoint.JointOrientation Vector3f( 0, -88.677994, -180 );
    SSimpleTransform.Translation Vector3f( -0.037152488, 0, 0 );
    Object.Name "Model01:Snose_joint02";
};
SJoint :local_56533 . {
    SJoint.JointOrientation Vector3f( 0, 2.1966031, 0 );
    SSimpleTransform.Translation Vector3f( 0.047308434, 0, -0.1194366738 );
    Object.Name "Model01:Snose_joint01";
};

 

Link to comment

You can use this plugin to recreate the armature and cherry pick the bones you want to be symmetrical. You might need some manual fixing if the output values are not clean zeros and only very close to zero due to roundings.

https://github.com/ModdingClass/TK17-Custom-Bodies-plugin

And you can't symmetrize the nose, because that needs a R and L joints pairs. If you just want to align the nose to the center, then zeroing the X component should do the trick.

You can find the output with the values for the joints inside AcBody735Collision.bs, example: C:\Users\Neon\Desktop\export_735\AcBody735Collision.bs

You take that file and you put it in Scripts\Luder\Person.G=01 folder.

If your body is not something like Body735, and is Body01, because you are lazy and dont want to use EMFS system, then you need to use the proper name at export, obviously.

 

16 hours ago, cr532 said:

but completely recalculating all the necessary joints is a non-trivial task.

Hold my beer!

 

 

 

  • Like 2
Link to comment

@hfg2

Hey, thank you.

Looks like it can fix rotation value of eyes, cheek, upper lips or some other that is not symmetrical, should be useful to make full symmetric face. As for the nose... as you told it doesn't have the pair so you need to fix its orientation manually (yeah it is not a matter of translation so that you will not have luck zeroing the Xs). But I don't get why the developer did such a strange thing, don't you think that if all the numbers were integers, the distortion would be eliminated? 😑

the progress

123.jpg

SJoint :local_56537 . {
	SJoint.JointOrientation Vector3f( 88.876694, 0, -93 );
	SSimpleTransform.Translation Vector3f( -0.0202144, 0, 0 );
	Object.Name "Model01:Snose_jointEnd";
};
// -- SJoint :local_56537 . {
	// -- SJoint.JointOrientation Vector3f( 88.876694, 0, -90 );
	// -- SSimpleTransform.Translation Vector3f( -0.0202144, 0, 0 );
	// -- Object.Name "Model01:Snose_jointEnd";
// -- };
SJoint :local_56535 . {
	SJoint.JointOrientation Vector3f( -0.4, -88.677994, -181.4 );
	SSimpleTransform.Translation Vector3f(  -0.037152488, 0, 0 );
	Object.Name "Model01:Snose_joint02";
};
// -- SJoint :local_56535 . {
	// -- SJoint.JointOrientation Vector3f( 0, -88.677994, -180 );
	// -- SSimpleTransform.Translation Vector3f( -0.037152488, 0, 0 );
	// -- Object.Name "Model01:Snose_joint02";
// -- };

SJoint :local_56533 . {
	SJoint.JointOrientation Vector3f( -2.1, 2.1966031, -0.6 );
	SSimpleTransform.Translation Vector3f( 0.047308434, -0.10, -0.1194366738 );
	Object.Name "Model01:Snose_joint01";
};
// -- SJoint :local_56533 . {
	// -- SJoint.JointOrientation Vector3f( 0, 2.1966031, 0 );
	// -- SSimpleTransform.Translation Vector3f( 0.047308434, 0, -0.1194366738 );
	// -- Object.Name "Model01:Snose_joint01";
// -- };

 

The commented lines are from original anim01.

Link to comment

On a second thought, every bone is in local space of its parent. So not always the X component is in the global X axis.

You still have the translation and orientation, but orientation is not exactly a rotation. Orientation is the rotation of the bone (including the roll) in EditMode in Blender, while the rotation is a rotation in PoseMode in Blender.

Do not follow values from Anim01 because there are some problems with those, not all values from the body matches the Anim01, and not all values from AnimFace matches those either.

Check the armature in the Blender for the nose bones (or the bones you are interested in). If those are zeroed in X axis/centered then this is how they should be like. Check the exported values to confirm the values are still pure zero or in exponential notation, but even then, this is more or less zero, a cosmetically fix, so should not affect you.

There are some catches with the export of the bones, can't explain here, some parts are forcefully corrected by me, mirrored, etc. Also the inverse bind matrix might cause you problems, but can't say yet if those will affect you.

And if you are going for the mouth bones, then you should also check mouth_L_fix_group and mouth_R_fix_group and also for the face you might need: AnimFace:face_poseBlend.PoseDefault line.

 

About the nose. The joints has a roll value, when the roll is like 90 or -90, this kinda swap your axis, so an X translation becomes a move in the back or forward. 

Now you need to correlate all values, check values from the blender edit bone, check values of the intermediate empties used for export, always think in local space, because this is how the joints are linked one to the other and check the output produced in the Ac Collision file.

And always remember that the game is Y up, while Blender is Z up and face forward.

So BlenderX = VillaX, Blender Z = VillaY and Blender Y = -VillaZ

Link to comment

@hfg2

Thanks for the tip.

For now I found that the rotation and transformation contents of generated files (symmetry fix patch is applied) are almost same as original anim01 values. I replaced some of the them, like cheek_R_joint01 or lower_lip_R_joint01 with original ones but no difference was seen. Anyway I can make the nose and eyes some more 80% symmetrical, and that was not bad result at all cause like CR said above perfectly symmetrical face can go for uncanny valley course, so I'm satisfied for now. Thanks anyway!

Link to comment
×
×
  • 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.