标签: perspectivecamera

如何调整 Three.js 透视相机的视野以适应球体?

我有一个以相机前面为中心的球体,其半径和距相机的距离已知。如何调整相机的视野 (FOV),使相机与任意视口大小内的球体精确匹配?

我正在寻找的角度的图像

这个答案是类似的,但我想调整FOV而不是相机的距离

trigonometry perspectivecamera three.js

6
推荐指数
1
解决办法
1443
查看次数

来自相同投影矩阵的不同基本矩阵

我使用两个投影矩阵P1和P2(例如我使用恐龙数据集),我需要计算基本矩阵F.所以我使用两个Matlab函数:

  • Peter Kovesi的职责:www.csse.uwa.edu.au/~pk/Research/MatlabFns/Projective/fundfromcameras.m
  • Zisserman:www.robots.ox.ac.uk/~vgg/hzbook/code/vgg_multiview/vgg_F_from_P.m

这些函数应该做同样的事情,但我有一个不同的F值!怎么可能?哪个是正确的功能?

如果在两个不同的图像中两个点X1和X2"相同",则X2 ^ T*F*X1 = 0 ...因此我通过使用SURF从两个旋转图像(5度)找到两个对应点,但是X2 ^ T*这两个版本的F*X1永远不会等于零.有任何想法吗?

相反,如果我使用此函数从匹配点计算F:

我有X2 ^ T*F*X1 = 0 ....显然F不同于两个FI与其他两个功能...

matlab computer-vision perspectivecamera projective-geometry projection-matrix

5
推荐指数
1
解决办法
1595
查看次数

OpenCV:使用solvePnP来确定单应性

在过去的几周里,我尝试学习纠正图像,并在这里的人们的帮助下,我已经设法更好地理解它.大约一个星期前,我设置了一个我想要纠正的测试示例(从上面查看图像).这个工作得很好(原:http://sitedezign.net/original.jpg和修正:http://sitedezign.net/rectified.jpg)与函数T = cv2.getPerspectiveTransform(UV_cp,XYZ_gcp)其中,T变为单应.

当我尝试使用真实世界的照片时,它失败了,因为真实世界的坐标在一个平面上并不完美(但是在空间的X,Y和Z坐标中测量的大约10个控制点).因此我决定使用solvePnP,并希望能够创建一个我可以使用的Homography.

我在测试示例中尝试了这个但没有得到我预期的结果:图像没有被纠正,我使用solvePnP计算的Homography不等于用getPerspectiveTransform计算的Homography.

我的代码:

# Set UV (image) and XYZ (real life)
UV_cp = np.array([[1300.0, 2544.0], # left down
                  [1607.0, 1000.0], # left up
                  [3681.0, 2516.0], # right down
                  [3320.0, 983.0]], np.float32) # right up

# Z is on 0 plane, so Z=0.0
XYZ_gcp = np.array([[0.0, 400.0, 0.0],
                    [0.0, 0.0, 0.0],
                    [300.0, 400.0, 0.0],
                    [300.0, 0.0, 0.0]], np.float32)

rvec, tvec = cv2.solvePnP(XYZ_gcp, UV_cp, K, D)
rotM_cam = cv2.Rodrigues(rvec)[0]

# calculate camera position …
Run Code Online (Sandbox Code Playgroud)

python opencv homography perspectivecamera

5
推荐指数
1
解决办法
3614
查看次数

OpenGL:投影视图空间与NDC的协调,结果似乎超出[-1,1]范围

我一直在尝试按照教程的指示实现屏幕空间环境光遮挡.我一直在解决我的实施问题,因为我遇到过它们,但这一次让我感到难过.

我对该方法的理解如下.环境遮挡因子由从与给定片段的法线对齐的半球内取得的样本确定.为了确定样本是否有助于环境遮挡因子,我必须根据视图空间深度纹理(包含在此帖子图像的左下角)检查视图空间中的样本深度.所以我知道从深度纹理中取出哪些坐标,我必须将样本的坐标从视图空间转换为规范化设备坐标(在[-1,1]范围内),然后转换到范围[0 ,1],因此深度纹理​​有效地"映射"到视口.

下面的图像是我的场景中的环境遮挡.我知道环境遮挡本身有一个相当明显的问题(我假设半球的方向不正确),我会及时处理,但是目前我的好奇心是"闭塞"的外观是什么',表明我从视空间样本坐标移动到纹理坐标的操作是不正确的.

在此输入图像描述

由于我缺少一个稳定的着色器调试器,我可以做的调试仅限于我可以渲染到屏幕上的内容.使用以下代码创建下一个图像,其中ndcs是给定样本的规范化设备坐标:

if (ndcs.x > 1.0f || ndcs.y > 1.0f || ndcs.x < -1.0f || ndcs.y < -1.0f)
{
  gl_FragColor = vec4(1.0f, 0.0f, 0.0f, 1.0f);
}
else
{
  gl_FragColor = vec4(vec3(1.0f), 1.0f);
}
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

我希望图像完全是白色的(或者更确切地说,我正在使用这个着色器的位),但是它似乎表明我正在创建的NDC在[-1,1]范围之外,我相信一定是不正确的.它也不是屏幕的一致区域,如下图所示,相机非常接近表面:

在此输入图像描述

我以前从未使用过这个程序来获取NDC,所以我确信我的逻辑在某处肯定是错的.我已经下载了教程提供的演示代码,但我无法看到代码的不同之处.我也在网上搜索过(包括在这个网站上)我似乎无法找到任何与我自己症状相同的人.

这是我的着色器的相关代码:

Vert Shader:

v_eye_space_position = u_mvpMatrix * a_position;
v_world_space_normal = normalize(u_rotationMatrix * a_normal);
v_eye_space_normal = normalize(u_mvpMatrix * a_normal);
gl_Position = v_eye_space_position;
Run Code Online (Sandbox Code Playgroud)

Frag Shader:

// --- SSAO Testing ---
// Convert from the noise texture back to [-1,1] range …
Run Code Online (Sandbox Code Playgroud)

opengl glsl perspectivecamera projection-matrix ssao

5
推荐指数
1
解决办法
207
查看次数

如何围绕物体旋转THREE.PerspectiveCamera

我正在制作这个程序,您可以在其中单击一个对象,缩放到它,然后通过按住鼠标右键并拖动从所有角度查看它.我需要相机绕过物体,而不是用相机看着它旋转物体.老实说,我根本不知道如何数学出来!

为了进行测试,我们已经选择并正在查看一个带有xyz的游戏对象

var g = new GameObject(500, 0, 0);//The game object with xyz
this.selected = g;//set selected to g

//Create and set the camera
this.camera = new THREE.PerspectiveCamera(45, w/h, 1, 10000);
this.camera.position.x = 0;
this.camera.position.y = 0;
this.camera.position.z = 0;

//set camera to look at the object which is 500 away in the x direction
this.camera.lookAt(new THREE.Vector3(this.selected.x, this.selected.y, this.selected.z));
Run Code Online (Sandbox Code Playgroud)

因此,相机和物体之间的半径为500,在选择和旋转时,相机应始终为500.

我在这里更新场景:

Main.prototype.update = function(){

    this.renderer.render(this.scene, this.camera);//scene is just some ambient lighting

    //what to do when mouse right is held down …
Run Code Online (Sandbox Code Playgroud)

javascript math rotation perspectivecamera three.js

5
推荐指数
1
解决办法
2万
查看次数

ARKit 透视校正

我正在处理一个项目,ARKit我正在尝试对 进行透视校正,ARFrame.capturedImage以将一张纸放在检测到的平面上,这样我就可以将其输入到一个CoreML模型中,该模型期望从头顶上直接拍摄图像。

ARKit给我相对于平面设备方向(ARCamera.transformARCamera.eulerAngles,和ARCamera.projectionMatrix所有看好)。

所以我有相机的方向(我知道平面是水平的,因为ARKit现在所有检测都可以检测到)..但我无法弄清楚如何创建一个GLKMatrix4将执行正确透视校正的。

最初我认为它会像通过 的倒数转换一样简单,ARCamera.projectionMatrix但这似乎根本不起作用;我不完全确定该矩阵描述的是什么......它似乎没有根据设备方向发生太大变化。

我试过使用GLKMatrix4Rotate和滚动/俯仰/偏航创建我自己的矩阵,但这不起作用..我什至无法使用单个旋转轴工作。

我发现GLKMatrix4MakePerspective, GLKMatrix4MakeOrtho, andGLKMatrix4MakeFrustum似乎可以进行透视变换,但我不知道如何获取我拥有的信息并将其转换为这些函数的输入以进行正确的透视变换。

编辑: 作为一个更好地解释我想要做什么的例子,我使用了Perspective WarpPhotoshop 中的工具来转换示例图像;我想知道的是如何提出一个矩阵,根据我对场景的了解,该矩阵将执行类似的变换。

在此处输入图片说明

3d opengl-es perspectivecamera ios arkit

5
推荐指数
1
解决办法
1157
查看次数

三.js透视相机+轨道控制如何获得当前的“缩放”级别?

我尝试在 Three.js 场景中检测当前的缩放级别(或类似的东西)。我的意思是通过鼠标滚轮动作应用的“缩放”(小车),例如:简单场景包含:透视相机 + 轨道控制 + 对象

1: `<= 测试在这里

controls = new THREE.OrbitControls( camera );
controls.dollyOut = function(){    }
controls.dollyIn = function(){    }

controls.addEventListener('change', renderlog); ....` 
Run Code Online (Sandbox Code Playgroud)

TNX

javascript zooming perspectivecamera three.js

5
推荐指数
1
解决办法
2625
查看次数

与消失点和地平线相关的 3D 对象的变换

我正在尝试从图片的消失点和地平线开始计算 3D 对象的精确预期变换。

起始图像

我想要的是,固定图片的消失点和水平线,我想根据我从图片开始设置的消失点和水平线旋转和倾斜3D对象

最终结果低于我的预期。

结束图像

我怎样才能得到这个结果?

我可以使用什么样的转换?

在这个视频中可以看到我想要的结果。

https://www.youtube.com/watch?v=EsSerR-AjEk

3d graphics perspectivecamera perspective camera-calibration

5
推荐指数
1
解决办法
2204
查看次数

THREE.js PerspectiveCamera focusLength 关闭两倍,与 FOV 不一致

在 THREE.js 中,我们使用以下函数构建了一个相机

const camera = new THREE.PerspectiveCamera(75, width / height, 0.1, 1000);
Run Code Online (Sandbox Code Playgroud)

我们从光学中知道,相机的视野与焦距通过以下等式有关

FOV = arctan(d/2f)
Run Code Online (Sandbox Code Playgroud)

其中FOV是以度为单位的垂直 FOV,d以毫米为单位的图像平面高度,以及以毫米f为单位的相机焦距。

阅读有关此事的文档后,似乎d默认设置为35mm / aspectRatio.

我们可以表达FOV这样的

FOV = arctan((35/(width/height))/2f) = arctan(filmHeight / 2f)
Run Code Online (Sandbox Code Playgroud)

作为健全性检查,我打印了以下值,以查看是否能取回75.

Math.atan(camera.getFilmHeight()/(2 * camera.getFocalLength())) * 180 / Math.PI;
Run Code Online (Sandbox Code Playgroud)

但是..这个值是 37.50000000000001

这恰好是 的预期焦距的一半75

所以,我想知道我是否在某个地方做错了数学,或者我是否误解了 THREE.js 报告的值。

javascript perspectivecamera three.js

5
推荐指数
1
解决办法
968
查看次数

视场+纵横比+从投影矩阵查看矩阵(HMD OST校准)

我目前正在研究增强现实应用程序.目标设备是光学看到的HMD我需要校准其显示器以实现虚拟对象的正确注册.我使用SPA的SPAAM实现来完成它,结果足够精确到我的目的.

我的问题是,校准应用程序在输出中给出了一个4x4 投影矩阵,我可以直接使用OpenGL作为示例.但是,我使用的增强现实框架只接受光学校准参数,格式为Field of View某些参数+ Aspect Ratio某些参数+ 4x4 View矩阵.

这是我有的:

错误格式校正校准结果:

 6.191399, 0.114267, -0.142429, -0.142144
-0.100027, 11.791289, 0.05604,   0.055928
 0.217304,-0.486923, -0.990243, -0.988265
 0.728104, 0.005347, -0.197072,  0.003122
Run Code Online (Sandbox Code Playgroud)

您可以在此处查看生成此结果的代码.

我所理解的是单点有源对准方法产生3×4矩阵,然后程序将该矩阵乘以正交投影矩阵以得到上面的结果.以下是用于生成正交矩阵的参数:

near : 0.1, far : 100.0, right : 960, left : 0, top :  540, bottom:  0
Run Code Online (Sandbox Code Playgroud)

正确格式的校准结果不正确:

Param 1 : 12.465418
Param 2 : 1.535465

 0.995903,   -0.046072,   0.077501,  0.000000   
 0.050040,    0.994671,  -0.047959,  0.000000
-0.075318,    0.051640,   0.992901,  0.000000
 114.639359, -14.115030, -24.993097, …
Run Code Online (Sandbox Code Playgroud)

opengl matrix aspect-ratio perspectivecamera

4
推荐指数
1
解决办法
4153
查看次数