Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从透视切换到正交,保持模型的视图大小和缩放相同_C++_Opengl_Glm Math_Perspectivecamera_Orthographic - Fatal编程技术网

C++ 从透视切换到正交,保持模型的视图大小和缩放相同

C++ 从透视切换到正交,保持模型的视图大小和缩放相同,c++,opengl,glm-math,perspectivecamera,orthographic,C++,Opengl,Glm Math,Perspectivecamera,Orthographic,我有fovangle=60,width=640和height=480的窗口,near=0.01和far=100个平面,我使用glm::perspective()得到投影矩阵 glm::透视图(glm::弧度(fov), 宽度/高度, zNear, zFar); 它工作得很好 然后我想将投影类型更改为正交,但我不知道如何正确计算glm::ortho()的输入参数。 我尝试了很多方法,但问题是在切换到正交投影后,模型对象的大小变成了另一个 让我有一个中心为(0.5,0.5,0.5)且长度为1的立方

我有
fov
angle=60,
width
=640和
height
=480的窗口,
near
=0.01和
far
=100个平面,我使用
glm::perspective()得到投影矩阵

glm::透视图(glm::弧度(fov),
宽度/高度,
zNear,
zFar);
它工作得很好

然后我想将投影类型更改为正交,但我不知道如何正确计算
glm::ortho()
的输入参数。 我尝试了很多方法,但问题是在切换到正交投影后,模型对象的大小变成了另一个

让我有一个中心为(0.5,0.5,0.5)且长度为1的立方体,相机的mEye为(0.5,0.5,3),mTarget为(0.5,0.5,0.5)且mUp为(0,1,0)。视图矩阵是
glm::lookAt(mEye、mTarget、mUp)
使用透视投影,效果很好。使用
glm::ortho(-width,width,-height,height,zNear,zFar)
my cube成为窗口中心的一个小像素。 我也尝试过实现这个变体 但结果(几乎)和以前一样

所以,第一个问题是如何计算正交参数来保存对象的原始视图大小/相机的位置?

还有,用

auto distance = glm::length(mTarget - mEye)
mEye = mTarget - glm::normalize(mTarget - mEye) * distance;

对ortho没有影响因此,第二个问题是如何在正交投影的情况下实现缩放?

附言。 我想我对ortho的理解是正确的。模型的比例并不取决于深度,但我仍然可以决定相机的位置,以便正确设置模型的大小和使用缩放。此外,我假设这是一项简单而琐碎的任务,例如,在开发3D查看器/编辑器等时。如果不是,请纠正我

如何计算正交参数以保存对象的原始视图大小/相机位置

在正交投影时,三维场景与二维视口平行投影。
这意味着投影到视口上的对象始终具有相同的大小,与深度(到摄影机的距离)无关

透视投影描述了从针孔相机的视野中看到的世界上的三维点到视口中的二维点的映射。
这意味着投影到视口上的对象会因其深度而变小

如果将“形式透视”切换为“正交投影”,则仅会在1个平面中显示对象,该平面与越冬孔平面(平行),并保持其深度。注意,平面是二维的,没有“深度”。这导致在切换投影时,三维对象永远无法“看起来”相同。但二维广告牌可以保持它的大小

透视投影的深度与大小之比是线性的,可以计算。它仅取决于视野角度:

float ratio\u size\u per\u depth=atan(glm::弧度(fov/2.0f)*2.0f;
如果要设置正交投影,使其保持一定距离(深度)的大小,则必须首先定义深度:

e、 g.到目标点的距离:

auto-distance=glm::length(mTarget-mEye);
投影可以这样设置:

float aspect = width / height
float size_y = ratio_size_per_depth * Z;
float size_x = ratio_size_per_depth * Z * aspect;

glm::mat4 orthProject = glm::ortho( -size_x, size_x, -size_y, size_y, 0.0f, 2.0f*distance );


如何在正交投影的情况下实现缩放

缩放正交投影的XY组件:

glm::mat4 orthProject=glm::ortho(-size\u x,size\u x,-size\u y,size\u y,0.0f,2.0f*距离);
浮标=2.0f;
orthProject=glm::scale(orthProject,glm::vec3(orthScale,orthScale,1.0f));

orthScale
设置一个值,放大时该值大于1.0,缩小时该值小于1.0。因此,第一个问题是如何计算正交参数以保存对象的原始视图大小/摄像机的位置-没有办法。透视投影描述了从针孔相机的视角看到的世界上的三维点到视口中的二维点的映射。正交投影平行投影。因此只能有一个平面(深度),其中透视投影与正交投影匹配。在链接的问题中,Z距离正好为100时执行切换。“如何在正交投影情况下执行缩放”更改x和y比例。