2015-04-12 7 views
0

EDIT: решенный вопрос, см мой собственный ответDirectXMath Unproject на неправильной оси

Недавно я работал на 3D-редактор мира, который будет использовать сбор для подъема или опускания местности. Я использую камеру непроектирования и лучей, чтобы найти мировое положение координат экрана мыши.

Однако, похоже, что луч находится на неправильной оси. Насколько я помню, луч, который должен выйти из непроекта, должен быть прямо из камеры.

Here является примером того, как он выглядит в настоящее время.

Мой вопрос: почему луч над осью Y, когда он должен находиться над осью Z?

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; 
} 

Это unprojection код ..

И это, как я использую его

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; 
} 

Ура!

ответ

0

Глупость в стороне, я работаю как с инвертированной системой координат по оси Y, так и по умолчанию - без инвертированной - одной. Казалось, что это луч, ориентированный вертикально, но на самом деле это луч, который был ориентирован в направлении «/», в то время как предполагалось, что он ориентирован как «\». Умножение Y-составляющей результата на -1 позволило решить проблему.