SuiTechLog

Unity,Arduino,RaspberryPiなど、モノづくり系を気ままに書き残すブログ。

Unity  弾をとばして、跳弾とかさせたい

※18/04/07:一部、デバッグ用レイ表示にミスがありましたので修正させていただきました。

質問

「弾をとばして、あたった面の角度によって跳弾させる処理とかできないか」という質問があったので考えてみました。ほかによさげな方法があれば教えていただければ幸いです。

 単純化のために直進する弾という前提で話を進めます。

 

・コライダー付きの弾を飛ばす作戦

 まず、コライダーを持たせたゲームオブジェクトを単純にまっすぐ飛ばすという考え方があります。これをすると、敵のコライダーにあたれば勝手に反射してくれるのである意味楽です。が、問題になるのは弾の速度が速すぎる場合のすり抜けです。

Unityの物理演算はフレームレートに関わらず

Edit=>Project Settings=>Time

のFixed Time Stepsによって何秒毎に行うか設定されています。(デフォルトは0.02秒毎)

続きを読む

Maya Python MELスクリプトの履歴を見て、Pythonに脳内変換する(Maya Python導入始めの方むけ)その1

Python導入したい

 よくMayaでは「Python使え使え便利だよ」って言われますが

Mayaのオペレーションの履歴(スクリプトエディタに表示されるあれ)ってMEL固定ですよね。

なので導入始めの方は、どうしてもMELから変換でてこずることがあります。

 

そこで、変換のルールを簡単に解説しようかと思います。

 

続きを読む

Maya Python print デバッグよりも楽なpdbデバッグ

Pythonデバッグ

普通のPythonでも使える技です。(標準機能です。)

Pythonデバッグするときは割とprintで値を表示したりすると思いますが

以下の方法がかなり楽でした。

import pdb; pdb.set_trace()

 

続きを読む

Maya Python カメラの画角はいずこ・・・

カメラの画角がアトリビュートエディタにあるのにとれない。というかこれはあくまで表示だけっぽいです。

 

そもそもMayaの場合、焦点距離にキーをうつことで画角を設定するのです。

というのも、これは、実物のカメラにあわせて

カメラアパチャ(フィルムサイズ)と焦点距離で、画づくり(画角を設定)をするためのようです。

 

というわけで、どうにかアパチャと焦点距離から画角求めたいのですが、アパチャアトリビュートがみつからない。と思ったらこんなところにありました。

 

続きを読む

Maya Python メモ 2 コマンドプロンプト実行・行列演算など

行列演算を行う(OpenMaya


#単位行列を生成
ident_mat = om.MMatrix()

#nodeの行列を取得する
import maya.api.OpenMaya as om
node_mat = om.MMatrix(cmds.getAttr(node+".matrix"))

#nodeを含めたワールド行列をもとめる
node_wmat = om.MMatrix(cmds.getAttr(node+".worldMatrix"))

#nodeの逆行列を求める
node_inv_mat = node_mat.inverse()

#行列演算を行う
cul_mat = ident_mat *node_mat

コマンドを実行する

#subprocess.check_outputを使用する
import subprocess
続きを読む

Unityのシェーダーを3dsMaxのビューポートシェーダーへ移植する その4 設定編

前回の続きです。

 

前回書き損ねていた点を追記します。

Normal画像読み込み設定

Normal画像を読み込むときは以下のGamma1の設定にオーバーライドします。

こうしないとNormal画像にガンマがかかって正しい凹凸がでません。

f:id:sui332015:20171211193137j:plain

 

続きを読む

シェーダー書きはじめTIPs(おもにUnity)

 最近は誰でもシェーダーが書ける時代になりました。処理を軽くするためのルールがあるようなのでそのいくつかをメモしておきます。(今後も増える予定です。)ピクセルシェーダー(フラグメントシェーダー)は1ピクセル毎に処理されるため、ちょっとの不手際で、爆発的に処理が重くなります。単純計算ですが、1920x1080の解像度の場合、1フレーム毎に2,073,600回、処理が走ることになります。1フレーム毎に1回実行されるUnity C#のupdate関数の比ではないです。

というわけでメモ。

 

Ifを使わない

If文は重い。というわけで以下を使います。

lerp(x, y, s)

xにはsが0の時に欲しい数値またはベクトル

yにはsが1の時に欲しい数値またはベクトル

sには1か0を入れます。

これによって、あたかもIF文かのような挙動を実現できます。

 

続きを読む

Unityのシェーダーを3dsMaxのビューポートシェーダーへ移植する その3 頂点シェーダー・フラグメントシェーダー

前回の続きです。

今回は頂点シェーダー部分とフラグメントシェーダー(ピクセルシェーダー)部分を3dsMaxへ移植するメモです。

 

頂点シェーダーでの処理の比較

頂点座標(プロジェクション空間)

Unity

UnityObjectToClipPos(v.vertex)
mul(UNITY_MATRIX_MVP, float4(v.vertex, 1.0))

上記二つは同じ意味で、頂点座標をカメラクリップ座標系(モデル座標系→ビュー座標系→プロジェクション座標系)へ変換します。これは以下で実装できます。

HLSL

float4x4 mvpMatrix : WorldViewProj; // Model*View*Projection 一番上で宣言
o.pos = mul(v.vertex, mvpMatrix);

 

続きを読む

Houdini メモ Alembicで書き出し Mirror Curveでパーティクル制御 その他

Alembicで書き出し(Apprenticeでは不可)

「ROP Alembic Output」ノードを使用します。

Vallid Frame Range で、書き出す範囲を指定して、Alembic Name でパスを指定、Render To DiskでAlembicファイルを書き出すことができます。

なお、ファイルフォーマットは汎用的なHDF5フォーマットと、Alembicに最適化されたOgawaから選べます。Ogawaの方が5~15%軽く、4倍から25倍速いとか書いてありました。

 

デフォルトで1ファイルで書き出されますが、ファイル名に$F4などと付けると連番ファイルとして書き出すこともできます。(無駄が多いので意味はありません。)基本的に3dsMaxなどのソフトに渡すときは1ファイルじゃないと読めないので注意。

 

なお、パーティクルや流体モデルなどトポロジが動的に変わるものでも書きだせるのでレンダリングのみ別のソフトへ持っていきたいときなどに、非常に重宝します。

 

モデルを反転コピーしたい。

「Mirror」ノードを使います。

 

続きを読む