[UE5.3][Retarget]mixamo animation Retarget to UE5.3 Tips Edit Retarget Poseそんなとこにあったのかいって記事です。

Edit Retarget Poseそんなとこにあったのかいって記事です。

Mixiamoからデフォルトのまま(root移動しないIn Placeオプション付けて)アニメーションダウンロード

idleポーズなど何でもいいのでmixamo.fbxとファイル名を書き換えてインポートするとskeltonもその名前になるので見やすいです。
その1つを読み込みSkelton Noneで Importします。

他のファイルを上記のスケルトンでインポートします。

IKRig_mixamoをIKゴールとかソルバとかなしでチェーンだけで作ります

それに合わせて合わせて

IKRig_mannyをIKゴールとかソルバとかなしでチェーンだけで作ります

IKRetargeterでソースにmixamo ターゲットに作ったUE5_Manny

:からEdit Retarget Poseを選びます。(またはTposeを読み込みます)

斜めから見ても合うように+基本はTなので肘とかは棒になるようにします。

でできたああ!あとは書き出して使うだけ。

ここまで作業した 自分用リンク

https://drive.google.com/file/d/1KbIDgPs8oSwBlVK_DV_1adJUNfFhl4iP/view?usp=sharing

参考URL この動画だけどこのままやるとモーションがガタガタになったのでアレンジした↑

[maya][PySide2][QtWidgets]PySide2.QtWidgets.QApplication’ object has no attribute ‘close’

QApplicationをコードで自動で閉じようとするときに出たエラーの解決方法です。

PySide2.QtWidgets.QApplication’ object has no attribute ‘close’

Question : QMainWindow

class DF_TalkUI(QMainWindow):


    def __init__(self, parent = None):

Answer : QWidget

class DF_TalkUI(QWidget):


    def __init__(self, parent = None):

Fix Code


#------------------------------------------------------------------------------------------------------------------------------------------


# -*- coding: utf-8 -*-
import os
from functools import partial
import time
import imp

"""
PySide2モジュールを探し、ある場合はそちらをインポートします。
"""
try:
    imp.find_module('PySide2')
    from PySide2.QtWidgets import *
    from PySide2.QtGui import *
    from PySide2.QtCore import *

except ImportError:
    from PySide.QtGui import *
    from PySide.QtCore import *


LOGO_IMAGE = r"画像のパスをここに入れてください。"


def get_maya_pointer():
    """
    Mayaのメインウィンドウを取得する関数
    """
    try:
        import maya.cmds as cmds
        from maya import OpenMayaUI

    except ImportError:
        return None

    """
    実は2017ではshibokenも2になっているので、あればshiboken2をインポートします。
    """
    try:
        imp.find_module("shiboken2")
        import shiboken2
        return shiboken2.wrapInstance(int(OpenMayaUI.MQtUtil.mainWindow()), QWidget)

    except ImportError:
        import shiboken
        return shiboken.wrapInstance(int(OpenMayaUI.MQtUtil.mainWindow()), QWidget)






class DF_TalkUI(QWidget):


    def __init__(self, parent = None):
        super(DF_TalkUI, self).__init__(parent)
        self.setObjectName("DF_Talk_Window")
        self.setWindowTitle("DF Talk Window")
        #self._initUI()
        self.errorDialog = QErrorMessage(self) # QErrorMessageインスタンスの保持
        self.Window = self

    def myInit(self,qApp,refPath):
        self.qApp=qApp
        self.wrapper=wrapper = QWidget()
        #self.setCentralWidget(wrapper)

        mainLayout = QVBoxLayout()
        self.mainLayout= mainLayout
        wrapper.setLayout(mainLayout)

        #-----------------------------------------------------------------------
        # sixth row
        #-----------------------------------------------------------------------
        sixthHorizontalArea = QHBoxLayout()
        sixthHorizontalArea.setSpacing(20)
        mainLayout.addLayout(sixthHorizontalArea)


        """
        progressDialogBtn = QPushButton("Progress Dialog")
        sixthHorizontalArea.addWidget(progressDialogBtn)
        progressDialogBtn.clicked.connect(self.havyfunc)
        """
        #---------------------------
        self.havyfunc(refPath)
        #-----------------------------

        #-----------------------------------------------------------------------
        # seventh row
        #-----------------------------------------------------------------------
        #self.havyfunc()

    def _showProgressDialog(self):
        print("---------------------ProgressBar Starting--------------------------")

        self.max = 100
        self.progressDialog = QProgressDialog("Progress...", "Cancel", 0, self.max, self)
        self.progressDialog.setWindowTitle("Progress Dialog")
        self.progressDialog.show()
    
    def setProgress(self,count):
        print("---------------------setProgress ( "+str(count)+"/100 )--------------------------")
        self.qApp.processEvents()
        if self.progressDialog.wasCanceled():
            self.progressDialog.setValue(100)
        self.progressDialog.setValue(count)
        self.progressDialog.setLabelText("Progress... %d %%" % count)


    def havyfunc(self,refPath):
        
        #--------------------------------------------------
        self._showProgressDialog()
        self.setProgress(1)
        #--------------------------------------------------
        duplicatedMesh_vtx_arr=[1,2,3,4,5]
        duplicatedMesh_vtx_arr_len=len(duplicatedMesh_vtx_arr)
        
        cmds.file(refPath, ignoreVersion=1, type="mayaAscii", namespace=":", r=1, gl=1, mergeNamespacesOnClash=False, options="v=0;")
        """
        for i in range(0,duplicatedMesh_vtx_arr_len):
            
            
            #---------------------------------------------------
            parcent=(100*i/duplicatedMesh_vtx_arr_len) /2
            self.setProgress(parcent)
            print("setProgress("+str(parcent)+")")
            time.sleep(0.1)
            #---------------------------------------------------
            
            #重たい処理1
        
        for i in range(0,duplicatedMesh_vtx_arr_len):
            
            #---------------------------------------------------
            parcent=(100*i/duplicatedMesh_vtx_arr_len) /2 +50
            
            self.setProgress(parcent)
            
            print("setProgress("+str(parcent)+")")
            time.sleep(0.1)
            #---------------------------------------------------
            #重たい処理2
        """      
        #--------------------------------------
        self.setProgress(100)
        print("setProgress("+str(100)+")")

        self.MyHide()
        #self.closeEvent(QCloseEvent)
        #--------------------------------------
    def MyHide(self):
        self.resize(2, 1)  # 幅800、高さ600
        self.Window.move(10000, 10000) #X 10000 Y 10000


        """
        #self.mainLayout.close()
        self.wrapper.hide()
        self.wrapper.close()
        self.Window.hide()
        self.Window.close()
        self.close()
        """


    def _makeHorizontalLine(self):
        hline = QFrame()
        hline.setFrameShape(QFrame.HLine)
        hline.setFrameShadow(QFrame.Sunken)
        return hline






def start(app,refPath):
    maya_win = get_maya_pointer()
    ui = DF_TalkUI(parent = maya_win)
    ui.myInit(app,refPath)
    ui.show()
    return ui


def starter(refPath):
    app = QApplication.instance()
    if app is None:
        app = QApplication([])
    ui = start(app,refPath)
    app.exec_()
    
#=----------------------------------------------------------------------------------------------
# -*- coding: utf-8 -*- 
from maya import cmds 
import pymel.core as pm 

def mosa_anim_func10_2to10_3_reference(RigIDNum):
	
	reference_path="D:/MOSADesign/WorkData/Avatar/" + RigIDNum + "/Motion/Rig/PL_" + RigIDNum + "_rig.ma"
	#cmds.file(reference_path, ignoreVersion=1, type="mayaAscii", namespace=":", r=1, gl=1, mergeNamespacesOnClash=False, options="v=0;")
	starter(reference_path)
print("__name__  = "+__name__ )
if __name__ == '__main__':
    mosa_anim_func10_2to10_3_reference("005")

参考

https://forum.freecad.org/viewtopic.php?t=43989

maya mel python 環境変数 一覧 path MAYA_SCRIPT_PATH

maya mel python environment variables list path MAYA_SCRIPT_PATH

MEL

//getenv "MAYA_SCRIPT_PATH";//パスを確認

$sPath=`getenv "PATH"`;
print("$sPath= "+$sPath+"\n");
$sMAYA_SCRIPT_PATH=`getenv "MAYA_SCRIPT_PATH"`;
print("$sMAYA_SCRIPT_PATH= "+$sMAYA_SCRIPT_PATH+"\n");

$array = stringToStringArray($sMAYA_SCRIPT_PATH, ";");

for ($MSP in $array) {
    print($MSP+"\n");
}

Python

import os
print("------------------------PATH---------------------------")
ePath = os.environ["PATH"]
ePath_List=ePath.split(";")
for ePath_line in ePath_List:
    #for ev in environ:
    print(ePath_line)

print("------------------------MAYA_SCRIPT_PATH-----------------------------")

mayaScriptPath = os.environ["MAYA_SCRIPT_PATH"]
mayaScriptPath_List=mayaScriptPath.split(";")
for mayaScriptPath_line in mayaScriptPath_List:
    #for ev in environ:
    print(mayaScriptPath_line)

[maya] scriptJob は実行中には中断できません。のエラーを回避する方法

scriptJob でMayaの状態を監視することができるが、その監視を終わらせる際にエラーが出る
日本語のエラー:scriptJob は実行中には中断できません。 #
英語のエラー:scriptJob cannot be killed while it is running. #

実行中のそれを回避するために、evalDeferredでコマンドを囲って遅延させて実行させる。

mel

global int $jobNum;
global proc myScriptJobFunctionName(){
      global int $jobNum;
      print("func $jobNum="+$jobNum+"\n");
      //scriptJob -kill $jobNum;  
      evalDeferred("myDeferredFunctionName();");  
}
global proc myDeferredFunctionName(){
      global int $jobNum;
      print("func Deferred  $jobNum="+$jobNum+"\n");
      scriptJob -kill $jobNum;  
}
$jobNum = `scriptJob -event "SceneOpened" "myScriptJobFunctionName();"`;
print("$jobNum="+$jobNum+"\n");
//scriptJob -kill $jobNum;


file -f -options "v=0;"  -ignoreVersion  -typ "mayaAscii" -o "D:/MOSADesign/WorkData/Avatar/005/Motion/Rig/PL_005_Reference_Model.ma";

python

import maya.cmds as cmds

class ScriptJobber():
    def starter(self):
    
        #scriptJoblistEvents=cmds.scriptJob(listEvents=True)
        #print(scriptJoblistEvents)
    
        #for EventName in scriptJoblistEvents:
        #    print(EventName)
        
        
        
        #self.jobNum = cmds.scriptJob(event=("idle", 'Class_ins.idleTimeFunc()'))
        self.jobNum = cmds.scriptJob(event=("SceneOpened", 'Class_ins.SceneOpenedTimeFunc()'))
        #self.jobNum = cmds.scriptJob(event=("SceneOpened", 'Class_ins.SceneOpenedTimeFunc()'),runOnce = True, killWithScene = True)
        print("self.jobNum= "+str(self.jobNum))
    
    
    def SceneOpenedTimeFunc(self):
        print("SceneOpenedTimeFunc")
        print("SceneOpenedTimeFunc self.jobNum= "+str(self.jobNum))
        #cmds.scriptJob( kill=Class_ins.jobNum, force=True)
        cmds.evalDeferred("cmds.scriptJob( kill=Class_ins.jobNum, force=True)")
    
    def idleTimeFunc(self):
        print("idleTimeFunc")
        print("idleTimeFunc self.jobNum= "+str(self.jobNum))
        #cmds.scriptJob( kill=self.jobNum, force=True)
        cmds.evalDeferred("cmds.scriptJob( kill=Class_ins.jobNum, force=True)")
        
Class_ins=ScriptJobber()
Class_ins.starter()


"""
linearUnitChanged
timeUnitChanged
angularUnitChanged
Undo
undoSupressed
Redo
customEvaluatorChanged
serialExecutorFallback
timeChanged
currentContainerChange
quitApplication
idleHigh
idle
idleVeryLow
RecentCommandChanged
ToolChanged
PostToolChanged
ToolDirtyChanged
ToolSettingsChanged
tabletModeChanged
DisplayRGBColorChanged
animLayerRebuild
animLayerRefresh
animLayerAnimationChanged
animLayerLockChanged
animLayerBaseLockChanged
animLayerGhostChanged
cteEventKeyingTargetForClipChanged
cteEventKeyingTargetForLayerChanged
cteEventKeyingTargetForInvalidChanged
teClipAdded
teClipModified
teClipRemoved
teCompositionAdded
teCompositionRemoved
teCompositionActiveChanged
teCompositionNameChanged
teMuteChanged
cameraChange
cameraDisplayAttributesChange
SelectionChanged
PreSelectionChangedTriggered
LiveListChanged
ActiveViewChanged
SelectModeChanged
SelectTypeChanged
SelectPreferenceChanged
DisplayPreferenceChanged
DagObjectCreated
transformLockChange
renderLayerManagerChange
renderLayerChange
displayLayerManagerChange
displayLayerAdded
displayLayerDeleted
displayLayerVisibilityChanged
displayLayerChange
renderPassChange
renderPassSetChange
renderPassSetMembershipChange
passContributionMapChange
DisplayColorChanged
lightLinkingChanged
lightLinkingChangedNonSG
UvTileProxyDirtyChangeTrigger
preferredRendererChanged
polyTopoSymmetryValidChanged
SceneSegmentChanged
PostSceneSegmentChanged
SequencerActiveShotChanged
ColorIndexChanged
deleteAll
NameChanged
symmetricModellingOptionsChanged
softSelectOptionsChanged
SetModified
xformConstraintOptionsChanged
metadataVisualStatusChanged
undoXformCmd
redoXformCmd
freezeOptionsChanged
linearToleranceChanged
angularToleranceChanged
nurbsToPolygonsPrefsChanged
nurbsCurveRebuildPrefsChanged
constructionHistoryChanged
threadCountChanged
SceneSaved
NewSceneOpened
SceneOpened
SceneImported
PreFileNewOrOpened
PreFileNew
PreFileOpened
PostSceneRead
workspaceChanged
nurbsToSubdivPrefsChanged
PolyUVSetChanged
PolyUVSetDeleted
selectionConstraintsChanged
startColorPerVertexTool
stopColorPerVertexTool
start3dPaintTool
stop3dPaintTool
DragRelease
ModelPanelSetFocus
modelEditorChanged
MenuModeChanged
gridDisplayChanged
interactionStyleChanged
axisAtOriginChanged
CurveRGBColorChanged
SelectPriorityChanged
snapModeChanged
activeHandleChanged
ChannelBoxLabelSelected
texWindowEditorImageBaseColorChanged
texWindowEditorCheckerDensityChanged
texWindowEditorCheckerDisplayChanged
texWindowEditorDisplaySolidMapChanged
texWindowEditorShowup
texWindowEditorClose
colorMgtOCIORulesEnabledChanged
colorMgtUserPrefsChanged
RenderSetupSelectionChanged
colorMgtEnabledChanged
colorMgtConfigFileEnableChanged
colorMgtConfigFilePathChanged
colorMgtConfigChanged
colorMgtWorkingSpaceChanged
colorMgtPrefsViewTransformChanged
colorMgtPrefsReloaded
colorMgtOutputChanged
colorMgtPlayblastOutputChanged
colorMgtRefreshed
selectionPipelineChanged
playbackRangeChanged
playbackSpeedChanged
playbackModeChanged
playbackRangeSliderChanged
glFrameTrigger
currentSoundNodeChanged
graphEditorChanged
graphEditorParamCurveSelected
graphEditorOutlinerHighlightChanged
graphEditorOutlinerListChanged
EditModeChanged
RenderViewCameraChanged
texScaleContextOptionsChanged
texRotateContextOptionsChanged
texMoveContextOptionsChanged
polyCutUVSteadyStrokeChanged
polyCutUVEventTexEditorCheckerDisplayChanged
polyCutUVShowTextureBordersChanged
polyCutUVShowUVShellColoringChanged
shapeEditorTreeviewSelectionChanged
poseEditorTreeviewSelectionChanged
sculptMeshCacheBlendShapeListChanged
sculptMeshCacheCloneSourceChanged
RebuildUIValues
cteEventClipEditModeChanged
teEditorPrefsChanged

"""

URL
https://forums.cgsociety.org/t/scriptjob-problems/942387

[UE5.3.2][Cloth][Python]UE5.3でClothがPythonでどこまでさわれるかの調査

https://docs.unrealengine.com/5.3/en-US/PythonAPI/search.html?q=Cloth

より抜粋して調査。


★★★unreal.SkeletalMesh★★★

  • cloth_lod_bias_mode(クロスLODBiasMode): [読み取り/書き込み]
  • mesh_clothing_assets(配列[ Cloth ingAssetBase]): [読み取り/書き込み]

is_section_using_cloth ( Section_index , check_corresponding_sections = True ) → bool_

提供されたセクションが APEXクロスを使用しているかどうかを確認します。 bCheckCorrespondingSections が true の場合、無効なセクションは、クロスが使用されているかどうかを確認するために対応するセクションを延期します (クロス以外のセクションは無効になり、クロスが有効な場合は別のセクションが追加されます。このフラグを使用すると、元のセクションのチェックが成功します)。

プロパティ Mesh_clothing_assets :なし _

[読み書き]タイプ:(配列ClothingAssetBase ])

★★★unreal.SkeletalMeshComponent★★★


allow_cloth_actors(bool): [読み取り/書き込み] クロス シミュレーションの作成を切り替えます。オフの場合、シミュレーション ステップをスキップするだけでなく、アクターの割り当てを完全に回避する点で、以下のシミュレーション トグルとは異なります。


cloth_blend_weight(浮動小数点): [読み取り/書き込み] シミュレーション結果とキーフレーム位置の間でブレンドするウェイト。ウェイトが 1.0 の場合、クロス シミュレーション結果のみが表示され、0.0 の場合はスキンされた結果のみが表示されます。

cloth_max_distance_scale(浮動小数点): [読み取り/書き込み]

clothing_simulation_factory(type(Class)): [読み取り-書き込み] を担当するオブジェクトのクラス


disable_cloth_simulation(bool): [読み取り/書き込み] クロス シミュレーションを無効にし、シミュレーションなしでオリジナルのアニメーションを再生します。


update_cloth_in_editor(bool): [読み取り/書き込み] true の場合、エディターでクロスを再生します


wait_for_parallel_cloth_task(bool): [読み取り/書き込み] クロス シミュレーションが完了するまで、クロス ティック タスクを停止するかどうか。これは、ゲーム スレッド上で最新のクロス データが必要な場合、たとえばクロスの頂点でパーティクルを生成したい場合に必要です。


▶プロパティ allow_cloth_actors : bool
[読み取り/書き込み] クロスシミュレーションの作成を切り替えます。オフの場合、シミュレーション ステップをスキップするだけでなく、アクターの割り当てを完全に回避する点で、以下のシミュレーション トグルとは異なります。


binding_cloth_to_leader_pose_component ( ) → なし
このコンポーネントに有効な LeaderPoseComponent がある場合、この関数は、個別にシミュレーションするのではなく、フォロワー コンポーネントのクロス アイテムにリーダー コンポーネントのクロス アイテムの変換を適用させます。注: これにより、リーダー コンポーネント上のすべてのクロス アクタがローカル スペースでシミュレートされます。また、クロスを正しくバインドするには、コンポーネントで使用されるメッシュが同一である必要があります。


binding_cloth_to_master_pose_component ( ) → なし
非推奨: 「bind_cloth_to_master_pose_component」は「bind_cloth_to_leader_pose_component」に名前変更されました。


▶プロパティ cloth_blend_weight : float
[読み取り/書き込み] シミュレーション結果とキーフレーム位置をブレンドするウェイト。ウェイトが 1.0 の場合、クロス シミュレーション結果のみが表示され、0.0 の場合はスキンされた結果のみが表示されます。


▶プロパティ cloth_max_distance_scale : float


▶プロパティ disable_cloth_simulation : bool
[読み取り/書き込み] クロスシミュレーションを無効にし、シミュレーションなしでオリジナルのアニメーションを再生します


Force_cloth_next_update_teleport ( ) → なし


UpdateClothState への次の呼び出し中に強制的に「テレポート」する必要があることを示すために使用されます。これにより位置と速度が変換され、シミュレーション状態が維持され、新しいポーズに変換されるだけです。


force_cloth_next_update_teleport_and_reset ( ) → なし


UpdateClothState への次回の呼び出し中に「テレポートとリセット」を強制する必要があることを示すために使用されます。これは、悪い状態からリセットしたり、古い状態が重要でなくなった場合にテレポートによってリセットしたりするために使用できます。


get_allow_cloth_actors ( ) → bool
許可されたクロス アクターを取得する

get_cloth_max_distance_scale ( ) → float
衣服メッシュの頂点の最大距離スケールを取得/設定します


get_clothing_simulation_interactor ( ) → ClothingSimulationInteractor
現在のシミュレーションがランタイム インタラクションをサポートしている場合は、衣服シミュレーションの現在のインタラクターを取得します。


is_clothing_simulation_suspended ( ) → bool
服装シミュレーションが現在一時停止されているかどうかを取得します。


unbind_cloth_from_master_pose_component ( restore_simulation_space : bool = True ) → なし
非推奨: 「unbind_cloth_from_master_pose_component」は「unbind_cloth_from_leader_pose_component」に名前変更されました。

▶プロパティ wait_for_Parallel_cloth_task : bool

[読み取り/書き込み] クロス シミュレーションが完了するまで、クロス ティック タスクを停止するかどうか。これは、ゲーム スレッド上で最新のクロス データが必要な場合、たとえばクロスの頂点でパーティクルを生成したい場合に必要です。

★★★unreal.ChaosClothComponent★★★ 

  
▶プロパティ cloth_asset : ChaosClothAsset


get_cloth_asset ( ) → ChaosClothAsset
このコンポーネントで使用されるクロス アセットを取得します。


set_cloth_asset ( clothes_asset ) → なし

このコンポーネントで使用されるクロス アセットを設定します。

★★★unreal.ClothingSimulationInteractor★★★


clothes_config_updated ( ) → なし

シミュレーションを再起動せずにクロス構成を更新するために呼び出されます。


★★★unreal.ClothingAssetCommon★★★


ソルバー固有の実装では、このクラスをオーバーライドして、c Cloth SimConfig や c CustomData などの子クラスの独自のデフォルト インスタンスを構築したり、c AddNewLod() ファクトリをオーバーライドして c UClothLODDataBase の独自の実装を構築したりすることができます。


▶プロパティ cloth_configs :なし
[読み取り専用] シミュレーション固有の布パラメータ。 GetClothConfig() を使用して、目的の布地シミュレーション システムの正しいパラメータ/構成タイプを取得します。

タイプ:
(マップ[名前,クロスConfigBase ])
エディターのプロパティ: (get_editor_property/set_editor_property を参照)

cloth_configs(Map[Name, Cloth ConfigBase]): [読み取り専用] シミュレーション固有のクロス パラメータ。 GetClothConfig() を使用して、目的の布地シミュレーション システムの正しいパラメータ/構成タイプを取得します。

imported_file_path(str): [読み取り専用] このアセットがファイルからインポートされた場合、これが元のパスになります

physics_asset(PhysicsAsset): [読み取り/書き込み] シミュレーションを構築するときに衝突を抽出する物理アセット。

★★★例えばSampleコードを書いてみる★★★

unreal.SkeletalMesh.disable_cloth_simulation=True#クロス シミュレーション計算を有効に
unreal.SkeletalMesh.allow_cloth_actors=True#クロスシミュレーション作成Createへ切替え
mesh_clothing_list = unreal.SkeletalMesh.mesh_clothing_assets

・「Add Clothing」ボタンでも基本的に別のメッシュのClothingDataをApplayすると、Apply時に、Failed Bind Cloth Assetでエラーがでます。
E:/SandBox/jennie9UE532/jennie9UE532/Content/Developers/notsuka/EUB_ClothTool_AssetAction.uasset
・Mesh Clothing Assetsの配列のコピーというより参照変えはできましたが、そのあとApplyすると

Failed to bind clothing asset
Plane_Clothing_O_myCloth as the provided mesh is not the owner of this asset.
衣類アセットのバインドに失敗しました
Plane_Clothing_O_myCloth は、提供されたメッシュとしてこのアセットの所有者ではありません。


となりました。

・現存の「Add Clothing」ボタンと変わらないかそれ以下な結果となりました。
・また配列を参照変えでなくコピーにできないかも研究しましたが今回の「Mesh Clothing Assets」の型が「Add To Variable(変数化)」できない部分が問題でコピーできませんでした。

[UE5.3.2][KawaiiPhysics v1.14.0]Bone Constrainを使ってみた。Experimentalなので試験的なテストですが、うまくいかなかった。

まず、データ的に足りない部分があった。(あえて足らなくしてるのかもしれないが)

スカートのコンストレインは前面だけ用意されていたので

ーーーーData_Skirt_BoneConstraintsーーーー
1Lと1L 前
skirt_01_0[1-9]_l
skirt_01_0[1-9]_r
1Lと2L 左前
skirt_01_0[1-9]_l
skirt_02_0[1-9]_l
2Lと3L 左
skirt_02_0[1-9]_l
skirt_03_0[1-9]_l
1Rと2R 右前
skirt_01_0[1-9]_r
skirt_02_0[1-9]_r

ーーーーData_Skirt_j9BoneConstraintsで追加したーーーー

skirt_02_0[1-9]_r
skirt_03_0[1-9]_r
右後ろ
skirt_03_0[1-9]_r
skirt_04_0[1-9]_r
後ろ
skirt_04_0[1-9]_l
skirt_04_0[1-9]_r
左後ろ
skirt_03_0[1-9]_l
skirt_04_0[1-9]_l

なので

で下の Bone Constraintにデータが入った。

再コンパイルした。だめだった。もとになるコリジョン?がないのかもしれない。

Modify Target >Exclude Bones をfoot_rootだけにしたら表示された。

まあExperimentalなので試験的なテストです。

[UE5.3.2][Niagara]Niagara Parameter Collection の使い方

確認用のシステム、エミッター、モジュール、そしてNiagaraParameterCollectionのアセットを作ります。

名前は何でもいいので NiagaraParameterCollection 開いて、新しいパラメータfloatを一つ作ります。

最初のNiagaraParameterCollection設定は、これだけでOKです。

モジュール側の設定はこれで終了です。

次はエミッター側の設定です

ParticleSpawnに、先ほど作ったモジュールを追加します(自分でつけた名前で検索してください)

追加したモジュールに、MyFloat(設定した名前です)という部分に、数値が入るようになっていれば大丈夫です。

ここに入れた数字が、Lifetime(パーティクルの寿命)に設定されます。

設定しておくと、解りやすいと思います。

次に、NiagaraParameterCollectionを実際に入れていきます

まず、Parameterというウインドウを出します

ここから、追加したNiagaraParameterCollectionを登録します。

追加したら、この情報を、ドラッグして差し替えます。

このように登録されていればOKです。

ここまですれば、設定したNiagaraParameterCollectionファイルの数値を動かすと、このエミッターの寿命が延びたり縮んだりしていると思います。

実際に組み込んだ様子がこちら。

調整として使いやすいポイントとして、エミッター毎固定ではなく、システム毎に適用するデータを差し替える事が出来る点です。

エミッター自体の情報を差し替える必要がなく、システム側で変えることができるので、別のシステムで使うようのエミッターを流用していく事も可能です。

エミッター自体にNiagaraParameterCollectionデータを入れている場合でも、システム側でほかのデータに差し替える等も可能です。

HoudiniのHDAのような、いくつかのパラメータを変えるだけで簡単に調整出来る仕様というのも、段々出来ていくのかなと思います。

ということでした

参考URL

[UE5/3.2] PoseAssetの設定保存方法

UE5 PoseAssetの保存方法
ボーンの角度を編集したら。
PoseNameのところでAddPose >AddPoseFrom Currentで
PoseNameに名前を付けて元のポーズは削除する。
Valueを1にすると作ったポーズが見ることができる。

[maya][SkinWeight]スキンウェイトの部分コピー

Partial copy of skin weights

MAYAでのウェイト作業でしたら、部分コピーできます。

1,コピー元とコピー先のオブジェクトを選択

2,F9で頂点選択モード

3,コピー元ウェイト範囲を頂点選択

4,コピー先のウェイト範囲を頂点選択

5,スキンウェイトのコピー

の手順でスキンウェイトの部分コピーできます。

んーできない。

できないとおもっていたら。

んーできない。結局ベースはコピーしてそこからスキンウェイトペイントした。