【UE4】予測パスを表示させてアイテムを投げる【逆引きUE】で投げた時に後ろに飛ぶ場合の対処方法

この動画をUE5Preview2でやった場合ボールが後ろに飛びました。

なんとなく予測パスメッシュにボールがぶつかったとか、投げる前のボールに投げる用のボールがぶつかったとか

Velocityがちゃんと設定されなかったとか

が気になりまして、ノード順番を変えてみましたがダメでした。

Spawn0.5秒後にProjectile Movementの Velocityを直接設定し

Hit ActorのDestroyActorを外したらうまくいきました。

socketの位置もほぼまんまになるように合わせました

Waterプラグインを使った場合に詳細のコリジョンには、PhysicsMaterialsを設定する場所がありません、どのように水と判別したらよいでしょうか? #アンリアルクエスト 2 (「歩く地面によって足音を変えよう」)の自己解決

まず。解決策は。

2つAnimNotify設定して

AnimNotify発火したら

大きく

とりあえずこっちはこのままです。
レイの長さが10なくらいです。=海のしたの地面に届かぬ用。

とりあえずこのままで、

Waterプラグインそのものの使い方は他のブログを見てください。  

フィジックス物理マテリアル設定するところないので。。。。

本題のWaterのColision Profile Nameをどうやってとるか?

レイ飛ばしても反応しなかったので、

WaterBodyCollisionの設定でPawnをブロックにして沈まなくしました。

あしにコリジョンつけました

これだけです!

Texturing XYZ で購入したTextureを使用するためのディスプレイスメントツールの使用方法 For Maya2022

この文章は「https://texturing.xyz/pages/texturing-xyz-displacement-tool」を日本語に翻訳し 再編成したものです。

これはRichardTrouveによって作成されたスクリプトで、TexturingXYZワークフローを容易にし、Lookdevシーンの設定にかかる時間を節約します。

リチャードさん、ありがとうございます。

これはMaya2022のPython3に対応されてなかったので個人的に修正してアップしました。
[Maya2022+/ Arnold ]

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

1. ZIPファイルを解凍し、script.melをmayaにドロップして開始します。

2.これにより、現在のシェルフにXYZロゴが配置されます。

3.スクリプトを開くと、UIが表示されます。

オブジェクトを選択し、[選択]をクリックして、ベースメッシュを選択します。

※:そのオブジェクトのシェーダーが既にある場合は、[現在のシェーダーを保持する]にチェックマークを付けます。

4. texturingXYZディスプレイスメントを選択し
今回は(XYZ_dispMultiChannel_mid50_lin_srgb.1001.exr)
フロートディスプレイスメントがある場合はそれを選択します。(ZbrushまたはMudboxの変位)(今回はなし)

5. [セットアップ]をクリックすると、

ハイパーシェードですべてのノードが接続され、ベースメッシュの形状のサブディビジョン設定も接続されます。あなたが今する必要があるのはあなたのコンテンツにブレンドを調整することだけであり、あなたは準備ができています!

翻訳はここまで

さーて違いが出ないので、肌のテクスチャ入れてからkeep current shader をオンにしてみた。わからん。

Arnorldでプレビューしないとだめにきまってるやん。

Arnoldでレンダリングしてみた。、違いがわからん。けどきれいやねalbedだけで。
左:albed 右:albed + (今回のtexturingXYZ DisplacementMap)

プログレスバーとかでよくあるパーセンテージの手計算



100が消したいので両方に100かけて


2分の1は0.5なので1割る2

100 *0.5 =50

100 * 現在の値 (1) / 配列の長さ(2) = X

100 *0.5 =50

percent= 100*i/arr_len 

こうなるので

重たい処理を入れないとうまく見えないが。実際に動くサンプル

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


import maya.cmds as cmds
from maya import OpenMaya
import maya.api.OpenMaya as om
from collections import OrderedDict
import math
from pymel.core import *
import pymel.core as pm
import maya.mel as mel

    
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 *


def get_maya_pointer():

    try:
        import maya.cmds as cmds
        from maya import OpenMayaUI

    except ImportError:
        return None


    try:
        imp.find_module("shiboken2")
        import shiboken2
        return shiboken2.wrapInstance(long(OpenMayaUI.MQtUtil.mainWindow()), QWidget)

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

class Sample_UI(QMainWindow):

    def __init__(self, parent = None):
        super(Sample_UI, self).__init__(parent)

        self.setObjectName("Sample_Window")
        self.setWindowTitle("Sample Window")
        #self._initUI()
        self.errorDialog = QErrorMessage(self) 
           
    def _initUI(self):
        wrapper = QWidget()
        self.setCentralWidget(wrapper)

        mainLayout = QVBoxLayout()
        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")
    
    def setProgress(self,count):
        print("---------------------setProgress ( "+str(count)+"/100 )--------------------------")
        qApp.processEvents()
        if self.progressDialog.wasCanceled():
            self.progressDialog.setValue(100)
        self.progressDialog.setValue(count)
        self.progressDialog.setLabelText("Progress... %d %%" % count)

    def havyfunc(self):
        
        #--------------------------------------------------
        self._showProgressDialog()
        self.setProgress(1)
        #--------------------------------------------------
        duplicatedMesh_vtx_arr=[1,2,3,4,5]
        arr_len=len(duplicatedMesh_vtx_arr)
        for i in range(0,duplicatedMesh_vtx_arr_len):
            #---------------------------------------------------
            parcent=(100*i/duplicatedMesh_vtx_arr_len) /2
            self.setProgress(parcent)
            print("setProgress("+str(parcent)+")")
            #---------------------------------------------------
            #重たい処理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)+")")
            
            #---------------------------------------------------
            #重たい処理2
              
        #--------------------------------------
        self.setProgress(100)
        print("setProgress("+str(100)+")")
        #--------------------------------------
           
def start():
    maya_win = get_maya_pointer()
    ui = Sample_UI(parent = maya_win)
    #ui= MyDialog()
    ui.show()
    return ui

def starter():
    app = QApplication.instance()
    if app is None:
        app = QApplication([])
    ui = start()
    app.exec_()

print("__name__= "+__name__)
#if __name__ == '__main__':
if __name__ == 'NppMaya' or __name__ == '__main__':
    starter()

いっこめの重い処理

parcent=(100*i/duplicatedMesh_vtx_arr_len) /2

にこめの重い処理

parcent=(100*i/duplicatedMesh_vtx_arr_len) /2 +50

こんなんなる。

よくこんなスクラップブックで計算したりする。

1行コードを分解するサンプルたくさん。

個人的に大嫌いな1行forや1行ifをつぶしていくサンプルコードたち。

class Acla:
    
    def unite_selection(self):
        #selected = [x for x in cmds.ls(sl=True) if cmds.listRelatives(x, type="mesh")]
        selected=[]
        for x in cmds.ls(sl=True):
            xx= cmds.listRelatives(x, type="mesh")
            if xx:
                selected.append(xx)
        
        
        if not selected:
            print("not selected")
            return
        #invalid_meshes = [x for x in cmds.listRelatives(selected, type="mesh", f=True) if not cmds.listConnections(x)]
        
        invalid_meshes = []
        for x in cmds.listRelatives(selected, type="mesh", f=True):
            xx= cmds.listConnections(x)
            if not xx:
                invalid_meshes.append(xx)
        
        if invalid_meshes:
            print("invalid", invalid_meshes)
            return
        res = cmds.polyUnite(*cmds.ls(sl=True), ch=0, op=True, muv=1)
        print(res)

ClassIns=Acla()
ClassIns.unite_selection()

pyside2 delete QVBoxLayout remove clear

更新機能がめんどくさいPysideの表示リフレッシュのために

レイアウト内をちゃんと削除するために

def clearLayout(self, layout):
    if layout is not None:
        while layout.count():
            item = layout.takeAt(0)
            widget = item.widget()
            if widget is not None:
                widget.deleteLater()
            else:
                self.clearLayout(item.layout())

#UE5 #UE5Study アニメーションリターゲットのメモ (なんかちょっと工程長くなったけど論理的で安心感ある)

ソースとターゲット両方のスケルタルメッシュを開いて

スケルトンツリー>リターゲットオプションを表示する

ソースもターゲットも以下をやる

マネキンの場所でアニメーション>IKリグを作成する。

どのスケルタルメッシュにするか表示されるのでマネキンを選択

名前を
IKRig_SK_Mannequinとした。

IKRig_NierA2_MayaV2とした

それぞれ開いて

階層から
Pelvisを右クリックして
リターゲティングルートの設定をクリック

IKリターゲティングの>新しいチェーンを追加するを6回おす。

ソースもターゲットも以下をやる。

head spine leftarm rightarm leftleg rightleg を入力 開始ボーン終了ボーンを設定する。

でーがっちゃんこようにアニメーションリターゲッターを作ります。

アニメーションをコピーする元のリグを選択するので今回はマネキン用のあにめを他のスケルタルメッシュにつけたいのでこうなりました

ダブルクリックして開いて

ターゲットが未選択なので選びます

アセットブラウザから選択したア二メーションをエクスポートボタンで出力できます。

参考