プログラムと入出力データが明らかでないとコメントし辛いですね・・・
公式のMV1CollCheck_GetResultPolyの使用例がちょうどいい感じだったのでC#で書き直しました。
ぱっと見た感じ正常に動いていると思いますがどうですか?
コード:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using DxLib = DxLibDLL.DX;
namespace DxLibSample {
public class CollCheckSample {
public void Run() {
int ModelHandle;
int Add, y, i;
DxLib.VECTOR SpherePos;
DxLib.MV1_COLL_RESULT_POLY_DIM HitPolyDim;
DxLib.MV1_COLL_RESULT_POLY HitPoly;
// DXライブラリの初期化
DxLib.ChangeWindowMode(DxLib.TRUE);
if (DxLib.DxLib_Init() < 0) {
// エラーが発生したら直ちに終了
//return -1;
return;
}
// 3Dモデルの読み込み
ModelHandle = DxLib.MV1LoadModel("SimpleModel.mqo");
// 3Dモデルを見える位置に移動する
DxLib.MV1SetPosition(ModelHandle, DxLib.VGet(320.0f, 300.0f, 600.0f));
// 描画先を裏画面に変更
DxLib.SetDrawScreen(DxLib.DX_SCREEN_BACK);
// モデル全体のコリジョン情報を構築
DxLib.MV1SetupCollInfo(ModelHandle, -1, 8, 8, 8);
// モデルの進行方向をセット
Add = 8;
// モデルの移動位置をセット
y = 0;
// ウインドウが閉じられるか何かキーが押されるまでループ
while (DxLib.ProcessMessage() == 0 && DxLib.CheckHitKeyAll() == 0) {
// 画面をクリア
DxLib.ClearDrawScreen();
// 3Dモデルの移動位置を上下に移動させる
y += Add;
if (y < 0 || y > 600)
Add = -Add;
// 3Dモデルの描画
DxLib.MV1DrawModel(ModelHandle);
// 当たり判定を行う球の位置をセット
SpherePos = DxLib.VGet(250.0f, y, 600.0f);
// モデルと球との当たり判定
HitPolyDim = DxLib.MV1CollCheck_Sphere(ModelHandle, -1, SpherePos, 100.0f);
// 球の描画
DxLib.DrawSphere3D(SpherePos, 100.0f, 8, DxLib.GetColor(255, 255, 0), DxLib.GetColor(255, 255, 255), DxLib.FALSE);
// 当たったかどうかで処理を分岐
if (HitPolyDim.HitNum >= 1) {
// 当たった場合は衝突の情報を描画する
// 当たったポリゴンの数を描画
//DxLib.DrawFormatString(0, 0, DxLib.GetColor(255, 255, 255), "Hit Poly Num %d", HitPolyDim.HitNum);
var polyCount = String.Format("Hit Poly Num {0:d}", HitPolyDim.HitNum);
DxLib.DrawString(0, 0, polyCount, DxLib.GetColor(255, 255, 255));
// 当たったポリゴンの数だけ繰り返し
for (i = 0; i < HitPolyDim.HitNum; i++) {
// 当たったポリゴンとの最近点の座標を描画
HitPoly = DxLib.MV1CollCheck_GetResultPoly(HitPolyDim, i);
//DxLib.DrawFormatString(0, 16 + 16 * i, DxLib.GetColor(255, 255, 255), "Position %f %f %f",
// HitPoly.HitPosition.x, HitPoly.HitPosition.y, HitPoly.HitPosition.z);
var text = String.Format("Position {0:f} {1:f} {2:f}", HitPoly.HitPosition.x, HitPoly.HitPosition.y, HitPoly.HitPosition.z);
DxLib.DrawString(0, 16 + 16 * i, text, DxLib.GetColor(255, 255, 255));
}
}
// 当たり判定情報の後始末
DxLib.MV1CollResultPolyDimTerminate(HitPolyDim);
// 裏画面の内容を表画面に反映
DxLib.ScreenFlip();
}
// DXライブラリの後始末
DxLib.DxLib_End();
// ソフトの終了
//return 0;
}
}
}