トップページ > 記事閲覧
ある条件下でMV1SetPositionを実行したらMV1CollCheck_Lineの結果が正常に取得できない
名前:みこ 日時: 2024/11/10 12:32

いつもお世話になっております 表題の件ですが、 MV1SetPosition を実行後描画した3Dモデルの位置は反映されるのですが、 MV1CollCheck_Line の座標の判定が反映されません。 左右に動くオブジェクトにポインタを合わせるとポインタの色が変わるテストプログラムを作成しました。 Spaceキーを押したら3Dモデルが左右に移動しますが、ポインタの当たり判定が移動する前の状態になっていることが確認できるかと思います。 以下にプロジェクトを格納しています ttps://drive.google.com/open?id=11Qou4hbz9Sk62I_bYjcFzY7UF8wO66SX&usp=drive_fs お手数をお掛けしますが何卒よろしくお願いいたします。 // ここにサンプルプログラムをペーストしてください // 初期状態では LoadGraphScreen のサンプルプログラムが入力されています。 #include "DxLib.h" #include <string> // 視点の可動域(左右) #define CAM_MAX_H (3.14f / 2) #define CAM_MAX_UP (0.45f) #define CAM_MAX_DOWN (-0.3f) // カメラの角度変更速度 #define CAMERA_MOUSE_ANGLE_SPEED (0.0050f) /// <summary> /// 3D空間のカメラを設定 /// </summary> /// <param name="pos">カメラ位置</param> /// <param name="angle_h">カメラの向き(横)</param> /// <param name="angle_v">カメラの向き(縦)</param> static void CameraUpdate(VECTOR pos, float angle_h, float angle_v) { // カメラが映す手前距離と置く距離を設定 SetCameraNearFar(10.0f, 25000.0f); // カメラが向いている方向のベクトルを算出 VECTOR dir = { cos(angle_v), sin(angle_v), 0.0f }; float CosParam = cos(angle_h); float SinParam = sin(angle_h); float temp = dir.z * CosParam - dir.x * SinParam; dir.z = dir.z * SinParam + dir.x * CosParam; dir.x = temp; // カメラの注視点を算出 VECTOR target = VAdd(dir, pos); // カメラの設定を描画処理に反映する DxLib::SetCameraPositionAndTarget_UpVecY(pos, target); // カメラの画角を設定 SetupCamera_Perspective(1.0f); } int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { // ウィンドウ設定 const int screenX = 1280; const int screenY = 720; //SetFullSceneAntiAliasingMode(8, 8); SetWindowSizeExtendRate(1.0); ChangeWindowMode(TRUE); SetGraphMode(screenX, screenY, 32); SetWindowSize(screenX, screenY); SetDoubleStartValidFlag(TRUE); // 多重起動可に設定 SetUseHardwareVertexProcessing(TRUE); // ハードウェア頂点演算の使用 SetUseCharCodeFormat(DX_CHARCODEFORMAT_UTF8); SetWindowText(u8"テスト"); // DXライブラリ初期化処理 DxLib_Init(); // 描画範囲 SetDrawArea(0, 0, screenX, screenY); // Zバッファを有効化 SetUseZBuffer3D(TRUE); // アンチエイリアス機能付きの仮画面を作成する設定を行う SetDrawValidMultiSample(8, 8); // mv1読み込み int stage = MV1LoadModel("data/stage.mv1"); int drum = MV1LoadModel("data/drumcan.mv1"); bool Move = false; float angle_h = 0; // 視点(横) float angle_v = 0; // 視点(縦) int MouseOldX = 0, MouseOldY = 0, MouseX = 0, MouseY = 0, MouseMoveX = 0, MouseMoveY = 0; VECTOR pos = { 0, 0, -1450 }; int inversion = -1; // メインループ while (ProcessMessage() != -1 && CheckHitKey(KEY_INPUT_ESCAPE) == 0) { ClearDrawScreen(); // Spaceキーで移動切り替え if (CheckHitKey(KEY_INPUT_SPACE) == 1) { Move = !Move; } // ライト設定 { // ライティング計算を有効にする SetUseLighting(TRUE); // ピクセル単位のライティング SetUsePixelLighting(TRUE); // 標準ライトを無効にする SetLightEnable(FALSE); // 点照明 static int light = CreatePointLightHandle(VGet(-1250.0f, 2187.5f, 0.0f), 6022.728f, 0.636364f, 0.0f, 0.0f); SetLightDifColorHandle(light, GetColorF(1.0f, 1.0f, 1.0f, 1.0f)); // ディフェーズ(拡散光) SetLightSpcColorHandle(light, GetColorF(0.5f, 0.5f, 0.5f, 1.0f)); // スペキュラ(反射光) SetLightAmbColorHandle(light, GetColorF(0.0f, 0.0f, 0.0f, 1.0f)); // アンビエント(環境光) } // カメラ設定 { // マウス情報を格納 int GetX, GetY; GetMousePoint(&GetX, &GetY); MouseOldX = MouseX; MouseOldY = MouseY; MouseX = GetX; MouseY = GetY; MouseMoveX = MouseX - MouseOldX; MouseMoveY = MouseY - MouseOldY; // 視点移動 angle_h -= MouseMoveX * CAMERA_MOUSE_ANGLE_SPEED; angle_v -= MouseMoveY * CAMERA_MOUSE_ANGLE_SPEED; if (angle_h > CAM_MAX_H) angle_h = CAM_MAX_H; if (angle_h < -CAM_MAX_H) angle_h = -CAM_MAX_H; if (angle_v > CAM_MAX_UP) angle_v = CAM_MAX_UP; if (angle_v < CAM_MAX_DOWN) angle_v = CAM_MAX_DOWN; // カメラ設定 CameraUpdate({ -73.0f - 80, 176.0f, 278.0f }, 3.18f + angle_h, -0.2f + angle_v); } // ステージの描画 MV1DrawModel(stage); // オブジェクトの描画 { if (Move) { // x座標を移動 pos.x += 10 * (60 / GetFPS()) * inversion; // 移動方向を反転 if (pos.x > 1000 || pos.x < -1000) inversion *= -1; } MV1SetPosition(drum, pos); MV1DrawModel(drum); } // 当たり判定とポインター { std::string pointer_log = ""; // 当たり判定 画面の真ん中を基準にする auto line_start = DxLib::ConvScreenPosToWorldPos(VGet((screenX / 2), (screenY / 2), 0.0f)); auto line_end = DxLib::ConvScreenPosToWorldPos(VGet((screenX / 2), (screenY / 2), 1.0f)); // オブジェクト auto hit_drum = MV1CollCheck_Line(drum, -1, line_start, line_end); // ポインターの色は赤 当たり判定のフラグが立っていたら黄緑 unsigned int color = (hit_drum.HitFlag) ? 0x55ffff : 0xff0000; // ポインター描画 const int pointSize = 15; DrawLine((screenX / 2) - pointSize, (screenY / 2), (screenX / 2) + pointSize, (screenY / 2), color); DrawLine((screenX / 2), (screenY / 2) - pointSize, (screenX / 2), (screenY / 2) + pointSize, color); } // Move の値を出力 { std::string log = u8"Move(Spaceキーで切替): "; log += (Move) ? "true" : "false"; DrawString(10, 10, log.c_str(), 0xffffff); DrawString(10, 30, u8"真ん中のポインターがオブジェクトに触れると色が変わります", 0xffffff); } // 描画先を裏画面にする SetDrawScreen(DX_SCREEN_BACK); // 裏画面の内容を表画面に反映 ScreenFlip(); } DxLib_End() ; // DXライブラリ使用の終了処理 return 0 ; // ソフトの終了 }
メンテ

Page: 1 |

Re: ある条件下でMV1SetPositionを実行したらMV1CollCheck_Lineの結果が正常に取得できない ( No.1 )
名前:管理人 日時:2024/11/12 01:58

リファレンスが不親切ですみません、MV1SetPosition を行った後は MV1RefreshCollInfo でコリジョン情報を 更新しないと MV1CollCheck_Line などで行われる判定が座標移動後の状態なりません <MV1RefreshCollInfo> https://dxlib.xsrv.jp/function/dxfunc_3d_model_3.html#R9N3 MV1SetPosition の後に MV1RefreshCollInfo を呼ぶようにすると正常に判定できるようになりますので、よろしければお試しください m(_ _)m
メンテ
Re: ある条件下でMV1SetPositionを実行したらMV1CollCheck_Lineの結果が正常に取得できない ( No.2 )
名前:みこ(解決) 日時:2024/11/12 08:53

ありがとうございます! なるほどです、、無事解決できました!
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存