From cdf325370491904d2e751f79cc276df7eaf4d419 Mon Sep 17 00:00:00 2001 From: Joji Date: Sun, 31 Dec 2023 12:45:39 -0800 Subject: [PATCH 1/2] Updated the module with two options added --- .../leg_2jnt_freeTangents_01/__init__.py | 29 +++++++++---------- .../leg_2jnt_freeTangents_01/guide.py | 10 +++++-- .../leg_2jnt_freeTangents_01/settingsUI.py | 8 ++++- 3 files changed, 29 insertions(+), 18 deletions(-) diff --git a/release/scripts/mgear/shifter_classic_components/leg_2jnt_freeTangents_01/__init__.py b/release/scripts/mgear/shifter_classic_components/leg_2jnt_freeTangents_01/__init__.py index c063ea71..dee0957d 100644 --- a/release/scripts/mgear/shifter_classic_components/leg_2jnt_freeTangents_01/__init__.py +++ b/release/scripts/mgear/shifter_classic_components/leg_2jnt_freeTangents_01/__init__.py @@ -65,6 +65,9 @@ def addObjects(self): tp=self.parentCtlTag, ) + if self.settings["mirrorMid"] and self.negate: + self.root_npo.sx.set(-1) + # FK Controlers ----------------------------------- t = transform.getTransformLookingAt( self.guide.apos[0], @@ -512,9 +515,9 @@ def addObjects(self): tp=self.mid_ctl, ) - if self.negate: - self.uplegTangentA_npo.rz.set(180) - self.uplegTangentA_npo.sz.set(-1) + if self.settings["mirrorMid"] and self.negate: + self.uplegTangentA_npo.rx.set(180) + self.uplegTangentA_npo.sx.set(-1) attribute.setKeyableAttributes(self.uplegTangentA_ctl, self.t_params) t = transform.getInterpolateTransformMatrix( @@ -535,9 +538,9 @@ def addObjects(self): tp=self.mid_ctl, ) - if self.negate: - self.uplegTangentB_npo.rz.set(180) - self.uplegTangentB_npo.sz.set(-1) + if self.settings["mirrorMid"] and self.negate: + self.uplegTangentB_npo.rx.set(180) + self.uplegTangentB_npo.sx.set(-1) attribute.setKeyableAttributes(self.uplegTangentB_ctl, self.t_params) tC = self.tws1B_npo.getMatrix(worldSpace=True) @@ -558,9 +561,9 @@ def addObjects(self): tp=self.mid_ctl, ) - if self.negate: - self.lowlegTangentA_npo.rz.set(180) - self.lowlegTangentA_npo.sz.set(-1) + if self.settings["mirrorMid"] and self.negate: + self.lowlegTangentA_npo.rx.set(180) + self.lowlegTangentA_npo.sx.set(-1) attribute.setKeyableAttributes(self.lowlegTangentA_ctl, self.t_params) t = transform.getInterpolateTransformMatrix(self.tws1B_npo, tC, 0.5) @@ -584,9 +587,8 @@ def addObjects(self): tp=self.mid_ctl, ) - if self.negate: - self.lowlegTangentB_npo.rz.set(180) - self.lowlegTangentB_npo.sz.set(-1) + if self.settings["mirrorMid"] and self.negate: + self.lowlegTangentB_npo.sx.set(-1) attribute.setKeyableAttributes(self.lowlegTangentB_ctl, self.t_params) t = self.mid_ctl.getMatrix(worldSpace=True) @@ -605,9 +607,6 @@ def addObjects(self): tp=self.mid_ctl, ) - if self.negate: - self.kneeTangent_npo.rz.set(180) - self.kneeTangent_npo.sz.set(-1) attribute.setKeyableAttributes(self.kneeTangent_ctl, self.t_params) # match IK FK references diff --git a/release/scripts/mgear/shifter_classic_components/leg_2jnt_freeTangents_01/guide.py b/release/scripts/mgear/shifter_classic_components/leg_2jnt_freeTangents_01/guide.py index 168d9ea5..25a091fd 100644 --- a/release/scripts/mgear/shifter_classic_components/leg_2jnt_freeTangents_01/guide.py +++ b/release/scripts/mgear/shifter_classic_components/leg_2jnt_freeTangents_01/guide.py @@ -13,10 +13,10 @@ # guide info -AUTHOR = "Jeremie Passerin, Miquel Campos" +AUTHOR = "Jeremie Passerin, Miquel Campos, Joji Nishimura" URL = ", www.mcsgear.com" EMAIL = ", " -VERSION = [1, 2, 0] +VERSION = [1, 3, 0] TYPE = "leg_2jnt_freeTangents_01" NAME = "leg" DESCRIPTION = ( @@ -69,6 +69,7 @@ def addParameters(self): self.pUpvRefArray = self.addParam("pinrefarray", "string", "") self.pMaxStretch = self.addParam("maxstretch", "double", 1.5, 1, None) self.pMirrorMid = self.addParam("mirrorMid", "bool", False) + self.pGuideOrientWrist = self.addParam("guideOrientWrist", "bool", False) # Divisions self.pDiv0 = self.addParam("div0", "long", 2, 1, None) @@ -211,6 +212,11 @@ def create_componentConnections(self): self.setProfile ) + self.settingsTab.guideOrientWrist_checkBox.stateChanged.connect( + partial(self.updateCheck, + self.settingsTab.guideOrientWrist_checkBox, + "guideOrientWrist")) + self.settingsTab.mirrorMid_checkBox.stateChanged.connect( partial( self.updateCheck, diff --git a/release/scripts/mgear/shifter_classic_components/leg_2jnt_freeTangents_01/settingsUI.py b/release/scripts/mgear/shifter_classic_components/leg_2jnt_freeTangents_01/settingsUI.py index 9900f936..9b741974 100644 --- a/release/scripts/mgear/shifter_classic_components/leg_2jnt_freeTangents_01/settingsUI.py +++ b/release/scripts/mgear/shifter_classic_components/leg_2jnt_freeTangents_01/settingsUI.py @@ -94,6 +94,9 @@ def setupUi(self, Form): self.div1_spinBox.setObjectName("div1_spinBox") self.horizontalLayout.addWidget(self.div1_spinBox) self.verticalLayout.addLayout(self.horizontalLayout) + self.guideOrientWrist_checkBox = QtWidgets.QCheckBox(self.groupBox) + self.guideOrientWrist_checkBox.setObjectName("guideOrientWrist_checkBox") + self.verticalLayout.addWidget(self.guideOrientWrist_checkBox) self.mirrorMid_checkBox = QtWidgets.QCheckBox(self.groupBox) self.mirrorMid_checkBox.setObjectName("mirrorMid_checkBox") self.verticalLayout.addWidget(self.mirrorMid_checkBox) @@ -218,10 +221,13 @@ def retranslateUi(self, Form): self.ikfk_label.setText(gqt.fakeTranslate("Form", "IK/FK Blend", None, -1)) self.maxStretch_label.setText(gqt.fakeTranslate("Form", "Max Stretch", None, -1)) self.divisions_label.setText(gqt.fakeTranslate("Form", "Divisions", None, -1)) + self.guideOrientWrist_checkBox.setText(gqt.fakeTranslate("Form", "Align ankle to world orientation", None, -1)) + self.guideOrientWrist_checkBox.setToolTip(gqt.fakeTranslate("Form", "This option aligns the ankle with either world oriantation or guide. NOTE: This option override Mirror IK ctl behaviour", None, -1)) + self.guideOrientWrist_checkBox.setStatusTip(gqt.fakeTranslate("Form", "This option aligns the ankle with either world oriantation or guide", None, -1)) self.mirrorMid_checkBox.setToolTip(gqt.fakeTranslate("Form", "This option set the axis of the mid CTL (elbow) and the up vector control to move in a mirror behaviour ", None, -1)) self.mirrorMid_checkBox.setStatusTip(gqt.fakeTranslate("Form", "This option set the axis of the mid CTL (elbow) and the up vector control to move in a mirror behaviour ", None, -1)) self.mirrorMid_checkBox.setWhatsThis(gqt.fakeTranslate("Form", "This option set the axis of the mid CTL (elbow) and the up vector control to move in a mirror behaviour ", None, -1)) - self.mirrorMid_checkBox.setText(gqt.fakeTranslate("Form", "Mirror Mid Ctl and UPV axis", None, -1)) + self.mirrorMid_checkBox.setText(gqt.fakeTranslate("Form", "Mirror Mid, UPV and Tangent Ctl axis behaviour", None, -1)) self.squashStretchProfile_pushButton.setText(gqt.fakeTranslate("Form", "Squash and Stretch Profile", None, -1)) self.ikRefArray_groupBox.setTitle(gqt.fakeTranslate("Form", "IK Reference Array", None, -1)) self.ikRefArray_copyRef_pushButton.setText(gqt.fakeTranslate("Form", "Copy from UpV Ref", None, -1)) From 4294af65797ae5f9630dfdece69c96b5367442a8 Mon Sep 17 00:00:00 2001 From: Joji Date: Sun, 21 Jan 2024 20:25:43 -0800 Subject: [PATCH 2/2] Align ankle to world orientation if the checkbox is turned on. --- .../leg_2jnt_freeTangents_01/__init__.py | 26 ++++++++++--------- .../leg_2jnt_freeTangents_01/guide.py | 10 ++++--- .../leg_2jnt_freeTangents_01/settingsUI.py | 12 ++++----- 3 files changed, 26 insertions(+), 22 deletions(-) diff --git a/release/scripts/mgear/shifter_classic_components/leg_2jnt_freeTangents_01/__init__.py b/release/scripts/mgear/shifter_classic_components/leg_2jnt_freeTangents_01/__init__.py index dee0957d..81511c77 100644 --- a/release/scripts/mgear/shifter_classic_components/leg_2jnt_freeTangents_01/__init__.py +++ b/release/scripts/mgear/shifter_classic_components/leg_2jnt_freeTangents_01/__init__.py @@ -155,14 +155,24 @@ def addObjects(self): # IK Controlers ----------------------------------- - self.ik_cns = primitive.addTransformFromPos( - self.root_ctl, self.getName("ik_cns"), self.guide.pos["ankle"] + # Define the wrist transform (wt) + if not self.settings["ikOri"]: + m = transform.getTransformLookingAt(self.guide.pos["ankle"], + self.guide.pos["eff"], + self.normal, + "z-x", + False) + else: + m = transform.getTransformFromPos(self.guide.pos["ankle"]) + + self.ik_cns = primitive.addTransform( + self.root_ctl, self.getName("ik_cns"), m ) self.ikcns_ctl = self.addCtl( self.ik_cns, "ikcns_ctl", - transform.getTransformFromPos(self.guide.pos["ankle"]), + m, self.color_ik, "null", w=self.size * 0.12, @@ -170,18 +180,10 @@ def addObjects(self): ) attribute.setInvertMirror(self.ikcns_ctl, ["tx"]) - m = transform.getTransformLookingAt( - self.guide.pos["ankle"], - self.guide.pos["eff"], - self.x_axis, - "zx", - False, - ) - self.ik_ctl = self.addCtl( self.ikcns_ctl, "ik_ctl", - transform.getTransformFromPos(self.guide.pos["ankle"]), + m, self.color_ik, "cube", w=self.size * 0.12, diff --git a/release/scripts/mgear/shifter_classic_components/leg_2jnt_freeTangents_01/guide.py b/release/scripts/mgear/shifter_classic_components/leg_2jnt_freeTangents_01/guide.py index 25a091fd..2bdf6596 100644 --- a/release/scripts/mgear/shifter_classic_components/leg_2jnt_freeTangents_01/guide.py +++ b/release/scripts/mgear/shifter_classic_components/leg_2jnt_freeTangents_01/guide.py @@ -69,7 +69,7 @@ def addParameters(self): self.pUpvRefArray = self.addParam("pinrefarray", "string", "") self.pMaxStretch = self.addParam("maxstretch", "double", 1.5, 1, None) self.pMirrorMid = self.addParam("mirrorMid", "bool", False) - self.pGuideOrientWrist = self.addParam("guideOrientWrist", "bool", False) + self.pIKOrient = self.addParam("ikOri", "bool", True) # Divisions self.pDiv0 = self.addParam("div0", "long", 2, 1, None) @@ -162,6 +162,8 @@ def populate_componentControls(self): ) self.populateCheck(self.settingsTab.mirrorMid_checkBox, "mirrorMid") + self.populateCheck(self.settingsTab.ikOri_checkBox, "ikOri") + self.settingsTab.div0_spinBox.setValue(self.root.attr("div0").get()) self.settingsTab.div1_spinBox.setValue(self.root.attr("div1").get()) ikRefArrayItems = self.root.attr("ikrefarray").get().split(",") @@ -212,10 +214,10 @@ def create_componentConnections(self): self.setProfile ) - self.settingsTab.guideOrientWrist_checkBox.stateChanged.connect( + self.settingsTab.ikOri_checkBox.stateChanged.connect( partial(self.updateCheck, - self.settingsTab.guideOrientWrist_checkBox, - "guideOrientWrist")) + self.settingsTab.ikOri_checkBox, + "ikOri")) self.settingsTab.mirrorMid_checkBox.stateChanged.connect( partial( diff --git a/release/scripts/mgear/shifter_classic_components/leg_2jnt_freeTangents_01/settingsUI.py b/release/scripts/mgear/shifter_classic_components/leg_2jnt_freeTangents_01/settingsUI.py index 9b741974..e8326fe4 100644 --- a/release/scripts/mgear/shifter_classic_components/leg_2jnt_freeTangents_01/settingsUI.py +++ b/release/scripts/mgear/shifter_classic_components/leg_2jnt_freeTangents_01/settingsUI.py @@ -94,9 +94,9 @@ def setupUi(self, Form): self.div1_spinBox.setObjectName("div1_spinBox") self.horizontalLayout.addWidget(self.div1_spinBox) self.verticalLayout.addLayout(self.horizontalLayout) - self.guideOrientWrist_checkBox = QtWidgets.QCheckBox(self.groupBox) - self.guideOrientWrist_checkBox.setObjectName("guideOrientWrist_checkBox") - self.verticalLayout.addWidget(self.guideOrientWrist_checkBox) + self.ikOri_checkBox = QtWidgets.QCheckBox(self.groupBox) + self.ikOri_checkBox.setObjectName("ikOri_checkBox") + self.verticalLayout.addWidget(self.ikOri_checkBox) self.mirrorMid_checkBox = QtWidgets.QCheckBox(self.groupBox) self.mirrorMid_checkBox.setObjectName("mirrorMid_checkBox") self.verticalLayout.addWidget(self.mirrorMid_checkBox) @@ -221,9 +221,9 @@ def retranslateUi(self, Form): self.ikfk_label.setText(gqt.fakeTranslate("Form", "IK/FK Blend", None, -1)) self.maxStretch_label.setText(gqt.fakeTranslate("Form", "Max Stretch", None, -1)) self.divisions_label.setText(gqt.fakeTranslate("Form", "Divisions", None, -1)) - self.guideOrientWrist_checkBox.setText(gqt.fakeTranslate("Form", "Align ankle to world orientation", None, -1)) - self.guideOrientWrist_checkBox.setToolTip(gqt.fakeTranslate("Form", "This option aligns the ankle with either world oriantation or guide. NOTE: This option override Mirror IK ctl behaviour", None, -1)) - self.guideOrientWrist_checkBox.setStatusTip(gqt.fakeTranslate("Form", "This option aligns the ankle with either world oriantation or guide", None, -1)) + self.ikOri_checkBox.setText(gqt.fakeTranslate("Form", "Align ankle to world orientation", None, -1)) + self.ikOri_checkBox.setToolTip(gqt.fakeTranslate("Form", "This option aligns the ankle with either world oriantation or guide. NOTE: This option override Mirror IK ctl behaviour", None, -1)) + self.ikOri_checkBox.setStatusTip(gqt.fakeTranslate("Form", "This option aligns the ankle with either world oriantation or guide", None, -1)) self.mirrorMid_checkBox.setToolTip(gqt.fakeTranslate("Form", "This option set the axis of the mid CTL (elbow) and the up vector control to move in a mirror behaviour ", None, -1)) self.mirrorMid_checkBox.setStatusTip(gqt.fakeTranslate("Form", "This option set the axis of the mid CTL (elbow) and the up vector control to move in a mirror behaviour ", None, -1)) self.mirrorMid_checkBox.setWhatsThis(gqt.fakeTranslate("Form", "This option set the axis of the mid CTL (elbow) and the up vector control to move in a mirror behaviour ", None, -1))