レイキャスティング計算に多くの問題があり、問題がどこにあるのか分かりません。私はDirectXのMathライブラリを使ってベクトルなどを作成しています。ここでDirectX11でのC++レイキャスティング
は、これまでの私のコードです:私は、正規化デバイス座標が正しいことを確認している
auto normalizedDeviceCoords = glm::vec2((float(a_frontend->GetMousePos().x)/float(a_frontend->GetWidth())) * 2.f - 1.f,
-((float(a_frontend->GetMousePos().y)/float(a_frontend->GetHeight())) * 2.f - 1.f));
auto mouseOrigin = DirectX::XMVectorSet(normalizedDeviceCoords.x, normalizedDeviceCoords.y, 0.0f, 1.0f);
auto mouseEnd = DirectX::XMVectorSet(normalizedDeviceCoords.x, normalizedDeviceCoords.y, 1.0f, 1.0f);
auto viewproj = DirectX::XMMatrixMultiply(a_frontend->GetViewMatrix(), a_frontend->GetProjMatrix());
auto determinant = DirectX::XMMatrixDeterminant(a_camera.ViewProj());
auto inverseviewproj = DirectX::XMMatrixInverse(&determinant, a_camera.ViewProj());
auto rayOrigin = DirectX::XMVector4Transform(mouseOrigin, inverseviewproj);
auto rayEnd = DirectX::XMVector4Transform(mouseEnd, inverseviewproj);
auto raySubtraction = DirectX::XMVectorSubtract(rayEnd, rayOrigin);
auto rayDirection = DirectX::XMVector3Normalize(raySubtraction);
auto planeNormal = DirectX::XMVectorSet(0.f, 1.f, 0.f, 0.f);
auto pointOnPlane = DirectX::XMVectorSet(0.f, -0.1f, 0.f, 0.f);
DirectX::XMFLOAT3 denominator;
DirectX::XMStoreFloat3(&denominator, DirectX::XMVector3Dot(planeNormal, rayDirection));
if (fabs(denominator.x) <= 0.0001f)
{
return;
}
auto pointMinusRay = DirectX::XMVectorSubtract(pointOnPlane, rayOrigin);
DirectX::XMFLOAT3 t;
auto almostT = DirectX::XMVector3Dot(pointMinusRay, planeNormal);
DirectX::XMStoreFloat3(&t, DirectX::XMVectorScale(almostT, 1.f/denominator.x));
if (t.x < 0)
{
return;
}
auto rayDirectionLength = DirectX::XMVector3Length(rayDirection);
auto rayPoint = DirectX::XMVectorAdd(rayOrigin, DirectX::XMVectorScale(rayDirection, t.x));
、線方向の長さも一つであり、かつ光線方向は、によって伝えるのは難しい(正しいように見えます数字だけ)。
すべての情報が役立ちます。私は既にスタックオーバーフローや他のフォーラムでいくつかの情報を見てきましたが、どこにもいませんでした。
平面上にある光線の点は、y軸上でのみ正しいことを忘れています(正しい-0.1です)。 xとzの位置は5でなければなりませんが、0.1です。 –
これらのテストで '' DirectXCollision.h''関数を試しましたか?また、 '' .cpp''ファイルで ''名前空間DirectX; ''を使うことを検討してください。 –
私はそのヘッダーをチェックして、そこに何らかの有用な機能がないかどうかを確認します。チャックに感謝します。しかし、私は前のプログラマーのスタイルをコーディングして、コードを流暢にしようとしています。 –