イラスト、モデリング、Unity、VR関連

unityとかblenderとかvr関連の作業メモ

パーティクルライブ 作成メモ、思ったこととかメモって行く

メモ:アニメーションからオブジェクトをアクティブ化してアニメーションをコールする場合、アクティブ化するオブジェクトにはアニメーションを付けず、直下に別オブジェクトを作り、ワンクッション置くこと。でないと、録画アニメーション画面が別のに切り替わってしまい、期待通りに機能しなくなる。

=>アニメーションの画面をロックすれば切り替わらない

 

アニメーションをshaderに組み込み、再利用化を図るのは難しい。

順番に歌詞を出したり、進み具合に応じて大きくする、というようなレベルならいいが、移動幅が大きかったりするものや複雑なものなどはコード化する苦労の割にショボいことしか出来ないと思われる。

 

パーティクルライブのBGMの音声設定メモ:
AudioSourceのSpatialBlendを0にして2Dにする。
VRC_Spatial_Audio_SourceコンポーネントのUseAudioSourceとEnable Spatializationのチェックを外す

 

アニメーションを作る場合、初期位置は0フレームで移動させるてると、気を付けてみると移動前の位置が見えてしまう。初期値はメッシュ自体に操作しておく必要がある。

 

条件がよく分からないが、Shaderでアニメーションを使ってメッシュを移動させると、位置が大幅にズレる場合があるっぽい。基本的にtransform値で操作するべし

 

専用プロジェクトに作る

 

フォルダ管理、命名規則等、構成を予め可能な限り明示的にしておく

 

その場で作成したシェーダを多用しない

 

素材は実際に使う段階になってから作った方がいい。

途中で飽きてやめるかもしれないし2番目で使う素材を使ったが、1番目しか作らないかもしれないし、演出上、不要であると気づくかもしれない

 

パーティクルなど使いまわすものはprefab化すべし

マテリアルの一括変更等が楽になる。

 

同じ種類のものは後で一括変更出来るように同じ名前にしておく。

 

++構成方式

全体管理するアニメーションとパートごとに小分けにしたアニメーションに分割する。

 

注意点:

全体管理するアニメーションに登録するオブジェクトは種類とパート番号で構成し、それが何であるかわかりやすくする。

 

全体管理アニメーションの役割:パートアニメーションのアクティブ化・非アクティブ化、パートアニメーションを組み合わせる場合の協調調整

 

++利点

アニメーションを分割することで、タイムラインの要素数が少なくなり、タイムライン上での見通しが良くなる。 

 

++欠点

アニメーションでアクティブ化したときオブジェクトの初期化が行われるらしく、それに伴うと思われる一瞬オブジェクトがちらついて見える、というバグがある。Shaderで初期状態を見えない状態にすればチラつかなくなる。

 

ルートアニメーションを操作して表示されたりするのは、パートごとのアニメーションが付与されたアブジェクトの初期状態であるため、実際のアニメーションを確認するためには実行する必要がある。

 

++負荷軽量作

LightingやShadow,Motion Vectorをオフにする。

ヒエラルキーにMeshRendererとコンポーネント名を入れればそれを持つオブジェクトが全て表示されるので全選択してインスペクタをいじれば、一括変更できる。

f:id:arumogina:20191019171601p:plain

 

https://twitter.com/abcde_find/status/1185593869846474754

アニメーションはエモートで出す。アニメーションオーバーライドだと40fpsほど下がった。

 

マテリアルを少なくしGPUインスタンシングを使用する。

半透明の使用を避ける。

半透明を使用する場合、RenderQueueを異なるものにする

描画の効率化について - しゅみぷろ

 

++エモートスイッチ

EmoteSwitch V3 - 元怒の扉 - BOOTH

 

 ++ワールド固定

ConstraintWorldFixed-V1.1 - ひまわり畑。 - BOOTH

 

++失敗点

オブジェクトをメッシュと歌詞をヒエラルキー上でそれぞれルートオブジェクトの下位に入れることで分類して管理していたのだが、分類を超えてtransformを同期させて使用しようとすると、面倒になる

曲のパートごとでのみ分類した方がいいかもしれない。

 

アニメーションでマテリアルの数値を変更するとき、MeshRendererにマテリアルが依存しているため、アニメーションを作ってからSkinedMeshRendererに切り替えるとアニメーションが壊れてしまう。

 

パーティクルの物量に頼った演出を作ったのだが、結局、負荷の問題でパーティクルを大幅に減らしたために、ショボい演出に・・・

 

Vket3の感想、より良いブースを求めて

Vketのブースを実際に見回って、これは改善した方がいいんじゃないかと思ったことを書いていく。強調しておくが、これは私が思ったことを素直に書き出しただけの文書であり、何かを評価しているわけではなくただの改善案である。言い換えるなら、私が出店する場合はこうするかな?、という方針でもある。

*私は今回出店していない

 

私が改善出来ると思った点を書いたのち、それらの点にといて良く出来ていると思ったブースを掲載する。

 

++アバターとユーザーの視線が合うようにしよう

アバターが高めに配置されすぎていたり、後ろや横を向いていたり、しゃかみこんで真っ直ぐに見ていたりしていて、視線が合わないのはユーザーの関心を引く力が弱いのではないかという気がする。

 

++ブースと展示アバターはUnlit、もしくは明るくする。

ワールドによってはライトが弱く、せっかくのブースが闇に紛れてしまっているブースがそれなりにあり、わざわざライトで照らしてみないと良く見えないブースがいくらかあった。ブースはライトの影響を受けないようにするか、ブース側でライトを用意して明るくすべきだと思う。

ブースは上の方などアバター等と被らない部分はライト等で特別明るくし、アバターと被る分は暗くしてアバターは明るくするのが、一番目立つのではないかと思う。

unlitを使う際は明るくなり過ぎないように注意する。VRで見ると(1,0,0)とかでもまぶしいらしいので、少し暗めぐらいがいいかも

 

++アバターを展示する

やはりペデスタルだけでなく、アバターも展示するほうが良いだろう。キャッチ力が違う。

 

++ペデスタルを置く

フルトラ適正や動いたときの動作確認のためにもこれは必須だと思う。使ってもらえれば宣伝効果もある

 

++ギミックでブースを出現させるのはやめた方がいいかもしれない

あるブースがオブジェクトをクリックしないとブースが出現しない仕様になっており、しかもそれが足元にあり、1週目では見落とすという事故があった(出現の演出自体はとても良かった)。また、自動的に出現されるブースもブース内に入らないと出現しないぐらい範囲が狭い上、ワールドと一体化しすぎていて見落とすことがあった。

しかし必ずしも悪いと思っておらず、こちらのブースや欠番街のブースは非常にインパクトが強かった

光属性のアルモジナ(VRChat勢) on Twitter: "… "

f:id:arumogina:20190929125620p:plain

欠番街のものはワールドにマッチしつつも、明らかになにかあると分かる、思わず近づいてしまうオブジェがあり、見落としにくいようになっている。

 

++メッセージはほとんど読まれないものと思った方がよい

VKetも規模が拡大するにつれブース数も多くなり、全て見て回るためには1ブースをじっくり見ていくのが難しくなってきている。そのため細かいメッセージ等は読まれにくいのではないかと思うし、実際私も見落としが多かった。

 

++ブースの2階は作らないか、せめて階段を正面から見える目立つ位置にする。

階段がブースの真横についていて階段の存在に気が付かない事故があった。また真正面にあっても背景と化していて気が付かない場合も。

ブースは基本的に間近で見て、全体像を見るにはワン動作必要なので、2階の存在自体に気づいてもらえない場合もあるのでないか。

 

++アバターとブースの色合いはコントラストにした方がいい

アバターとブースのイメージ合わせた結果、アバターの色合いがブースの色の保護色のようになってしまってるように思われるブースがあった。アバターを目立たせるなら、アバターとブースは別の色にした方がいいのではないかと思う。

 

++ブースにオブジェを置く場合は、アバターが埋もれないように気を付ける。

ブース内のオブジェもアバターも良い出来なのだけど、良く出来過ぎていて、アバターが目立たなくなってしまっているな、と思うブースがあったので。

 

++アバターは中央に配置する

 やはり売りたいものを一番目立たせるべきで、それなら中央に配置すべきなのではないかという。アバターを引き立たせるはずが、オブジェの方が目立ってしまってるのではないかと思う場合がチラホラあった。加えて、横に置いてるものはスルーされてしまう場合もある。商品は中央に、引き立てとあるオブジェなどは横や周囲に配置するのがいいのでないか?

 

++振り返らないと見えない位置にはおかない方がいいのでないか

リアルなら後ろに下がる場合、後ろを向くが、VRの場合は前を向いたままでもスムーズにでも下がれてしまうので、ブースに入ったのち、振り返らないと見えない位置に重要なものを置くのはやめた方がいいと思う

 

++何が置いてあるのかブースの外から見ても分かるようにする。

壁や布で隠れて、ブースの中に入らないと何があるか分からないという配置はワールドと一体化してしまったり、目立ちにくいためスルーされてしまう、という弊害があるのではないか、という気がする。商品は正面から見れば何があるか一目瞭然となる配置にした方がいいのではないか、と思う。究極的には商品をさえぎる遮蔽物はない方がいいのでないか?

 

++アバターは出来れば動かすべし

人間、やはり動くものに目が行くので可能であれば簡単な動作でもいいので動かすのがいいと思う。

 

+++見せ方が特にうまいと思ったブースの紹介

 

f:id:arumogina:20190929133438p:plain

 

 明るく目立ち、階段の配置も一目瞭然であり、可愛い子たちが店先で並んでおり非常にキャッチーである。

 

f:id:arumogina:20190929133643p:plain

f:id:arumogina:20190929133705p:plain

アバターと目線が合いキャッチーであり、ブースのデザインも工夫が為されていて完成度もかなり高いのに、目立ち過ぎずうまくアバターを引き立ていると思う。

 

f:id:arumogina:20190929134000p:plain

今まさに踊っている最中かのようなポーズをしており非常に印象的。

アバターにもよるだろうが、こういう派手なポーズを取らせるのも目立つ力を上げると思う

 

f:id:arumogina:20190929134431p:plain

明るすぎず、暗すぎず、ワールドの雰囲気とマッチしつつ、ブースがうまくアバターを引き立てている。アバターも本から飛び出てきたかのような配置であり、なおかつその本に設定が書かれており無駄がなく、演出と噛み合っている。

 

f:id:arumogina:20190929134758p:plain

 商品が分かりやすく、上方に明るいライトを配置することで目立つことに成功しているように思う。その上で、ライトが上にあるため店内に入っても明るくなりすぎることなく、落ち着いた雰囲気を醸し出している。

 

f:id:arumogina:20190929135015p:plain

 渋谷に突然あらわれる、田舎の夏の空間、都会のワールドと対象的であり、よく目立っていてよいと思う。

 

f:id:arumogina:20190929135317p:plain

アバターの色合いとブースの色合いが対照的でり、アバターがうまく目立っている。写真だとわかりずらいが背後に時計のギミックがありこれも素晴らしい。またアバターがかわいいアニメーションをしており、これも心をくすぐられる。

 

f:id:arumogina:20190929135518p:plain

ブースの壁が、折り紙のように動き、思わず注目してしまったブース。あの折り紙アニメーション、どうやって作ってるんだ?凄い。

f:id:arumogina:20190929140256p:plain

写真なのでわかりづらいが、アバター全てが激しく動いており、思わず目がいく

 

f:id:arumogina:20190929142329p:plain

図書館を模したシンプルなブースでワールドとマッチさせ、スポットライトで照らされた中でアバターアニメーションさせている。複数のアバターがいるにも関わらず全員が同じくらい目立っている。

 

f:id:arumogina:20190929142527p:plain

ブースとアバターの雰囲気がマッチしており、かつ、ブースは暗く、アバターは明るくすることでアバターがより目立つようになっている。

 

 

 

 

Vket3の感想-PretyPopParty

感想を書く前に、VKetを企画してくれたフィオ氏をはじめとするVKetの運営者達とVKetを盛り上げてくれた出店者達に感謝の意を示す。
素晴らしいイベントをありがとう。

 

ワールドごとに感想を述べていく。特に良かった部分や工夫を感じた部分などをワールド・アバター等の販売物・ブースの順にピックアップしていく。

 

+++ワールド
全体的に甘さと可愛さを散りばめたワールド
その中にもこのようなホラー要素が含まれており某魔法少女アニメの空間のようであった。

ワールド自体は外側を円形に回ったのち、城に入って一周すれば全て回れるので巡りやすい形状であった。ライトも全体的に明るくブースもみやすい。

f:id:arumogina:20190929100201p:plain

ワールドはPastelとvividの2種類があり、vividはPastelと位置や色合いが反転している。

f:id:arumogina:20190929102747p:plain

反転した世界は元の雰囲気を維持しつつも夜の街といった雰囲気

f:id:arumogina:20190929102932p:plain

訪問者を案内?するメッセージと蝶。

周囲の衝撃波のようなエフェクトはビルボードである。

f:id:arumogina:20190929101939p:plain

写真ではわかりずらいが、アイスクリームはテクスチャではなく動いてる。

f:id:arumogina:20190929102638p:plain

今にもこぼれそうな躍動感あるティーカップ

 

f:id:arumogina:20190929102122p:plain

f:id:arumogina:20190929102142p:plain

ただワールドがあるだけでなく、ワールドにストーリーが組み込まれているのにも工夫が感じられた。


+++アバター

f:id:arumogina:20190929103350p:plain

和風喫茶店の店員さんような子。ふんわりとした雰囲気がかわいい。

f:id:arumogina:20190929103425p:plain

販売物ではなくNPCであるがかわいかった。

 

f:id:arumogina:20190929103625p:plain

真ん中の子が一番好み

 

f:id:arumogina:20190929103804p:plain

ハーピィのような雰囲気を感じられる子。作者はプロモデラーらしくさすがのクオリティである

 

f:id:arumogina:20190929120452p:plain

f:id:arumogina:20190929104131p:plain

るんるんお!表情も豊かであり、vket3の中では個人的にトップ3に入る子。テレビの中に映るようにしてペデスタルを置く演出も面白い。

ブースもフォトグラメトリで取得したかのようなリアル感。ただペデスタルの位置が見にくいのは改善した方がいいと思った。アバターを茶の間に座らせればリアル寄りな空間の中にアバターがいるコントラストな構成になるので、もっと目立てたのではないかと思った。

 

f:id:arumogina:20190929104926p:plain

f:id:arumogina:20190929104943p:plain

写真が微妙であるが、mimonoちゃんのところのブース。普段使いに良さそうかつ、参考にしたくなるようなハイクオリティ

 

f:id:arumogina:20190929120138p:plain

アバターではないがアニメーション作成に非常に便利そうなツールだったので掲載

 

+++ブース

f:id:arumogina:20190929114444p:plain

学校の教室風ブース、アバターの日常が感じられて良い

 

f:id:arumogina:20190929114546p:plain

本から飛び出してきたような躍動感あふれるデザインが印象的

 

f:id:arumogina:20190929114701p:plain

アバターが店先?に立ってアニメーションで動かし訪問者を誘導しており、思わずブースの中に入りたくなる。アバター自体も目立っていて良いデザイン

 

f:id:arumogina:20190929114933p:plain

非常に賑やかなブースで思わず目に留まる。アバターとオブジェの間に隙間をあけ、周囲を取り囲むようにしているため、アバターがオブジェに隠れておらず配置がうまい

 

f:id:arumogina:20190929115239p:plain

お菓子の家のブース、ワールドの雰囲気にすごくマッチしている。

アバターの配置も見やすく店名も分かりやすい

 

f:id:arumogina:20190929115525p:plain

アバターも可愛いが、異空間から手が出てきている演出も面白い

 

f:id:arumogina:20190929115718p:plain

レイマーチで天井にショーツを描く技術の無駄遣い、しかし良い

 

f:id:arumogina:20190929115939p:plain

非常にシンプルだが、ポーズでアバターの可愛らしさを上手く表現出来ており、必要な情報全てがある。

 

f:id:arumogina:20190929120254p:plain

f:id:arumogina:20190929120315p:plain

非常に凝ったブース、雲の階段や薔薇の意匠が良い

shader カメラ前

Shader "Custom/viewjack" {
	Properties{
		_MainTex("MainTex",2D) = "white"{}
    _Length("Length",Range(0,10)) = 2
	}
	SubShader{
		Tags{"Queue" = "Transparent" "RenderType" = "Transparent" "DisableBatching"="true"}
		Blend SrcAlpha OneMinusSrcAlpha
		Pass{
			//ZTest always
			Cull Back
			CGPROGRAM
			#pragma vertex vert
			#pragma fragment frag
			#include "UnityCG.cginc"

			struct appdata {
				float4 vertex:POSITION;
				float4 uv:TEXCOORD0;
			};

			struct v2f {
				float4 pos:SV_POSITION;
				float4 uv:TEXCOORD0;
			};
      float _Length;
			sampler2D _MainTex;
			v2f vert(appdata v){
				v2f o;
        float4 cpos = mul(UNITY_MATRIX_MV,v.vertex);
        o.pos = mul(UNITY_MATRIX_P,float4(v.vertex.xy*2,-_Length,1));
				o.uv = v.uv;
				return o;
			}

			float4 frag(v2f i) :SV_Target {
				return tex2D(_MainTex,float4(i.uv.x,i.uv.y,0,0));
			}
			ENDCG
		}//Pass
	}//SubShader
	FallBack "Diffuse"
}

shader ワールド変換行列から変換後のローカル座標の軸を抽出したもの

http://marupeke296.com/DXG_No39_WorldMatrixInformation.html 参考

//n_vecはワールド変換後のローカル座標軸の方向を指す
float3 x_vec = float3(OTW._m00,OTW._m01,OTW._m02);
float3 y_vec = float3(OTW._m10,OTW._m11,OTW._m12);
float3 z_vec = float3(OTW._m20,OTW._m21,OTW._m22);
//各成分のスケール値
float x_scale = length(x_vec.xyz);
float y_scale = length(y_vec.xyz);
float z_scale = length(z_vec.xyz);
//回転したローカル座標系のZ軸のワールド座標系での角度
float3 nz = float3(0,0,1);
float zcos = dot(nz,z_vec)/(length(nz)*length(z_vec));
float z_rad = acos(zcos)*((z_vec.x>0)-(z_vec.x<0))*-1;

shader のプロパティの変数を生成するrubyスクリプト

引数にファイル名を入力して実行 ruby xxx.rb ....shader

    text_name = ARGV[0]
File.open(text_name) do |f|
  all_text = f.read#テキスト全体読み込み
  all_text.gsub!(/{\s*}/,"")
  p_text = all_text.match(/Properties\s*{(.*?)}/m)[0]
  puts "Debug Output Properties"
  puts p_text
  #xはフリーフォーマット表現、空白を無視する
  names = p_text.scan(/(_\w+?)\(/x)
  types = p_text.scan(/_\w+\(".+",(.+?)\)/x)
  names.flatten!
  types.flatten!
  i=0
  puts "---------------Result----------------"
  while(i<names.size) do
    name = names[i]
    kind = types[i].sub(/\(.+/,"")
    typ = ""
    case kind
    when "Color" then
      typ = "fixed4"
    when "2D" then
      typ = "sampler2D"
    when "Vector" then
      typ = "float4"
    when "Range" then
      typ = "float"
    when "CUBE" then
      typ = "samplerCUBE"
    else
      typ = kind.downcase
    end
    puts "#{typ} #{name};"
    i+=1
  end
end