2013-05-28 336 views
1

我遇到以下問題: 我有我的鼠標座標,我有一個模型(數據點),我想要我的鼠標座標的三維座標和我的lookAt這個座標的矢量,我可以用對象進行光線投射,以便我可以看到數據點的3d值。所以我想用鼠標點擊,然後我想看看我點擊的數據點的座標。將鼠標座標變換爲三維座標

我從教程中獲得以下內容,但它不起作用。光線起源和光線方向是不正確的(我畫我從射線方向和射線起源射線起源線是不是正確的? 誰能幫我這裏是代碼:

// Move the mouse cursor coordinates into the -1 to +1 range. 
pointX = ((2.0f * (float)mouseX)/(float) screen_width) - 1.0f; 
pointY = (((2.0f * (float)mouseY)/(float) screen_height) - 1.0f) * -1.0f; 


m_D3D->GetProjectionMatrix(projectionMatrix); 

pointX = pointX/projectionMatrix._11; 
pointY = pointY/projectionMatrix._22; 

// Get the inverse of the view matrix. 
m_Camera->GetViewMatrix(viewMatrix); 
D3DXMatrixInverse(&inverseViewMatrix, NULL, &viewMatrix); 

// Calculate the direction of the picking ray in view space. 
direction.x = (pointX * inverseViewMatrix._11) + (pointY * inverseViewMatrix._21)+ 
    inverseViewMatrix._31; 
direction.y = (pointX * inverseViewMatrix._12) + (pointY * inverseViewMatrix._22) 
    + inverseViewMatrix._32; 
direction.z = (pointX * inverseViewMatrix._13) + (pointY * inverseViewMatrix._23) 
    + inverseViewMatrix._33; 

// Get the origin of the picking ray which is the position of the camera. 
origin = m_Camera->GetPosition(); 

// Get the world matrix and translate to the location of the sphere. 
m_Impact->GetWorldMatrix(worldMatrix); 
//D3DXMatrixTranslation(&translateMatrix, -5.0f, 1.0f, 5.0f); 
//D3DXMatrixMultiply(&worldMatrix, &worldMatrix, &translateMatrix); 

// Now get the inverse of the translated world matrix. 
D3DXMatrixInverse(&inverseWorldMatrix, NULL, &worldMatrix); 


D3DXVec3TransformCoord(&rayOrigin, &origin, &inverseWorldMatrix); 
D3DXVec3TransformNormal(&rayDirection, &direction, &inverseWorldMatrix); 

// Normalize the ray direction. 
D3DXVec3Normalize(&rayDirection, &rayDirection); 

//collision_object->setTransform(col_matrix); 
    collision_model->setTransform(col_matrix); 
    float collision_point[3]; 
    //bool collision_result = collision_object ->rayCollision(rayOrigin, 
      rayDirection, true); 
    bool collision_result = collision_model ->rayCollision(rayOrigin, 
      rayDirection, true); 

      if(collision_result == true) 
    { 
     intersect = true; 
     //collision_object->getCollisionPoint(collision_point, true); 
     collision_model->getCollisionPoint(collision_point, false); 
     *coordX = collision_point[0]; 
     *coordY = collision_point[1]; 
     *coordZ = collision_point[2]; 



    } 

回答

1

一個簡單的方式來建立從鼠標線是如下(僞代碼)

獲取鼠標COORDS -1 - > 1米的範圍內(因爲你已經這樣做)

創建視圖投影矩陣(查看*投影) 反其道而行。

Creat e 2小鼠載體:

near = Vector3(mousex,mousey,0); 
far = Vector3(mousex,mousey,1); 

rayorigin = transformcoord(near, inverseviewprojection); 
rayend = transformcoord(far, inverseviewprojection); 
raydir = normalize(rayend-rayorigin);