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

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

距離関数を使ったカメラとの当たり判定

 カメラが任意のBoxの形の中に入ってるか判定し、入っていれば箱の色を黒に、なければ白の半透明にしている。

 

Shader "Custom/BoxLengthJudge" {
	Properties{
		_MainTex("MainTex",2D) = "white"{}
		_Scale("Scale",Range(1,10)) = 1
		_Near("Near",Range(0,1)) = 0.3
	}
	SubShader{
		//透明部分のあるテクスチャを使う場合
		Tags{"Queue" = "Transparent" "RenderType" = "Transparent"}
		Blend SrcAlpha OneMinusSrcAlpha

		Pass{
			Cull Off
			CGPROGRAM
			#pragma vertex vert
			#pragma fragment frag
			#include "UnityCG.cginc"

			struct appdata {
				float4 vertex:POSITION;
			};

			struct v2f {
				float4 pos:SV_POSITION;
			};

			float _Scale;
			float _Near;
			float BoxLength(){
				float s = _Scale/2+_Near;//Boxサイズ=Scale/2,カメラのnearclip位置を考慮する必要あり
				float3 CuPos = mul(unity_ObjectToWorld,float4(0,0,0,1));
				float3 p = abs(CuPos.xyz-_WorldSpaceCameraPos) - float3(s,s,s);
				return length(max(p,0.0));
			}

			v2f vert(appdata v){
				v2f o;
				o.pos = UnityObjectToClipPos(v.vertex);
				return o;
			}

			float4 frag(v2f i) :SV_Target {
				if(BoxLength()<0.001){
					return float4(0,0,0,1);
				}
				return float4(1,1,1,0.4);
			}
			ENDCG
		}//Pass
	}//SubShader
	FallBack "Diffuse"
}