collision_glass.cg
来自「游戏编程精粹6第中关于粒子的实时流体仿真系统,对入门的游戏开发者很有帮助.」· CG 代码 · 共 59 行
CG
59 行
//void main(float2 par_tri_coord : TEXCOORD0,
void main(float pindex : TEXCOORD0,
uniform samplerRECT attr_rect : TEXUNIT0,
//uniform samplerRECT tri_rect : TEXUNIT1,
uniform float4x4 mat_col,
uniform float4x4 mat_inv_col,
out float3 result : COLOR)
{
float stiff = 20000.0;
float damp = 128.0;
//float k = 10000.0;
//float k = 40000.0;
float radius = 0.004;
const float GLASS_R = 0.05;
const float GLASS_BOTTOM = -0.08;
const float GLASS_TOP = 0.08;
const float EPSILON = 0.000001f;
float4 pp = float4(f3texRECT(attr_rect, float2(pindex, 0)), 1);
float3 vel = mul((float3x3)mat_col, f3texRECT(attr_rect, float2(pindex, 1)));
float3 pos = mul(mat_col, pp).xyz;
float dist = GLASS_R - sqrt(dot(pos.xy, pos.xy));
// float dist = GLASS_R - distance(pos.xy);//sqrt(dot(pos.xy, pos.xy))
float diff = 2.0*radius - dist;
float3 col_force = float3(0, 0, 0);
if (diff > EPSILON)
{
float3 n = -normalize(float3(pos.x, pos.y, 0.0));
float vel0 = dot(vel, n);
col_force += (stiff*diff - damp*vel0)*n;
// col_force += max(k*diff - 64.0*vel0, 0.0)*n;
}
diff = 2.0f*radius - (pos.z - GLASS_BOTTOM);
// diff = 2.0f*radius - pos.z;// - GLASS_BOTTOM);
if (diff > EPSILON)
{
float3 n = float3(0, 0, 1);
float vel0 = dot(vel, n);//vec3_dot(&n, &sph->vel[i]);
col_force += (stiff*diff - damp*vel0)*n;
}
diff = 2.0f*radius - (GLASS_TOP - pos.z);
if (diff > EPSILON)
{
float3 n = float3(0, 0, -1);
float vel0 = dot(vel, n);
col_force += (stiff*diff - damp*vel0)*n;
}
result = mul((float3x3)mat_inv_col, col_force);
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?