1

我有以下问题:我有我的鼠标坐标,我有一个模型(数据点),我想要鼠标坐标的 3d 坐标和这个坐标的lookAt Vector,这样我就可以用对象进行光线投射,所以我可以看到数据点的 3d 值。所以我想用鼠标点击,然后我想查看我点击的数据点的坐标。

我从教程中获得了以下内容,但它不起作用。光线原点和光线方向不正确(我在光线方向上从光线原点绘制 I 线,并且光线原点不正确:有人可以帮我吗?这是代码:

    // 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];



    }
4

1 回答 1

1

从鼠标构建射线的一种简单方法如下(伪代码)

将鼠标坐标设置为 -1 -> 1 范围(就像你已经做的那样)

创建视图投影矩阵 (view*projection) 反转它。

创建 2 个鼠标向量:

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

rayorigin = transformcoord(near, inverseviewprojection);
rayend = transformcoord(far, inverseviewprojection);
raydir = normalize(rayend-rayorigin);
于 2013-06-08T13:09:24.880 回答