Hi!

I achieved a similar effect some time ago and adapted it to your desires, but it is totally tricky and it just can be used at very particular cases.

It mixes two cameras, one for the background and one for the model, and makes the effect with the model cameras render targets alpha channel.

Click to reveal..

main.c
Code:
#include <acknex.h>

VECTOR vtemp;

MATERIAL *MAT_Camera =
{
	effect = "mixer.fx";
}

function main ()
{
	video_mode = 10;
	
	wait(2);
	level_load ( "level.wmb" );
	wait(3);
	
	BMAP *IMG_Model = bmap_createblack ( screen_size.x, screen_size.y, 32 );
	VIEW *CAM_Model = view_create ( -1 );
	CAM_Model.bmap = IMG_Model;
	set ( CAM_Model, SHOW | NOWORLD );
	
	BMAP *IMG_World = bmap_createblack ( screen_size.x, screen_size.y, 32 );
	VIEW *CAM_World = view_create ( -1 );
	CAM_World.bmap = IMG_World;
	set ( CAM_World, SHOW | NOENT );

	camera.flags |= PROCESS_TARGET;
	camera.material = MAT_Camera;
	MAT_Camera.skin1 = IMG_Model;
	MAT_Camera.skin2 = IMG_World;
	
	while ( !key_esc )
	{
		camera.pan += mouse_force.x;
		camera.tilt = clamp ( camera.tilt + mouse_force.y, -60, 5 );
		vec_set ( vtemp, vector ( -40, 0, 0 ) );
		vec_rotate ( vtemp, camera.pan );
		vec_set ( camera.x, vtemp );
		
		vec_set ( CAM_Model.x, camera.x );
		vec_set ( CAM_Model.pan, camera.pan );
		vec_set ( CAM_World.x, camera.x );
		vec_set ( CAM_World.pan, camera.pan );
		
		wait(1);
	}
	
	sys_exit ( NULL );
}



mixer.fx
Code:
texture mtlSkin1;
texture mtlSkin2;

sampler2D ModelSampler = sampler_state
{
   Texture = <mtlSkin1>;
   MipFilter = Linear;   
   AddressU  = clamp;
   AddressV  = clamp;
};
	
sampler2D WorldSampler = sampler_state
{
   Texture = <mtlSkin2>;
   MipFilter = Linear;   
   AddressU  = clamp;
   AddressV  = clamp;
};
	
float4 PS ( in float2 ScreenCoor: TEXCOORD0 ) : COLOR0
{
	float3 GlowColor = float3 ( 1.0f, 0.5f, 0.5f );
	float CoorYInv = 1.0f - ScreenCoor.y;
	float CoorXMid = ScreenCoor.x - 0.5f;
	float2 Coor = ScreenCoor;
	
	float4 BG = tex2D ( WorldSampler, Coor );
	float4 Model = tex2D ( ModelSampler, Coor );
	
	Coor.x = ( CoorXMid * ( 1.0f - ( 0.1 * CoorYInv ) ) ) + 0.5f;
	Coor.y += 0.01 * CoorYInv;
	float4 Glow1 = tex2D ( ModelSampler, Coor );
	
	Coor.x = ( CoorXMid * ( 1.0f - ( 0.2 * CoorYInv ) ) ) + 0.5f;
	Coor.y += 0.015 * CoorYInv;
	float4 Glow2 = tex2D ( ModelSampler, Coor );
	
	Coor.x = ( CoorXMid * ( 1.0f - ( 0.4 * CoorYInv ) ) ) + 0.5f;
	Coor.y += 0.02 * CoorYInv;
	float4 Glow3 = tex2D ( ModelSampler, Coor );
	
	float4 FinalColor;
	FinalColor.a = max ( (Glow1.a+Glow2.a+Glow3.a)*0.2, Model.a );
	FinalColor.rgb = ( ( Model.rgb * Model.a ) + ( CoorYInv * ( 1.0f - Model.a ) ) ) * FinalColor.a;
	FinalColor.rgb += BG.rgb * ( 1.0f - FinalColor.a ); 
	return FinalColor;
}

technique PostProcess
{
	pass p0
	{
		VertexShader = NULL;
		PixelShader  = compile ps_2_0 PS();
	}
}






Salud!