乐趣区

关于机器学习:Chai3D之相机视角

举荐:将 NSDT 场景编辑器 退出你的 3D 开发工具链

相机介绍

相机是 3D 可视化中的次要查看工具。它们被搁置在世界上并以独特的形式命名。场景中能够存在多个摄像机,每个摄像机都连贯到独自的视口(窗口)以向用户显示场景。相机能够查看固定指标,追随门路,或间接由触觉设施管制(例如模仿内窥镜)。本章探讨应用摄像机并将其连贯到窗口显示或视口的根本过程。

世界内的摄像机指向场景。近剪裁立体和远剪裁立体定义摄像机渲染的区域。

透视和正交相机

在上面的示例中,咱们在世界中创立并插入一个虚构摄像机。摄像机的地位、所需的指标点以及定义“向上”地位的矢量用于直观地定位和定向摄像机在场景中。也能够通过间接调整部分位置矢量和部分旋转矩阵来管制相机。请留神,相机也能够成为对象或触觉工具的子项。近和远 剪裁立体用于定义渲染对象的流动体积。位于剪裁立体之外的对象将被疏忽,因而不会渲染到显示视口。每个裁剪立体的地位都是在场景的以后单位中沿摄像机的眼帘测量的。确保“近”和“远”修剪立体都设置正确,并且以提供足够的深度缓冲区精度的形式设置十分重要。

using namespace chai3d;
// define a camera position
cVector3d position(1.0, 0.0, 0.5);
// define a target position
cVector3d lookat(0.0, 0.0, 0.2);
// define the orientation of the camera by a vector pointing upward
cVector3d up(0.0, 0.0, 1.0);
// position and orient the camera
camera->set(position, lookat, up);
// set the near and far clipping planes of the camera.
camera->setClippingPlanes(0.01, 10.0);

透视图和正交视图

正交投影或平行投影由不波及透视校对的投影组成。在这些投影中,不会调整与摄像机的间隔,这意味着屏幕上的对象无论间隔多近,都会显示雷同的大小。在 CHAI3D 中,正交视图是通过将要显示的环境的物理宽度调配给视口来定义的。

// set orthographic view by defining image width (2.0 meters for instance)
camera->setOrthographicView(2.0);

  只管正交投影可能很乏味,但透视投影会创立更真切的场景,因而这是您最常应用的场景。在透视投影中,当对象离观看者越来越远时,它在屏幕上会显得更小,这种成果通常称为透视缩短。

using namespace chai3d;
// set perspective view by defining the field of view angle
camera->setFieldViewAngleDeg(45);

正交视图显示没有透视的场景。模型中的所有直线彼此平行。透视视图显示场景,其中线条在地平线上汇聚。

渲染场景

在 3D 计算机图形学中,视口是指用于将 3D 场景投影和渲染到虚构摄像机地位的 2D 矩形。视口是屏幕的一个区域,用于显示要显示的总图像的一部分。用于定义视口显示的软件代码将始终特定于用于开发应用程序的操作系统或 GUI 框架。随 CHAI3D 提供的示例应用 FreeGLUT 框架。更高级的应用程序通常可能应用 Qt 框架。在这两种状况下,设置窗口和显示上下文都由显示管理器自身解决。从相机渲染视图只需调用相机的 render()办法即可。须要传递的最小参数是视区或窗口显示的宽度和高度(以像素为单位)。上面的清单阐明了来自 GLUT 窗口的典型显示回调。

using namespace chai3d;
// update shadow maps (if any)
world->updateShadowMaps(false, mirroredDisplay);
// render world
camera->renderView(windowW, windowH);
// swap buffers
glutSwapBuffers();
// wait until all GL commands are completed
glFinish();

平面渲染

平面视是双眼视力失常的人用双眼观看场景时感知到的深度印象。因为眼睛在头部的地位不同,双目察看场景会在两只眼睛中产生两个略有不同的场景图像。这些差别被称为双眼视差,提供了大脑能够用来计算视觉场景中深度的信息,提供了深度感知的次要伎俩。

两只眼睛(由圆圈示意)从不同的地位看到粗体金字塔。两个小金字塔代表两只眼睛看到的货色。对于平面视觉,图形系统应将两个小金字塔中的每一个出现给相应的眼睛。

因为咱们的两只眼睛程度相距,均匀相距约 65 毫米,所以每只眼睛对世界的认识略有不同。平面视觉的根底,即平面视觉(“固体视觉”),是两个视网膜图像中物体相应点之间的角度程度视差。当您凝视场景中的某个点时,您的眼睛会旋转或“收敛”,以将注视点带到每个视网膜的地方凹上。由注视点定义的深度“立体”的视网膜差别为零。物体上比注视点离您更远的点会在两个视网膜上产生具备正视网膜或未穿插视网膜视差的图像,由两个视网膜上地方凹的相应点的角度决定。同样,物体上的点比注视点更凑近您,则会产生具备负视网膜视差或穿插视差的视网膜图像。视网膜视差的体征和大小足以让视觉零碎确定物体绝对于注视点的深度。

应用计算机显示平面图像有两种突出的办法:被动和被动。CHAI3D 反对这两种办法,并具备许多可能的配置。

有源立体声

被动显示器通过在同一空间中左眼和右眼图像之间十分疾速地交替来运行。通常,这是以大概两倍于静止连续性(120Hz)所需的帧速率实现的。必须戴上非凡的眼镜能力观看这种办法。这些眼镜的镜片从不通明变为通明,与图像的变动齐全同步。仅当左侧镜头通明(右侧镜头不通明)时,才会显示左侧图像,反之亦然。要在 OpenGL 下应用有源四缓冲平面渲染,您须要装置反对它的专业级显卡,例如 NVidia Quadro 系列,Oxygen,Wildcats 等。

除了具备立体声性能的 OpenGL 显卡外,被动立体声还须要具备高刷新率(100-160 HZ)的显示器和连贯到视频输入 / 或立体声连接器输入的被动快门眼镜。代替计划包含头戴式显示器或具备立体声性能的投影仪。上面总结了为被动平面渲染而设计的典型硬件设置:1、3D 被动视觉眼镜(NVIDIA)2、Quadro 显卡(NVIDIA)3、20 Hz 显示器屏幕(华硕、三星)

在驱动程序的控制面板设置中,必须启用 OpenGL 立体声反对。以下是 Nvidia Quadro 卡的示例配置对话框:

配置 NVIDIA 卡以启用有源立体声。

在软件方面,必须配置显示上下文以启用四缓冲区反对,并且还必须在相机级别启用被动立体声。以下清单阐明了如何应用 GLUT 窗口显示配置流动立体声四缓冲区。例如,如果您应用的是 Qt,则通过 QGLFormat 描述符启用立体声。

using namespace chai3d;
// configure camera
camera->setStereoMode(C_STEREO_ACTIVE);
// configure GLUT display context
glutInitDisplayMode(GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE | GLUT_STEREO);

无源立体声 – 单显示器

显示平面图像的被动办法更适宜大群体,因为低廉的技术次要在显示器上,而不是每副眼镜上。概念很简略;将左眼和右眼同时投影到同一空间中,而后应用一套非凡的眼镜,将每个图像显示给其预期的眼睛,同时阻挡该眼睛的非预期图像。

应用偏光眼镜的被动式 3D 显示。

using namespace chai3d;
// configure camera
camera->setStereoMode(C_STEREO_PASSIVE_TOP_BOTTOM);
// configure GLUT display context
glutInitDisplayMode(GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE);

using namespace chai3d;
// configure camera
camera->setStereoMode(C_STEREO_PASSIVE_LEFT_RIGHT);
// configure GLUT display context
glutInitDisplayMode(GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE);

无源立体声 – 双显示

左眼和右眼图像通过独立通道同时传送到预期眼睛的零碎被称为空间多路复用。一种办法应用两个独自的显示监视器,每个监视器专用于两个图像中的一个。以后的一个零碎,立体立体镜,将一台显示器放在另一台显示器上方,采纳翻盖式配置,半镀银玻璃板将两个显示器之间的角度一分为二。能够看到下部监视器上的图像通过玻璃板传输,而上部监视器上的图像则从玻璃板上反射进去。两个监视器收回的图像是穿插偏振的,观察者戴着被动的穿插偏振眼镜,因而每只眼睛只能看到两个图像中的一个。这种类型的零碎的局限性是须要认真对齐两个显示器以准确记录两个图像,并且再次升高通过偏振玻璃传输的光的亮度。通常应用线性偏振,如果观察者将头部歪斜远离程度,则会导致重影。

立体立体镜平面显示器的操作图。

如果将图 1 中的两个金字塔放在相应的眼睛后面,则图片重叠,这使得平面视觉变得艰难和凌乱。B. 带有 4 面镜子的立体声设施容许别离绘制两个金字塔。镜子零碎确保每张照片都清晰地出现在相应的眼睛中。

using namespace chai3d;
// configure camera
camera->setStereoMode(C_STEREO_PASSIVE_DUAL_DISPLAY);

平面相机设置

对于平面视觉的任何分支,平面窗口的概念都很重要。如果通过窗口查看场景,则整个场景通常位于窗口前面:如果场景间隔较远,则在窗口前面肯定间隔;如果它在左近,它看起来就在窗外。比窗口自身小的对象甚至能够穿过窗口,局部或齐全呈现在窗口后面。这同样实用于比窗口小的较大对象的一部分。

设置立体声窗口的目标是复制此成果。

要真正了解窗口调整的概念,有必要理解平面窗口自身的地位。在投影平面(包含“3D”电影)的状况下,窗口将是屏幕的外表。对于印刷资料,窗口位于纸张外表。当通过观察者看到平面图像时,窗口位于帧的地位。在虚拟现实的状况下,随着场景变得真正身临其境,窗口仿佛隐没了。

对于配对图像,将图像进一步离开会将整个场景移回,将图像移近将向前挪动场景。请留神,这不会影响场景中对象的绝对地位,而只会影响它们绝对于窗口的地位。相似的原理实用于浮雕图像和其余立体观察技术。

在决定场景绝对于窗口的搁置地位时,有几个注意事项。首先,在理论物理窗口的状况下,左眼将看到较少的场景左侧,右眼将看到较少的场景右侧,因为视图局部被窗框遮挡。这个准则被称为“右边少右边”或 3L,在调整立体声窗口时常常用作领导,其中所有对象都呈现在窗口前面。当图像进一步挪动时,外边缘被裁剪雷同的量,从而复制窗口框架的成果。

另一个注意事项波及确定各个对象绝对于窗口的搁置地位。理论窗口的框架局部重叠或“切断”窗口前面的对象是失常的。因而,平面窗口前面的对象可能会被平面窗口的框架或侧面局部切断。因而,立体声窗口常常被调整为将被窗户隔断的物体搁置在窗户前面。如果一个物体或物体的一部分没有被窗户切断,那么它能够放在它的后面,并且能够在思考到这一点的状况下调整平面窗口。这种成果就是剑、虫子、手电筒等。在 3D 电影中常常“从屏幕上隐没”。

如果将被窗户切断的物体放在它后面,则会产生一种成果,这种成果有些不天然,通常被认为是不受欢迎的 – 通常称为“窗户违规”。这能够通过回到理论物理窗口的类比来最好地了解。窗前的物体不会被窗框切断,而是持续向右和 / 或向左。这在虚拟现实以外的平面摄影技术中无奈复制,因而通常会调整平面窗口以防止违反窗口。然而,在某些状况下,它们能够被认为是容许的。

第三个思考因素是观看舒适度。如果窗口向后调整得太远,场景远处的左右图像可能相距 2.5 英寸以上,这须要观众的眼睛发散能力交融它们。这会导致图像加倍和 / 或观看者不适。在这种状况下,有必要在观看舒适度和防止窗户违规之间做出折衷。

在平面摄影中,窗口调整是通过挪动 / 裁剪图像来实现的。在其余模式的立体观察中,例如图纸和计算机生成的图像,该窗口在生成图像时内置于图像的设计中。这是设计使然,在 CGI 电影中,某些图像位于屏幕前面,而其余图像则在屏幕前。

3D 建模学习工作室翻译整顿,转载请表明出处!

退出移动版