0

EDIT:問題を解決しました、私自身の答えを見てください

最近、ピッキングを使用して地形を上げたり下げたりする 3D ワールド エディターに取り組んでいます。カメラの非投影とレイ キャスティングを使用して、マウス スクリーン座標のワールド位置を見つけています。

ただし、光線の軸が間違っているようです。私が覚えているように、unproject から出てくるはずの光線は、カメラからまっすぐ出てくるはずです。

現在の外観の例を次に示します

私の質問は、Z 軸上にあるはずの光線が Y 軸上にあるのはなぜですか?

XMFLOAT3 D3D11Camera::Unproject(const float& px, const float& py, const float& pz)
{
    const XMFLOAT2& res = D3D11RenderSettings::Instance()->resolution();

    XMVECTOR coords = XMVector3Unproject(XMVectorSet(px, res.y - py, pz, 0.0f), 0.0f, 0.0f, res.x, res.y, near_plane_, far_plane_, projection_, view_, XMMatrixIdentity());

    XMFLOAT3 to_ret;
    XMStoreFloat3(&to_ret, coords);

    return to_ret;
}

これは、非投影コードです..

で、これが私が使っている方法です

projectRay: function()
{
    var p = Mouse.position(MousePosition.Relative);
    p.x = (p.x + RenderSettings.resolution().w / 2);
    p.y = (p.y + RenderSettings.resolution().h / 2);

    var unprojA = this._camera.unproject(p.x, p.y, 0);
    var unprojB = this._camera.unproject(p.x, p.y, 1);

    var dir = Vector3D.normalise(Vector3D.sub(unprojB, unprojA));
    var ray = Ray.construct(unprojA, dir);

    var p1 = ray.origin;
    var p2 = Vector3D.add(ray.origin, Vector3D.mul(ray.direction, 1000));

    RenderTargets.ui.drawLine(p1.x, p1.y, p1.z, 1, 0, 0, p2.x, p2.y, p2.z, 1, 0, 0);

    return ray;
}

乾杯!

4

1 に答える 1

0

愚かなことはさておき、私は反転された Y 軸座標系とデフォルトの (反転されていない) 座標系の両方を使用しています。縦向きの光線のように見えて、実は「/」の方向を向いているはずの光線でした。結果の Y コンポーネントに -1 を掛けると、問題が解決しました。

于 2015-04-12T16:32:01.283 に答える