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建模学习工作室翻译整理,转载请标明出处!

posted on 2023-03-02 10:24  tuyg  阅读(104)  评论(0编辑  收藏  举报

导航