<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Animation on ながむしメモ</title><link>https://nagakagachi.github.io/categories/animation/</link><description>Recent content in Animation on ながむしメモ</description><generator>Hugo</generator><language>ja-JP</language><lastBuildDate>Sun, 02 Oct 2022 19:41:37 +0900</lastBuildDate><atom:link href="https://nagakagachi.github.io/categories/animation/index.xml" rel="self" type="application/rss+xml"/><item><title>UE5 Geometry Script を利用した頂点単位リアルタイムアニメーション</title><link>https://nagakagachi.github.io/entry/2022/10/02/194137/</link><pubDate>Sun, 02 Oct 2022 19:41:37 +0900</pubDate><guid>https://nagakagachi.github.io/entry/2022/10/02/194137/</guid><description>&lt;p&gt;Geometry Scriptの利用の一環で&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;入力メッシュの頂点インデックスをUV1に埋め込み、外部テクスチャに頂点座標をベイク&lt;/li&gt;&#10;&lt;li&gt;上記で生成したメッシュとテクスチャを利用してマテリアルで頂点単位バネアニメーション&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;というものを試してみました&lt;/p&gt;&#10;&lt;p&gt;&lt;blockquote data-conversation="none" class="twitter-tweet" data-lang="ja"&gt;&lt;p lang="ja" dir="ltr"&gt;realtime fake secondary motion (WIP.&lt;br&gt;position, rotation, and scale operations in editor mode.&lt;br&gt;&lt;br&gt;Editorモードでの位置とスケールの操作プレビュー対応まで.&lt;br&gt;&lt;br&gt;あとプルプルしすぎていたので更に調整.&lt;a href="https://twitter.com/hashtag/UE5?src=hash&amp;amp;ref_src=twsrc%5Etfw"&gt;#UE5&lt;/a&gt; &lt;a href="https://t.co/xgzYPtIGpw"&gt;pic.twitter.com/xgzYPtIGpw&lt;/a&gt;&lt;/p&gt;&amp;mdash; なが (@nagakagachi) &lt;a href="https://twitter.com/nagakagachi/status/1561311962805719040?ref_src=twsrc%5Etfw"&gt;2022年8月21日&lt;/a&gt;&lt;/blockquote&gt; &lt;script async src="https://platform.twitter.com/widgets.js" charset="utf-8"&gt;&lt;/script&gt; &lt;/p&gt;&#10;&lt;div class="section"&gt;&#10;&lt;h3 id="サンプル"&gt;サンプル&lt;/h3&gt;&#10;&lt;p&gt;レベルに配置されている BP_ControllerInEditorTick を動かすとプルプルします.&lt;br /&gt;&#10;Playを実行すると物理で動くモデルがプルプルします.&lt;br /&gt;&#10;&lt;iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fgithub.com%2Fnagakagachi%2Fue4%2Ftree%2Fmaster%2Fproject%2Fsample%2FPerVtxAnimSample" title="ue4/project/sample/PerVtxAnimSample at master · nagakagachi/ue4" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"&gt;&lt;/iframe&gt;&lt;cite class="hatena-citation"&gt;&lt;a href="https://github.com/nagakagachi/ue4/tree/master/project/sample/PerVtxAnimSample"&gt;github.com&lt;/a&gt;&lt;/cite&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="section"&gt;&#10;&lt;h3 id="構成"&gt;構成&lt;/h3&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;BP_GenerateMeshForPerVertexAnim&#10;&lt;ul&gt;&#10;&lt;li&gt;入力StaticMeshアセットから以下のようなアセットを生成する&#10;&lt;ul&gt;&#10;&lt;li&gt;UV1に頂点インデックスを埋め込んだStaticMesh&lt;/li&gt;&#10;&lt;li&gt;頂点インデックスに対応したテクセルにローカル頂点座標をベイクしたテクスチャ&lt;/li&gt;&#10;&lt;/ul&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&lt;/li&gt;&#10;&lt;li&gt;BP_PerVertexAnimationTest&#10;&lt;ul&gt;&#10;&lt;li&gt;上記で生成したMeshとテクスチャを利用して頂点単位バネシミュレーションをマテリアル(&lt;a class="keyword" href="http://d.hatena.ne.jp/keyword/GPU"&gt;GPU&lt;/a&gt;)で計算する&lt;/li&gt;&#10;&lt;/ul&gt;&lt;/li&gt;&#10;&lt;li&gt;BP_ControllerInEditorTick&#10;&lt;ul&gt;&#10;&lt;li&gt;Editorモードのマニピュレータ操作でバネシミュをプレビューするためのコントローラ&lt;/li&gt;&#10;&lt;/ul&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/div&gt;&#10;&lt;div class="section"&gt;&#10;&lt;h3 id="導入"&gt;導入&lt;/h3&gt;&#10;&lt;div class="section"&gt;&#10;&lt;h4 id="プロジェクトで-Geometry-Script-プラグインを有効化"&gt;プロジェクトで Geometry Script &lt;a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D7%A5%E9%A5%B0%A5%A4%A5%F3"&gt;プラグイン&lt;/a&gt;を有効化&lt;/h4&gt;&#10;&lt;p&gt;編集/&lt;a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D7%A5%E9%A5%B0%A5%A4%A5%F3"&gt;プラグイン&lt;/a&gt;エディタから Geometry Script の&lt;a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C1%A5%A7%A5%C3%A5%AF%A5%DC%A5%C3%A5%AF%A5%B9"&gt;チェックボックス&lt;/a&gt;をONにする&lt;br /&gt;&#10;必要ならEditorの再起動をする&lt;br /&gt;&#10;&lt;span itemscope itemtype="http://schema.org/Photograph"&gt;&lt;img src="images/6180d11068fdae02c349a7e467eed72ac958f509a59859185abd883f9cd767a9.png" width="1200" height="297" loading="lazy" title="" class="hatena-fotolife" itemprop="image"&gt;&lt;/span&gt;&lt;br /&gt;&#10;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="section"&gt;&#10;&lt;h4 id="PerVtxAnimWithGeometryScriptを取り込み"&gt;PerVtxAnimWithGeometryScriptを取り込み&lt;/h4&gt;&#10;&lt;p&gt;Window&lt;a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A8%A5%AF%A5%B9%A5%D7%A5%ED%A1%BC%A5%E9"&gt;エクスプローラ&lt;/a&gt;上などからプロジェクトのContentフォルダにサンプルの&lt;br /&gt;&#10;PerVtxAnimWithGeometryScriptフォルダ&lt;br /&gt;&#10;をコピー&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="section"&gt;&#10;&lt;h4 id="生成用サンプルアクター-をレベルに配置"&gt;生成用サンプルアクター をレベルに配置&lt;/h4&gt;&#10;&lt;p&gt;BP_GenerateMeshForPerVertexAnim をレベルに配置&lt;br /&gt;&#10;&lt;span itemscope itemtype="http://schema.org/Photograph"&gt;&lt;img src="images/30f9d9a8b24a648be093b5061ca7a42e20b81b7b61e41ca6d7e617866b48fbdc.png" width="1200" height="843" loading="lazy" title="" class="hatena-fotolife" itemprop="image"&gt;&lt;/span&gt;&lt;br /&gt;&#10;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="section"&gt;&#10;&lt;h4 id="生成用サンプルアクターにアセットを設定"&gt;生成用サンプルアクターにアセットを設定&lt;/h4&gt;&#10;&lt;p&gt;BP_GenerateMeshForPerVertexAnimアクターに変換元Mesh, 出力先Mesh &amp; RenderTargetを設定&lt;br /&gt;&#10;Sm Src Mesh に変換元のStaticMeshを設定, 図は同梱しているウシモデル(Spot)を設定している様子&lt;br /&gt;&#10;&lt;a class="keyword" href="http://d.hatena.ne.jp/keyword/Tex"&gt;Tex&lt;/a&gt; Bake Position Target にベイク情報を出力するRenderTargetを設定&lt;br /&gt;&#10;Sm Bake Target に変換結果のMeshを出力するStaticMeshを設定&lt;br /&gt;&#10;&lt;span itemscope itemtype="http://schema.org/Photograph"&gt;&lt;img src="images/a199ba136831e36a6a91fb45f179cc246799957a3bf072481fc714f27b8f6212.png" width="1200" height="671" loading="lazy" title="" class="hatena-fotolife" itemprop="image"&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="section"&gt;&#10;&lt;h4 id="アセット生成"&gt;アセット生成&lt;/h4&gt;&#10;&lt;p&gt;Geometry Scritpが駆動して Sm Bake Target と &lt;a class="keyword" href="http://d.hatena.ne.jp/keyword/Tex"&gt;Tex&lt;/a&gt; Bake Position Target のアセットに生成物が保存される&lt;br /&gt;&#10;Geometry Scritpはアクターのパラメータ変更等で駆動するため, 位置の変更や Enable Regenerate Mesh のONOFF等でトリガーされる&lt;/p&gt;&lt;p&gt;Sm Bake Target にはUV1に頂点インデックスを埋め込んだStaticMeshが出力される&lt;br /&gt;&#10;&lt;a class="keyword" href="http://d.hatena.ne.jp/keyword/Tex"&gt;Tex&lt;/a&gt; Bake Position Target には頂点インデックスに対応するテクセルに頂点座標がベイクされたテクスチャが出力される&lt;br /&gt;&#10;これらのアセットを利用してリアルタイムに頂点単位アニメーションを実現する&lt;br /&gt;&#10;&lt;span itemscope itemtype="http://schema.org/Photograph"&gt;&lt;img src="images/1ba5eec862176e4d55fcef6e798612f79ba89b294c3feb723d08cebe0540e1f8.png" width="448" height="326" loading="lazy" title="" class="hatena-fotolife" itemprop="image"&gt;&lt;/span&gt;&lt;br /&gt;&#10;&lt;span itemscope itemtype="http://schema.org/Photograph"&gt;&lt;img src="images/438e48343ffd19bd28e794c25208bb01781560b964ac51fb8e019b669698fcc4.png" width="794" height="672" loading="lazy" title="" class="hatena-fotolife" itemprop="image"&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="section"&gt;&#10;&lt;h4 id="ランタイムサンプルアクターをレベルに配置"&gt;ランタイムサンプルアクターをレベルに配置&lt;/h4&gt;&#10;&lt;p&gt;BP_PerVertexAnimationTest は 上記アクターで生成されたメッシュとテクスチャを利用するサンプル&lt;br /&gt;&#10;&lt;span itemscope itemtype="http://schema.org/Photograph"&gt;&lt;img src="images/fc8bde70344bbc575f4f192547e6b9ddd8181b2cd78f0636d8a0dc0e82c46944.png" width="1200" height="864" loading="lazy" title="" class="hatena-fotolife" itemprop="image"&gt;&lt;/span&gt;&lt;br /&gt;&#10;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="section"&gt;&#10;&lt;h4 id="ランタイムサンプルアクターにアセットを設定"&gt;ランタイムサンプルアクターにアセットを設定&lt;/h4&gt;&#10;&lt;p&gt;BP_PerVertexAnimationTest で生成されたメッシュとテクスチャをそれぞれ&lt;br /&gt;&#10;Mesh Vtx Attr Baked と &lt;a class="keyword" href="http://d.hatena.ne.jp/keyword/Tex"&gt;Tex&lt;/a&gt; Vtx Attr 0 に設定&lt;br /&gt;&#10;&lt;span itemscope itemtype="http://schema.org/Photograph"&gt;&lt;img src="images/740c759d4da7216bb8b008e247a4e476ea1a58c0e17efb105f46bf7273ba15ae.png" width="1200" height="663" loading="lazy" title="" class="hatena-fotolife" itemprop="image"&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;</description></item><item><title>論文メモ[CARL: Controllable Agent with Reinforcement Learning for Quadruped Locomotion](SIGGRAPH2020)</title><link>https://nagakagachi.github.io/entry/2020/05/16/193506/</link><pubDate>Sat, 16 May 2020 19:35:06 +0900</pubDate><guid>https://nagakagachi.github.io/entry/2020/05/16/193506/</guid><description>&lt;p&gt;&lt;iframe width="480" height="270" src="https://www.youtube.com/embed/t9CdF_Pl19Q?feature=oembed" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen&gt;&lt;/iframe&gt;&lt;cite class="hatena-citation"&gt;&lt;a href="https://www.youtube.com/watch?v=t9CdF_Pl19Q"&gt;www.youtube.com&lt;/a&gt;&lt;/cite&gt;&lt;br /&gt;&#10;&lt;/p&gt;&#10;&lt;ul class="table-of-contents"&gt;&#10;&lt;li&gt;&lt;a href="#Paper"&gt;Paper&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="#Abstract"&gt;Abstract&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="#Introduction"&gt;Introduction&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="#Proposed-Method"&gt;Proposed Method&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="#関連研究"&gt;関連研究&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;div class="section"&gt;&#10;&lt;h3 id="Paper"&gt;Paper&lt;/h3&gt;&#10;&lt;p&gt;&lt;iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Finventec-ai-center.github.io%2Fprojects%2FCARL%2Findex.html" title="CARL: Controllable Agent with Reinforcement Learning for Quadruped Locomotion" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;"&gt;&lt;/iframe&gt;&lt;cite class="hatena-citation"&gt;&lt;a href="https://inventec-ai-center.github.io/projects/CARL/index.html"&gt;inventec-ai-center.github.io&lt;/a&gt;&lt;/cite&gt;&lt;br /&gt;&#10;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="section"&gt;&#10;&lt;h3 id="Abstract"&gt;Abstract&lt;/h3&gt;&#10;&lt;p&gt;本論文では物理ベース制御アニメーションで駆動するエージェントに対して、ユーザによる制御が可能且つダイナミックな環境に自然に反応する四足歩行エージェント「CARL」を提案する。本研究ではエージェントは段階的に学習する。まずアニメーションクリップを模倣して身体を制御するように学習する。次にユーザによる高度な制御に対して適切なアニメーションを対応させる行動分布を学習する。行動分布の獲得にはGenerative Adversarial Networksを用いる。さらに深層&lt;a class="keyword" href="http://d.hatena.ne.jp/keyword/%B6%AF%B2%BD%B3%D8%BD%AC"&gt;強化学習&lt;/a&gt;によるfine-tuningによって、外部からの摂動から回復しつつ滑らかな遷移を可能にする。本研究では、ユーザの制御に対する追従性能を計測し、生成された動作を視覚的に分析することでその有効性を評価する。&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="section"&gt;&#10;&lt;h3 id="Introduction"&gt;Introduction&lt;/h3&gt;&#10;&lt;p&gt;(1)動的環境と物理的に相互作用する能力と，&lt;/p&gt;&#10;&lt;p&gt;(2)参照モーションクリップから学習した自然な動きを採用することで，データ駆動型の物理ベースの制御可能な四足歩行エージェントを提案する．&lt;/p&gt;&#10;&lt;p&gt;複数段階のプロセスからなり、はじめに模倣によってリファレンスモーションを学習、次に速度や向きなどの高度なユーザー制御をGenerative Adversarial Networksを用いたjoint-actionに&lt;a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%DE%A5%C3%A5%D4%A5%F3%A5%B0"&gt;マッピング&lt;/a&gt;することを学習する。&lt;/p&gt;&#10;&lt;p&gt;本研究の貢献をまとめると次のようになる。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;高次のユーザ制御と学習した自然な動きを効果的に&lt;a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%DE%A5%C3%A5%D4%A5%F3%A5%B0"&gt;マッピング&lt;/a&gt;するための GAN Supervision &lt;a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D5%A5%EC%A1%BC%A5%E0%A5%EF%A1%BC%A5%AF"&gt;フレームワーク&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;DRLを用いて訓練された四足歩行エージェントのための物理ベースのコントローラで、アクションラベルを必要とせずに意味のある反応を生成しながら、様々な外部摂動に適応することが可能&lt;/li&gt;&#10;&lt;li&gt;高レベルのナビゲーションモジュールをエージェントに接続する方法&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/div&gt;&#10;&lt;div class="section"&gt;&#10;&lt;h3 id="Proposed-Method"&gt;Proposed Method&lt;/h3&gt;&#10;&lt;p&gt;本研究では、高度なユーザ制御に追従しながら、外部からの擾乱を受けて自然な動きや反応を生成する物理ベースのコントローラを設計することを目的とする。生成された動きは、リファレンスモーションの動きに似ていれば自然なものと評価する。そのために、コントローラを3段階に分けて学習させる。&lt;/p&gt;&#10;&lt;p&gt;第 1 段階では、リファレンスモーションクリップの自然な動きを模倣学習により物理ベースのコントローラに伝達することを目的としている。これは物理ベースのコントローラが従うべき行動分布を方策ネットワークで学習することで達成される。&lt;/p&gt;&#10;&lt;p&gt;この方策ネットワークはプリミティブネットワークと歩法ネットワークを含み、行動分布を低レベルプリミティブ分布に分解する。結果としてこの方策ネットワークは物理ベースのコントローラが自然な動きを作り出すことを可能にする行動分布を生成し、アニメーションと物理の橋渡しに成功した。&lt;/p&gt;&#10;&lt;p&gt;2つ目の学習段階ではGANコントローラーアダプタを採用し、高レベルの歩法ネットワークが先に学習した自然な行動分布を近似できるようにした。しかし、2つ目の訓練段階では外部摂動がないため、外部からのノイズに対応できない。&lt;/p&gt;&#10;&lt;p&gt;そこで最後に GAN regularized DRL fine-tuning を追加し、コントローラがそのような外部摂動の影響から回復できるようにする。&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="section"&gt;&#10;&lt;h3 id="関連研究"&gt;関連研究&lt;/h3&gt;&#10;&lt;p&gt;物理ベース制御アニメーションの具体的な方策や実装などについてはこちらのほうが詳しそう&lt;br /&gt;&#10;&lt;iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fxbpeng.github.io%2Fprojects%2FMCP%2Findex.html" title="MCP: Learning Composable Hierarchical Control with Multiplicative Compositional Policies" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;"&gt;&lt;/iframe&gt;&lt;cite class="hatena-citation"&gt;&lt;a href="https://xbpeng.github.io/projects/MCP/index.html"&gt;xbpeng.github.io&lt;/a&gt;&lt;/cite&gt;&lt;/p&gt;</description></item></channel></rss>