前提
UNITYで、オブジェクトの中心からカメラに向かって伸びるように頂点が移動するシェーダーを作りたいです。
以下のコードを自分で作ってみたのですが、実際にはカメラ方向以外の向きへ変形してしまい、上手くいかない為、アドバイスを頂けると嬉しいです。
何卒宜しくお願い致します。
実現したいこと
コードを書いてやりたかった事
①オブジェクトの原点をワールド座標に合わせる
②オブジェクトの向きをワールド座標に合わせる
③オブジェクトの原点からカメラ方向へオブジェクトを引き延ばす
④オブジェクトの向きを元に戻す
⑤オブジェクトの原点を元に戻す
該当のソースコード
Shader "Unlit/AAA" { Properties{ } SubShader { Tags { "RenderType"="Opaque" } LOD 100 Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" struct appdata { float4 vertex : POSITION; }; struct v2f// { float4 vertex : SV_POSITION; }; v2f vert (appdata v) { //カメラとオブジェクトのワールド座標を設定 float3 C = UNITY_MATRIX_I_V._m03_m13_m23; float3 B = mul(unity_ObjectToWorld, float4(0,0,0,1)).xyz ; v2f o; o.vertex = mul( unity_ObjectToWorld, v.vertex ); //オブジェクトの原点をワールド座標に合わせる half4x4 VA = half4x4 (1, 0, 0, -B.x, 0, 1, 0, -B.y, 0, 0, 1, -B.z, 0, 0, 0, 1); o.vertex = mul(VA, o.vertex); //座標の回転1 half4x4 VB= half4x4 ((C.y-B.y)/ sqrt((C.x-B.x)*(C.x-B.x)+(C.y-B.y)*(C.y-B.y)), -(C.x-B.x)/ sqrt((C.x-B.x)*(C.x-B.x)+(C.y-B.y)*(C.y-B.y)), 0, 0, (C.x-B.x)/ sqrt((C.x-B.x)*(C.x-B.x)+(C.y-B.y)*(C.y-B.y)), (C.y-B.y)/ sqrt((C.x-B.x)*(C.x-B.x)+(C.y-B.y)*(C.y-B.y)), 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); o.vertex = mul(VB, o.vertex); //座標の回転2 half4x4 VC = half4x4 (1, 0, 0, 0, 0, -(C.z-B.z)/sqrt((C.x-B.x)*(C.x-B.x)+(C.y-B.y)*(C.y-B.y)+(C.z-B.z)*(C.z-B.z)), sqrt((C.x-B.x)*(C.x-B.x)+(C.y-B.y)*(C.y-B.y))/sqrt((C.x-B.x)*(C.x-B.x)+(C.y-B.y)*(C.y-B.y)+(C.z-B.z)*(C.z-B.z)), 0, 0, -sqrt((C.x-B.x)*(C.x-B.x)+(C.y-B.y)*(C.y-B.y))/sqrt((C.x-B.x)*(C.x-B.x)+(C.y-B.y)*(C.y-B.y)+(C.z-B.z)*(C.z-B.z)), -(C.z-B.z)/sqrt((C.x-B.x)*(C.x-B.x)+(C.y-B.y)*(C.y-B.y)+(C.z-B.z)*(C.z-B.z)), 0, 0, 0, 0, 1); o.vertex = mul(VC, o.vertex); //オブジェクトをカメラのほうへ引き延ばす o.vertex.x =o.vertex.x*0.001; //座標の回転2の反対 half4x4 WC = half4x4 (1, 0, 0, 0, 0, -(C.z-B.z)/sqrt((C.x-B.x)*(C.x-B.x)+(C.y-B.y)*(C.y-B.y)+(C.z-B.z)*(C.z-B.z)), -sqrt((C.x-B.x)*(C.x-B.x)+(C.y-B.y)*(C.y-B.y))/sqrt((C.x-B.x)*(C.x-B.x)+(C.y-B.y)*(C.y-B.y)+(C.z-B.z)*(C.z-B.z)), 0, 0, sqrt((C.x-B.x)*(C.x-B.x)+(C.y-B.y)*(C.y-B.y))/sqrt((C.x-B.x)*(C.x-B.x)+(C.y-B.y)*(C.y-B.y)+(C.z-B.z)*(C.z-B.z)), -(C.z-B.z)/sqrt((C.x-B.x)*(C.x-B.x)+(C.y-B.y)*(C.y-B.y)+(C.z-B.z)*(C.z-B.z)), 0, 0, 0, 0, 1); o.vertex = mul(WC, o.vertex); //座標の回転1の反対 half4x4 WB= half4x4 ((C.y-B.y)/ sqrt((C.x-B.x)*(C.x-B.x)+(C.y-B.y)*(C.y-B.y)), (C.x-B.x)/ sqrt((C.x-B.x)*(C.x-B.x)+(C.y-B.y)*(C.y-B.y)), 0, 0, -(C.x-B.x)/ sqrt((C.x-B.x)*(C.x-B.x)+(C.y-B.y)*(C.y-B.y)), (C.y-B.y)/ sqrt((C.x-B.x)*(C.x-B.x)+(C.y-B.y)*(C.y-B.y)), 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); o.vertex = mul(WB, o.vertex); //オブジェクトの原点を元に戻す half4x4 WA = half4x4 (1, 0, 0, B.x, 0, 1, 0, B.y, 0, 0, 1, B.z, 0, 0, 0, 1); o.vertex = mul(WA, o.vertex); o.vertex = mul( UNITY_MATRIX_VP,o.vertex ); //頂点座標をVP変換//ワールド座標→clip space return o; } fixed4 frag (v2f i) : SV_Target { return float4(1, 0, 0, 0); } ENDCG } } }
補足情報(FW/ツールのバージョンなど)
UNITYのバージョン:2021.3.5f1
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/11/28 00:53