Unity3D实现3D立体游戏原理及过程

2016年03月03日 13:57 0 点赞 0 评论 更新于 2025-11-21 19:54

下面的教程是我今天整理的资料,将教大家一步步完成自己的3D立体游戏,并介绍一些3D成像的原理。理论上,每个普通的非立体3D游戏都可以改为3D立体游戏。看完这篇文章,你就可以把自己之前做过的3D游戏改为立体游戏。

我一直想尝试用Unity做3D立体游戏,昨天终于入手了一台3D显示器,并成功模拟出3D信号,呈现出3D效果。带上眼镜后的观看效果不错,个人感觉比一般的3D电影的立体效果还要强。

第一步:了解偏振式3D成像原理

偏振式3D成像是依据人眼成像原理发明的。人眼看到的景象具有立体感,是因为双眼所观察到的景象存在略微差别,这是由瞳距(两眼球之间的距离)导致观察物体的角度不同。

所谓偏振成像,就是将两幅不同偏振态的图像分别传送到双眼,每只眼睛只能看到其中一幅。我们用Unity制作3D游戏,实际上就是制作这两幅图像,也就是模拟3D信号。

第二步:了解现有硬件技术的作用及我们的任务

在3D显示器出现之前,若要制作3D立体游戏,可能只能用两台投影仪来实现3D效果。不过,现在的3D液晶显示器大多集成了一键转3D功能。这里的转3D功能指的是自动识别左右半宽的信号(一般不考虑上下信号),并将其融合,转换为偏振的3D信号,通过3D眼镜即可观看到3D效果。

当然,现在的3D显示器常宣传一键2D转3D功能,此功能并非前面所说的融合,而是显示器根据2D影像自动添加景深,生成左右两幅图像,实际上是伪3D。我试过,虽有略微效果,但并不理想。我们这里还是要制作真正的3D立体游戏。

了解到显示器能够自动融合左右图像后,我们只需模拟出左右半宽的图像即可。

第三步:如何用Unity3D模拟出3D信号

这是我们要完成的重点步骤。要模拟出真实的3D立体影像,首先需了解人眼成像原理。如第一步所述,因为人有两只眼睛,且两眼分开一定距离(大约150px),从而产生了距离感。

我们知道,Unity中的摄像机是模拟人眼的。通常在Unity中观察场景时,仅创建一个摄像机,这样就不会有立体感。若要模拟人眼,就需要创建两个摄像机。

首先,删除场景中原本存在的主相机,将创建的两个摄像机放置在同一平面,使其分开很小的距离,并且将角度调成一致。注意,这里是平视,而非往中间看,人的双眼也是平视向前的,这与焦距是不同的概念,切勿混淆。

至于两个摄像机的间距,需根据实际环境而定,该距离类似于人眼之间的距离。我们可以用自带的第一人称控制器来解释这个距离。导入第一人称控制器后,将这两个摄像机拖到第一人称控制器的摄像机下,作为子物体,然后关闭第一人称控制器自带的相机(将其 enabled 属性设为 false,即去掉 camera 组件的勾选)。将左右相机的位置设置如下:

  • 左相机:[此处应补充左相机具体位置信息]
  • 右相机:[此处应补充右相机具体位置信息]

对于第一人称控制器的大小而言,0.06的距离是够用的。之所以说够用而非正好,是因为距离稍大或稍小都是可行的。距离越大,景深越大,画面看起来更清晰,仿佛距离拉近了,但观看者会感觉更累。这很好理解,人的眼睛距离变大,就如同人变成了巨人,或者眼前的景象拉近,就像把手指从远处拉到眼前,当近到一定程度时,看手指会很吃力,甚至会出现重影,再近就会变成斗鸡眼。

若距离拉近,3D感会逐渐变弱,当两个相机重合时,就完全没有立体感了。所以,这个距离要根据具体的场景来确定。对于自带的第一人称控制器,若将其大小视为人体大小,那么它所在场景的比例就是固定的,此时的瞳距可根据你期望的效果来调整,具体可在显示器上进行测试。

当两个摄像机的距离确定后,如何将影像分开呢?由于我们使用3D显示器进行融合,因此无需考虑Unity的图像融合部分,只需将两个相机的影像分别以左右半宽的形式同时输出即可。使用 RenderTexture 是一个很好的解决方案。我们新建两个 RenderTexture,分别用于显示左右两个相机的视野。

将新建的两个 RenderTexture 放置在 plane 上,并将它们并排摆放,同时新建一个垂直摄像机,专门用于显示这两个 RenderTexture。这个摄像机就是我们最终看到画面所使用的相机,所以要将其 depth 值设置得高一些。

关于 RenderTexture,需要进行一些调整。将其 size 改为2048 1024,注意不要改为2048 2048,尽管这样会使画面更清晰,但会出现显示不全的情况。此外,此时两个 planescale 大小只有设置为2:1的比例,才不会出现图像变形,即 plane 的大小要与 RenderTexture 的比例一致,才能显示正常比例的内容。然而,我们需要的并非正常比例,只要融合后是正常比例即可。显示器的融合功能是将左右部分先放大到整个屏幕,再进行偏振融合,所以我们所需的3D信号是压缩一半之后的两个影像,因此将2:1的比例压缩后变为1:1,即 plane 的大小应为1:1的方形,这样在融合后才不会出现比例失真的情况。

大多数3D显示器的屏幕比例是1920 * 1080,即16:9,现在的3D视频分辨率大多也是这个比例,这样在全屏时就不会变形或出现黑边。若要使游戏全屏不失真,也需遵循这个比例(16:9)。当然,如果不全屏,就无法观看3D效果,因为左右半宽的窗体无法融合,3D显示器也无法识别这样的3D信号。

再回到 RenderTexture 的大小(分辨率)问题上。假如选择2048 2048,而 Game 窗口比例是16:9,Unity的 RenderTexture 为了显示1:1的比例,会将摄像机中间部分显示出来,而裁剪掉两侧内容,从而造成视野缺失。所以,应选择 size 为2048 1024。但这样又会出现新的问题,Game 窗口比例是16:9,即摄像机视野比例是16:9,比2048 * 1024(即2:1)的比例小,这会导致 RenderTexture 两侧多显示了一部分内容,而这部分内容不在左右相机的视野范围内,必须去除。去除的方法很简单,通过更改材质的UV值,让这两个 RenderTexture 显示的影像往中间偏移。经计算,偏移量为0.05555…,我们改变UV偏移:[此处应补充具体改变UV偏移的代码或操作步骤]

由于我们的摄像机视野是16:9,所以附有 RenderTextureplane 的两侧内容并不在我们的视野内,这样主相机显示的影像就只有左右相机的视野影像,不会包含其他内容。

至此,我们在Unity中关于3D方面的操作已基本完成,剩下的就是普通游戏的制作流程,只需将之前使用的相机替换为上面制作的两个相机即可。我们可以将这两个相机及其父物体导出为一个预制体,将看向 RenderTexture 的主相机和两个附有 RenderTextureplane 导出为另一个预制体,然后将这两个预制体导出为一个 package 包。这个 package 包就是一个将游戏转换为3D立体游戏的插件。若要将某个游戏转换为立体游戏,只需导入这个包,将两个预制体拖进场景,把相机替换为左右两个相机,然后导出游戏,就得到了3D立体游戏。

将导出的游戏(exe)打开,确保电脑连接好3D显示器,这样在选择比例时才会有1920 * 1080的选项。去掉 Windowed 的勾选,保证游戏全屏显示,导出设置中也可将默认设置为全屏。

打开游戏后,将显示器切换到3D模式,3D显示器一般在下面或侧面有按键,具备转换3D的功能键。打开后,戴上眼镜,就可以体验3D立体效果了!

最终效果及注意事项

最终呈现的效果:[此处可补充对最终效果的详细描述]

注意:若感觉立体效果不明显,可以适当拉开两个相机的距离。

来源:第三维度

作者信息

洞悉

洞悉

共发布了 3994 篇文章