まず、角に外から衝突したときに押し出す場合では、

このように角を直接メタセコイアで丸める処理をすることで、そもそも角として判定させず、すり抜けを回避できました。
押し出し方法は、
・当たった壁のポリゴンの法線ベクトル方向に押し出す処理
・当たっている壁ポリゴンに垂直な方向にスライドする処理
をすることで押し出しています。
void StageWallCollision( stage *stage/*ステージの構造体*/, person *thing/*判定するものの構造体*/, MV1_COLL_RESULT_POLY_DIM *wall/*壁のポリゴン構造体*/ ) {
//ポリゴンと衝突していたら
if( wall->HitNum != 0 ) {
//ヒットしてるかどうかのフラグを初期化
stage->Hitflag = 0 ;
//進行フラグが立っていたら
if( thing->move_flag == 1 ) {
//ヒットしてるかどうかのフラグを立てる
stage->Hitflag = 1 ;
//ポリゴンの法線ベクトルを取得してスライド
for( int i = 0 ; i < wall->HitNum ; i ++ ) {
//衝突しているポリゴンの法線ベクトルを取得
stage->polyNormal = wall->Dim[ i ].Normal ;
//y方向の変数は初期化
stage->polyNormal.y = 0.0f ;
thing->move_vector.y = 0.0f ;
//横にスライドするベクトルを取得
stage->NorPmove_vector = CrossVector( thing->temp_move_vector , stage->polyNormal ) ;
stage->slide_vector = CrossVector( stage->polyNormal, stage->NorPmove_vector ) ;
//スライド処理
thing->x += stage->slide_vector.x ;
thing->z += stage->slide_vector.z ;
}
}
}else{
//衝突してない時は衝突フラグを回収
stage->Hitflag = 0 ;
//ポリゴンと衝突していないときは後始末を行う
MV1CollResultPolyDimTerminate( *wall ) ;
}
//衝突フラグが立っていたら
if( stage->Hitflag == 1 ) {
//法線ベクトル方向に移動量分押し出し
thing->x += stage->polyNormal.x * thing->move_speed ;
thing->z += stage->polyNormal.z * thing->move_speed ;
}
}
ポリゴン構造体はこちらです。MV1_COLL_RESULT_POLY_DIM 構造体
次にこのように内側からの押し出し処理をしようと思いました。

しかし、押し出し処理が多方向に複数発生し、通り抜けが発生します。
内側から角に当たった場合は違う処理をして押し出せば通り抜けは回避できる気がしますが、内側から衝突しているかどうかを区別するやり方が分かりません。
角との衝突処理の考え方が知りたいです。
DXライブラリのサンプルを参考にしようと思いましたが、注意書きに鋭角はダメとあるので参考にすることができませんでした。
説明が伝わりずらいかもしれませんがご回答してくだされば幸いです。
また、プログラムの書き方や他にも見落としている点などでダメな点がありましたらご指摘お願いします。
よろしくお願いします。