- 投稿日:2020-08-20T20:56:59+09:00
【Unity】Final IKの中にモーション記録の機能があった件
こんにちはっ?八ツ橋まろんです
バーチャルYouTuberの中にはUnity + Final IKを駆使してキャラクターを動かし活動している人も多いことと思います。Final IKはその名の通りIKに関する有料アセットで、これ一つあればHTC Vive + Vive Trackerなどの構成でキャラクターを現実の動きとリンクさせることができます。
例)キャラクターとのリンク: 現実では中の人がだいたい同じ動きをしている
1年ぶりにVR Motion RecorderのIKの見直ししたらめっちゃ良くなった?
— 八ツ橋まろん?VtuberのMV制作?バーチャルマーケット5スタッフ (@Maron_Vtuber) July 19, 2020
Final IKくんとちょっぴり友達になったよ pic.twitter.com/jH1iFzxveJまた、バーチャルYouTuberの動画やミュージックビデオにおいては、表情や手の動きを「撮影の後で編集」するために「モーション記録」を行うことがあるかと思います。モーション記録をするためのアセットとして、Githubで公開されているEasy Motion RecorderやAsset Storeの有料アセットなどが存在するようです。(弊調べ)
例)モーション記録:モーションはEasy Motion Recorderで記録し、手や表情、カメラワークなどを後付け編集している
【新着動画】『白日 / King Gnu』covered by 八ツ橋まろん
— 八ツ橋まろん?VtuberのMV制作?バーチャルマーケット5スタッフ (@Maron_Vtuber) July 12, 2020
全編3D映像の曲ですっ?衣装やらモーション、カメラワークなどがんばって自分でつくりましたー✨
オリジナルのミュージックビデオを是非ご視聴くださいっ??https://t.co/xFMj23C4Bc pic.twitter.com/ln3iGaKUPf
さて、Final IKの理解を深めようとFinal IKを眺めていたら、この中にモーション記録用のスクリプトが入っていることに気が付きました。なるほど、これを使えばFinal IKだけでキャラクターの動きのリンクから撮影までできちゃうわけですね!知らなかった!!
ということで、このスクリプトを使うための簡単なやり方を紹介します。
①Hierarchyにある対象のキャラクターに"Humanoid Baker" component を追加、設定は画像の通り
②HierarchyにCanvasを作成
③Canvasの子にButtonを2つ作成し位置調整
④両方のButtonのButton ComponentのOnClickにキャラクターをドラッグ&ドロップし、片方の内容は"HumanoidBaker.StartBaking"にし、もう片方は"HumanoidBaker.StopBaking"にする。
⑤シーンを再生して記録開始の方のボタンを押し、キャラクターを適当に動かしてみる
⑥記録終了の方のボタンを押すと、①で指定したフォルダにアニメーションが作成される
<↓↓↓↓使い方動画↓↓↓↓>
なんと、、、Final IKの中にモーション記録のスクリプトがあったのだ、、、?✨
— 八ツ橋まろん?VtuberのMV制作?バーチャルマーケット5スタッフ (@Maron_Vtuber) August 20, 2020
さっそく使ってみたよ‼‼軽くてとってもいい感じ‼‼
簡単な使い方のQiita記事も書いたのだっ?https://t.co/pBiMykm2fS pic.twitter.com/qZdOm3eRiS以上です。お疲れ様でした。
八ツ橋まろん
- 投稿日:2020-08-20T19:53:57+09:00
【メモ】C#におけるボックス化(boxing)と回避方法
はじめに
Genericsが使うのでボックス化について意識することは減りました。
が、ボックス化について人に説明する機会があったので曖昧だったところを自分の為にまとめておきます。ボックス化
値型をobject型に代入するときに行われる処理。
参照型であることが必要な場面においても値型を使用できるようにする仕組み。
- 値型はスタック、参照型はヒープ上に実値が置かれる。
- object型は参照型なので、値型をobject型に代入したときに実値はヒープにコピーされる。(ボックス化)
- ヒープに実値コピーされるとき、元の型情報も付与される。
ボックス化解除
ボックス化された値型のコピーを取り出すこと
- ボックス化されたobject型は実値がヒープ上に置かれている。
- ボックス化されたobject型を元の型に戻す(キャスト)するときに実値がスタックにコピーされる。(ボックス化解除)
- 型情報が間違えていたときはInvalidCastExceptionが発生する。
パフォーマンス影響
簡単な代入と比べて、ボックス化およびボックス化解除は負荷の大きいプロセスです。 値型をボックス化するときは、新しいオブジェクトを割り当てて構築する必要があります。 ボックス化ほどではありませんが、ボックス化解除に必要なキャストも大きな負荷がかかります。 詳しくは、「パフォーマンス」をご覧ください。
デメリット
- ボックス化はオブジェクトの一時的なコピーを生成するため、コストがかかる。
- ボックス化解除はオブジェクトの一時的なコピーを生成するため、コストがかかる。
- ボックス化解除時のキャストにもコストがかかる。
- ヒープ上の領域確保は、スタックと比べると重たい処理。
- キャスト時、型情報が間違えていたときはランタイムエラー(InvalidCastException)が発生する。
ボックス化を起こさないために
- object型を使用しない
- Genericsを使用する
参考
- 投稿日:2020-08-20T18:42:58+09:00
.NET 5 Preview を Windows環境で試す方法
はじめに
.NET 5 Preview を Windows環境の Visual Sutidio 2019 で試す方法の紹介です。
(オプションダイアログの設定が必要なのに気付かなくて、少しハマったので).NET 5 SDK のインストール
以下のサイトから、.NET 5 の SDK をインストールします。
Download .NET 5.0赤枠部分がSDKのインストーラです。
ちなみに、右側はランタイムで、.NET 5 のプログラムを動作させるために必要なものです。
ここでは、開発するために必要なSDKをインストールします。
オプションダイアログの設定
.NET 5 SDK をインストールするだけでは、まだ .NET 5 は利用できません。
[オプション]ダイアログの [プレビューの .NET Core SDK を使用] のチェックボックスを有効にする必要があります。プロジェクトのプロパティの設定
上記の手順を実施後に、プロジェクトの [プロパティ] の [対象のフレームワーク] の選択肢を表示すると、 [.NET 5] が選択できるようになります。
まとめ
.NET 5 を設定されたプロジェクトは、.NET 5 SDK をインストールしていない人の環境では、コンパイルエラーになります。
従って、チームで開発しているソースコードを .NET 5 に変更する際は、全員がSDKをインストールしてから行う必要があります。ちなみに私は「Serverless LT 初心者向け」というコミュニティを運営しています。
社外発表することに興味があるけど、ハードルが高くてなかなか機会が得られないという発表初心者が集まるオンライン発表大会を毎月開催していますので、よろしければご参加ください。
Serverless LT 初心者向け - connpassTwitterでも開発に役立つ情報を発信しています → @kojimadev
- 投稿日:2020-08-20T17:15:26+09:00
Unityでファイル選択画面を使う
↓こんな感じのダイアログボックスを使ってファイルを選択したい
![]()
Script
scriptusing UnityEditor; public void OpenFile() { //パスの取得 var path = EditorUtility.OpenFilePanel("Open csv", "", "CSV"); if (string.IsNullOrEmpty(path)) return; Debug.Log(path); //読み込み var reader = new StreamReader(path); Debug.Log(reader); }詳細 //ここでダイアログボックスを出す
1つのファイルを選択
scriptvar path = EditorUtility.OpenFilePanel("Open csv", "", "CSV"); var path = EditorUtility.OpenFilePanel(ダイアログボックスの名前, ディレクトリのデフォルト設定,読み込むファイルの拡張子 );複数種類のファイル拡張子を指定する場合
scriptvar path = EditorUtility.OpenFilePanelWithFilters("Open image", "", {"音楽ファイル","mp3,ogg,wav"});EditorUtility.OpenFilePanelWithFilters
フォルダーを選択する場合
scriptvar path = EditorUtility.OpenFolderPanel("Open Folder", "", "");
- 投稿日:2020-08-20T15:10:35+09:00
ReactiveProperty の ReactiveCommand に sender と EventArgs を渡したい
ReactiveCommandにsenderとEventArgs両方とも渡したいんだけどどうすればいいの?(´;ω;`)
— のーかつ (@no_katsu) August 19, 2020個人的には ViewModel に sender 渡すのはどうかなぁと思いますが厳密にはあり合わせの機能では出来ないですが、近いことは出来なくもないです。やってみましょう。
ReactiveProperty.WPF パッケージに含まれる EventToReactiveCommand のコンバーターには AssociateObject プロパティがあって、これに EventTrigger が割り当てられたオブジェクトのインスタンスが入っています。これが sender と一致することがほとんどだと思う(というか一致しないケースってなんだろう)ので、これと EventArgs を渡してやるようにコンバーターで処理すれば OK ですね。
コンバーターはこんな感じ。
MyConverter.csusing Reactive.Bindings.Interactivity; using System; namespace WpfApp3 { public class MyConverter : DelegateConverter<EventArgs, (object sender, EventArgs args)> { protected override (object sender, EventArgs args) OnConvert(EventArgs source) => (AssociateObject, source); } }ということで適当に ViewModel を作って…
MainWindowViewModel.csusing Reactive.Bindings; using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Reactive.Linq; using System.Text; using System.Threading.Tasks; namespace WpfApp3 { public class MainWindowViewModel : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; public ReactiveCommand<(object sender, EventArgs args)> SomeCommand { get; } public ReadOnlyReactivePropertySlim<string> Result { get; } public MainWindowViewModel() { SomeCommand = new ReactiveCommand<(object sender, EventArgs args)>(); Result = SomeCommand .Select(x => $"{DateTime.Now}: {x.sender}, {x.args}") .ToReadOnlyReactivePropertySlim(); } } }MainWindow.xaml を以下のような感じにして
MainWindow.xaml<Window x:Class="WpfApp3.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:behaviors="http://schemas.microsoft.com/xaml/behaviors" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:local="clr-namespace:WpfApp3" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:rp="clr-namespace:Reactive.Bindings.Interactivity;assembly=ReactiveProperty.WPF" Title="MainWindow" Width="800" Height="450" mc:Ignorable="d"> <Window.DataContext> <local:MainWindowViewModel /> </Window.DataContext> <StackPanel> <Button Content="Click"> <behaviors:Interaction.Triggers> <behaviors:EventTrigger EventName="Click"> <rp:EventToReactiveCommand Command="{Binding SomeCommand}"> <local:MyConverter /> </rp:EventToReactiveCommand> </behaviors:EventTrigger> </behaviors:Interaction.Triggers> </Button> <TextBlock Text="{Binding Result.Value}" /> </StackPanel> </Window>実行してボタンを押すと Button のインスタンスとイベント引数がわたってることが確認できます。
まとめ
でも UI コントロールを ViewModel に直接渡したいというケースってなんだろう??
どうしようもない状態以外ではしない方がいいかな。きっともっといい方法があると願いたい。
- 投稿日:2020-08-20T02:11:44+09:00
【C#】 GDI+でカラー オーバーレイ(風)
概要
@Kyome さんのRunCat の記事
・Windowsのタスクバーでもネコ走らせてみた? - Qiita
https://qiita.com/Kyome/items/47aac4979933dac12263を見ていて、個人的に猫に自由に任意の色を付けたくなったので、WinForm (GDI+) で
カラー オーバーレイが出来ないか試してみた。
カラー オーバーレイとは?Photoshopの
レイヤー効果でおなじみ(?)のやつ。
レイヤーの描画ピクセルのに色情報を任意の色に上書きするやつ。
私は良くレイヤーの描画モードをスクリーンにした単色レイヤーを重ね合わせえて色味調整を行うことがよくあるのだけど。カラー オーバーレイだとカラーピッカーで選択中の色がリアルタイムで反映されるので、スクリーンレイヤーの色味調整でよく使ってる。開発環境
プログラムは @Kyome22 さんの RunCat for windows を拝借させていただきました。ありがとうございます!
- Windows10 Pro v1809
- Visual Studio 20019 Community
- .NET Framework 4.7.2 (AnyCPU)
- ソース
- RunCat for windows @Kyome22
https://github.com/Kyome22/RunCat_for_windows
※forkさせて頂きました。- RunCat4WinColors (RunCat for windows をforkした私のリポジトリ)
https://bitbucket.org/libraplanet/runcat4wincolors/概略
Graphics.DrawImageのオプションで使えるSystem.Drawing.Imaging.ImageAttributesで描画時に色を置換させる。- 置換情報は
ImageAttributes.SetRemapTable()にSystem.Drawing.Imaging.ColorMapをセットして行う。- 画像ソースは 白1色 + α の32bit画像
- 白に対して、置換色表はα = 0~255の 256パターン 用意する。
- 指定色のα値も反映させるため、置換後の色のα値にもかけ合わせる。
ColorMapはαの深度分.csColorMap[] map = new ColorMap[256]; for (int j = 0; j < map.Length; j++) { colorMap[j] = new ColorMap() { OldColor = Color.FromArgb(j, 255, 255, 255), NewColor = Color.FromArgb(j * newColor.A / 255, newColor.R, newColor.G, newColor.B), }; }こんな塩梅。
Color.Transparentもちゃんと効くのがありがたい。ただ、今回カラー オーバーレイ(風)としているのは、オーバーレイ対象が描画ピクセルでなく白だけだから。白(+α)以外の色があるとダメなので、実はオーバーレイとしては若干用足らず(苦笑)。サンプル ソース
カラー オーバーレイを試すにあたり、 @Kyome22 さんの RunCat for windows を勝手に利用させていただきました。ありがとうございます!
- RunCat4WinColors (RunCat for windows をforkしたプロジェクト)
https://bitbucket.org/libraplanet/runcat4wincolors/バック バッファ を
Imageオブジェクトで白猫の画像の枚数分予め作っておき、下記メソッドが呼ばれたら バックバッファ の内容を更新し、Iconオブジェクトを再生成する。 (バック バッファ はタスクトレイなので一応16x16。)カラー オーバーレイ 抜粋.csprivate void SetIconColor(Color catColor, Color bgColor) { Bitmap[] images = new Bitmap[] { Resources.cat16_0, Resources.cat16_1, Resources.cat16_2, Resources.cat16_3, Resources.cat16_4, }; ImageAttributes attr = new ImageAttributes(); // remap color table { ColorMap[] colorMap = new ColorMap[256]; for (int j = 0; j < colorMap.Length; j++) { colorMap[j] = new ColorMap() { OldColor = Color.FromArgb(j, 255, 255, 255), NewColor = Color.FromArgb(j * catColor.A / 255, catColor.R, catColor.G, catColor.B), }; } attr.SetRemapTable(colorMap); } // recreate icons for (int i = 0; i < imgIconBufs.Length; i++) { Bitmap imgBuf = imgIconBufs[i]; Bitmap imgCat = images[i]; Icon ico = icons[i]; // bg { Graphics g = Graphics.FromImage(imgBuf); g.Clear(bgColor); g.DrawImage(imgCat, new Rectangle(new Point(0, 0), imgCat.Size), 0, 0, imgCat.Width, imgCat.Height, GraphicsUnit.Pixel, attr); } if(icons[i] != null) { // 再作成時、古いHICONは必ず廃棄する! DestroyIcon(icons[i].Handle); icons[i] = null; } icons[i] = Icon.FromHandle(imgBuf.GetHicon()); } }感想
一応それっぽいのは出来たけど、
Bitmapクラスから 生成したIconクラスを明示的に破棄するためにWin32APIのDestroyIconを呼ぶ必要があってプラットフォーム 呼び出し(P/Invoke) を使ってしまったのが若干つらい。とは言っても、64bit モジュールがちゃんとがある普通のWin32API だからそんなに気にしなくてもだけど。でもやっぱり.NETは可能な限りマネージド コードだけで行きたい。。。(びば!AnyCPU!)ただ、最初はピクセル操作になると思っていたので
Marshal.CopyするくらいならとUnsafeも覚悟していたけど、一応カラー オーバーレイ(?) 部分だけはマネージド コードだけなので、そこは助かった。今度はColorMatrixも試してみたい。ColorMapで愚直に対応表を作るとすると。2^32 - 1で 4,294,967,295 パターンにもなり、とても現実的ではないので。。。参考
Kyome22/RunCat_for_windows: A cute running cat animation on your windows taskbar.
https://github.com/Kyome22/RunCat_for_windows[C#]タスクトレイアイコンの画像を動的に変更する
http://nanoappli.com/blog/archives/1975色を入れ替えて画像を描画する - .NET Tips (VB.NET,C#...)
https://dobon.net/vb/dotnet/graphics/setremaptable.html色を反転させた画像(ネガティブイメージ)を表示する - .NET Tips (VB.NET,C#...)
https://dobon.net/vb/dotnet/graphics/drawnegativeimage.htmlColorMatrixによる色の変換 - C# - hesperus.net
https://www.hesperus.net/csharp/color_matrix.aspx










