DxLibのマウスを使った線分の当たり判定

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
いせすげr

DxLibのマウスを使った線分の当たり判定

#1

投稿記事 by いせすげr » 5年前

DxLibの3Dの当たり判定なんですが、FPSみたいにマウスを使用した線分を使って判定を取りたかったのですが、マウスの座標とゲーム内座標では大幅なずれが生じており、どのように解決すればいいかわからなかったので質問させていただきます。

線分の末端(EndPos)がマウスの位置ちょうどに来るようにしたいです。

多分Z座標のずれが問題だと思うのですが、それを直す術を知らないです。
よろしくお願いします。

コード:

// Source.cpp
#include"DxLib.h"

#define WINDOW_SIZE_X 1024
#define WINDOW_SIZE_Y 768

int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
	// ウィンドウモードで解像度を決定
	ChangeWindowMode(TRUE), SetGraphMode(WINDOW_SIZE_X, WINDOW_SIZE_Y, 32);
	// DxLibの初期化
	if (DxLib_Init() == -1)return false;
	// 描画先を裏画面に設定
	SetDrawScreen(DX_SCREEN_BACK);


	// ユーザー側で必要な物の初期化
	SetCameraPositionAndTarget_UpVecY(VGet(0, 0, 1000), VGet(0, 0, 0));
	SetCameraNearFar(0.f, 10000.f);

	int ModelHandle = MV1LoadModel("ita.mqo");
	MV1SetRotationXYZ(ModelHandle, VGet(90.0f * DX_PI_F / 180.0f, 0.f, 0.0f));
	MV1SetPosition(ModelHandle, VGet(0.f, 0.f, 0.f));
	MV1SetupCollInfo(ModelHandle, 0, 1, 1, 1);
	
	int x, y;
	VECTOR StartPos, EndPos;
	MV1_COLL_RESULT_POLY HitPoly;


	// ループ
	while (!ScreenFlip() && !ProcessMessage() && !ClearDrawScreen())
	{
		if (CheckHitKey(KEY_INPUT_ESCAPE) == 1)break;

		GetMousePoint(&x, &y);

		MV1DrawModel(ModelHandle);
		
		// Z軸をカメラと重ねるとラインが見えなくなるので-1してます。
		VECTOR StartPos = VGet(0, 0,999);

		// ここが問題っぽい 
		VECTOR EndPos = VGet(-x + WINDOW_SIZE_X / 2, -y + WINDOW_SIZE_Y / 2,-1);

		MV1_COLL_RESULT_POLY HitPoly = MV1CollCheck_Line(ModelHandle, 0, StartPos, EndPos);

		if (HitPoly.HitFlag == 1)
		{
			EndPos = HitPoly.HitPosition;
		}

		DrawLine3D(StartPos, EndPos, GetColor(255, 255, 0));

		DrawFormatString(0, 0, GetColor(255, 255, 255), "Hit:%d", HitPoly.HitFlag);

	}

	MV1DeleteModel(ModelHandle);
	DxLib_End();
	return 0;
}


“C言語何でも質問掲示板” へ戻る