Opengl c++;图形编程 我对C++ 3D是新的,所以我可能只是缺少一些明显的东西,但是我如何将从3D转换为2D(和对于给定的z位置)从2D转换为3D? < p>您将3D映射到2D通过。通过在向量的Z元素中插入适当的值,可以将2D映射到3D。

Opengl c++;图形编程 我对C++ 3D是新的,所以我可能只是缺少一些明显的东西,但是我如何将从3D转换为2D(和对于给定的z位置)从2D转换为3D? < p>您将3D映射到2D通过。通过在向量的Z元素中插入适当的值,可以将2D映射到3D。,opengl,graphics,directx,3d,Opengl,Graphics,Directx,3d,一个lame解决方案: ^ y | | | /z | / +/--------->x 角度是Ox轴和Oz轴之间的角度( #包括 类型定义结构{ 双x,y,z; }Point3D; 类型定义结构{ 双x,y; }点2D const double angle=M_PI/4;//可以更改 点2D*投影(点3D和点){ Point2D*p=新的Point2D(); p->x=点x+点z*sin(角度); p->y=点y+点z*cos(角度); 返回p; } 然而,网上有很多关于这方面的教程…

一个lame解决方案:

^ y
|
|
|  /z
| /
+/--------->x
角度是Ox轴和Oz轴之间的角度(

#包括
类型定义结构{
双x,y,z;
}Point3D;
类型定义结构{
双x,y;
}点2D
const double angle=M_PI/4;//可以更改
点2D*投影(点3D和点){
Point2D*p=新的Point2D();
p->x=点x+点z*sin(角度);
p->y=点y+点z*cos(角度);
返回p;
}

然而,网上有很多关于这方面的教程……你在谷歌上搜索过吗?

这是一个将光线从屏幕投射到平行于x-y且位于所需z位置的平面上的问题。然后你需要找出光线在平面上的碰撞位置。
这里有一个例子,考虑到screen_x和screen_y的范围为[0,1],其中0分别是最左侧或最顶部坐标,1分别是最右侧或最底部坐标:

Vector3 point_of_contact(-1.0f, -1.0f, -1.0f);
Matrix4 view_matrix = camera->getViewMatrix();
Matrix4 proj_matrix = camera->getProjectionMatrix();
Matrix4 inv_view_proj_matrix = (proj_matrix * view_matrix).inverse();
float nx = (2.0f * screen_x) - 1.0f;
float ny = 1.0f - (2.0f * screen_y);
Vector3 near_point(nx, ny, -1.0f);
Vector3 mid_point(nx, ny, 0.0f);
// Get ray origin and ray target on near plane in world space
Vector3 ray_origin, ray_target;
ray_origin = inv_view_proj_matrix * near_point;
ray_target = inv_view_proj_matrix * mid_point;

Vector3 ray_direction = ray_target - ray_origin;
ray_direction.normalise();

// Check for collision with the plane
Vector3 plane_normal(0.0f, 0.0f, 1.0f);
float denominator = plane_normal.dotProduct(ray_direction);
if (fabs(denom) >= std::numeric_limits<float>::epsilon())
{
    float num = plane_normal.dotProduct(ray.getOrigin()) + Vector3(0, 0, z_pos);
    float distance = -(num/denom);
    if (distance > 0)
    {
        point_of_contact = ray_origin + (ray_direction * distance);
    }
}
return point_of_contact
Vector3触点点(-1.0f,-1.0f,-1.0f);
Matrix4 view_matrix=摄像机->获取视图矩阵();
Matrix4 proj_matrix=camera->getProjectionMatrix();
Matrix4 inv_view_proj_矩阵=(proj_矩阵*view_矩阵).inverse();
浮动nx=(2.0f*屏幕x)-1.0f;
浮动ny=1.0f-(2.0f*屏幕y);
接近_点的矢量3(nx,ny,-1.0f);
矢量3中点(nx,ny,0.0f);
//获取世界空间中近平面上的光线原点和光线目标
矢量3射线源,射线目标;
光线原点=投影视图投影矩阵*靠近点;
光线目标=俯视图项目矩阵*中点;
矢量3射线方向=射线目标-射线原点;
光线方向。法线化();
//检查是否与飞机相撞
向量3平面_法线(0.0f、0.0f、1.0f);
浮点分母=平面法线点积(光线方向);
如果(fabs(denom)>=std::numeric_limits::epsilon())
{
float num=plane_normal.dotProduct(ray.getOrigin())+Vector3(0,0,z_位置);
浮动距离=-(num/denom);
如果(距离>0)
{
触点的点=射线原点+(射线方向*距离);
}
}
触点的返回点

免责声明:此解决方案取自Ogre3D图形库的各个部分。

最简单的方法是除以z。因此

screenX = projectionX / projectionZ;
screenY = projectionY / projectionZ;

这是基于距离的透视投影。问题是,它通常更好地使用,因为这简化了矩阵变换(一切都变成了乘法)。同样,这也是D3D和OpenGL使用的。了解如何使用非齐次坐标(即(x,y,z)坐标三元组)但是,对于使用着色器优化的事情,

将有什么帮助。

你要使用什么?为了利用硬件加速并处理大量的支持代码,你需要学习一个API。这不是C++问题。它是一个几何和矩阵数学问题,或者是关于粒子的问题。R库或API——但是C++中没有标准的3D图形API。最可能的是DirectX和OpenGL,虽然你可能处理一些更高层次的层,比如OGR3D。+ 1,但是你也可以做2D到3D的投影。你把你的2D图像定位在3D空间中,把你的结果平面定位在3D空间中,并选择你的投影细节。从一个投影到另一个。想象一下电影放映机,从2D电影框架投影到2D屏幕。结果取决于位置和类型(点/方向)对于光源,投影仪可能没有正确排列-胶片框架与屏幕不平行。虽然屏幕是二维的,但它仍然在三维空间中。哦-也许屏幕不是平面的,以便进行更有趣的二维到三维投影。@Steve:没错。我没有想到这些。
screenX = projectionX / projectionZ;
screenY = projectionY / projectionZ;