【FFXV】中物理模拟的结构以及游戏业界的乐趣

11月2日是在日本兵库县神户会议中心召开的【SIGGRAPH ASIA 2015】的第一天,在游戏开发专门的研究会【R&D in the Video Game Industry】上,展开了【FINAL FANTASY XV】的物理模拟的解说会议【Physics Simulation R&D at SQUARE ENIX】。

原文作者:西川善司

http://www.4gamer.net/games/075/G007535/20151104067/

负责演讲的 Witawat Rungjiratananon(SQUARE ENIX 动画研发工程师)

Rungjiratananon,是从东京大学加入了SQUAR ENIX的第2商务事业部,现在是SE的自研游戏引擎Luminous Studio和FFXV的物理模拟的设计和开发人员。Rungjiratananon在东京大学时以物理模拟和动画技术的专门研究为主,即便是同样的主题,学术界和游戏行业里独特和不同的部分也很多。因此这次演讲,感觉也是加入从学术界跳入到游戏业界的感想的同时,介绍FFXV开发项目中携带的技术,以独特的结构展开。

学术界和游戏产业界研究文化的不同

首先,Rungjiratananon是从学术界与游戏产业界的【研究开发的方式】的不同方面开始话题。

学术界,是选择要研究和解决的主题   ,在把研究结果用沦为来发表的【动机驱动】的世界。

学术界,是以目的驱动来进行研究开发的

另外一方面的游戏业界,开发中的团队是以想要做的表现为主题,为了实现一边参考已有的论文一边开发新的技术,是在游戏和游戏引擎中加入【成果驱动】的世界。虽然也有游戏业界的研究成果的论文发表,但发布论文并不是目的,最终还是以在游戏里实现为目的的。

游戏产业界中,是以成果驱动来进行研究开发的

Rungjiratananon提出,作为游戏业界特有的研究开发特征之一的,就是【美术设计师的存在】。

游戏业界的情况是,无论开发出多么优秀的技术,都是要有美术师来制作成果物的,如果引擎团队开放的新技术,美术师并不方便使用的话,就无法把结果反映到游戏里。因此,为了可以使用开发的新技术也需要配置方便使用的UI,为了满足美术师的要求而努力。

开发的新技术,要由美术师使用才能生效

另外,物理不正确也可以,能表现出想表现的内容就是“正义”这点,也是和学术界不同的部分。

游戏的话,为了可以看到效果,加入欺骗或造假也是允许的,与必须是物理正确的学术研究领域想比,是非常大的差异,

对资源限制的严格这个问题, 在游戏技术里也存在。游戏中,需要实时的运行开发的技术,CPU和GPU的演算资源,并不能全提供给这个技术使用。AI和图形,以及其他要素要共用计算资源。总之,开发的新技术,必须要在和其他使用计算资源的游戏要素一起运动时,也可以使用。

游戏业界的【新技术开发】,并不要求物理的正确,而是要有说服力,看起来足够好。

这样听的话,游戏业界的新技术开发,必须在各种各样的限制中来解决。

FFXV的布料模拟和毛发模拟

接下来的话题是,FFXV中导入的物理模拟,首先,Rungjiratananon对FFXV中的【布料模拟】(Cloth Simulation)进行了说明。

布料模拟,是基于顶点还是基于骨骼来实现,FFXV选择了后者

布料模拟的实现方法是,通常是生成对象的布料模型(例如衣服)的低多边形版本的模型,在顶点单位上进行模拟的方法。但是在FFXV里,为了把角色运动会翻弄布料的举动,在牺牲一些物理正确的同时,可以按照美术师的想法来运动,采用了在布料里加入骨骼的【基于骨骼的模拟】的方法。

采用这种方法的理由,Rungjiratananon解释是“SQUARE ENIX的美术师更习惯在3D模型里配置骨骼”。

美术师想要运动的要素,也要预先准备好

实际的FFXV中,把物理模拟的真实的结果,通过美术师以演出为主导来做Fake,取得运动平衡来表现,导入了像【0.0:软】,【1.0 硬】这样的骨骼运动的控制的正规化参数。另外,也加入了把实现准备好的手工制作的动画,与基于骨骼的物理模拟的结果做合成的方法。

把模拟的结果,通过美术师手动修改来取得表现平衡的结构也被导入了

毛发模拟也是,导入了很容易反映美术师表演意图的结构

关于毛发模拟,实现了头发随风的飘动,激烈的战斗动作中的摆动,这样柔软的毛发运动。另外,因为也有"角色特有形象"的漂亮发型不能破坏的“维持发型”的要求,和布料模拟一样,实现了通过骨骼来模拟毛发的运动的结构。

毛发是物理模拟来实现真实的摇摆,角色的发型不能崩坏。FFXV里,也需要对应美术师方面手动调整的要求。

同时支持模拟的毛发运动和头发风格的维持,在毛发上,导入了可以灵活控制的【柔软毛发的约束条件】和【坚硬的毛发的约束条件】来对应

实现了可以让毛发变得柔软或坚硬的灵活的系统。

使用这个系统,当角色接近静止状态时,要维持头发风格,毛发变得很硬,要漂亮的运动时,头发风格崩坏,更容易受到毛发模拟的控制。现实中的话,毛发是根据负荷移动和风力,不用关心发型的来运动,而游戏的情况是要重视角色的形象,优先漂亮的毛发运动而无视物理法则是很合理的。

根据角色的情况,变成【维持发型的硬的头发】或是【摇晃的柔软头发】

FFXV实现的风和草木的表现

FFXV,因为是以开放世界为舞台的游戏,【风】也是重要的表现要素。在FFXV中,通过带有【影像范围】【3D方向】要素的Wave函数,实现了关卡设计师可以在游戏世界的任意场所设定吹风的结构。

FFXV XV,是看不出是程序化(Procedural)实现的风的表现为目标

【设定Wave函数】的话,美术师制作设定数据很难。最后的方法,是在引擎团队开发了可以在关卡编辑器上绘制吹风情况的UI,提供给美术师使用。

只是设定Wave函数的话,美术师很难工作。

开发出用绘画UI的方式让美术师直观的设定风参数的结构

这样,通过这种结构实现的随风飘动的草木,最初一看的话是有枝叶和茎的,而实际是在板型多边形上贴了草木Texture的Billboard。

Billboard如何实现了【随风飘动】的表现?Rungjiratananon说明,是制作了用颜色的浓淡来表示【受风的影像的弯曲程度】的UI,通过视觉的来进行设定。设定的单位是顶点单位,对顶点颜色做设定。具体的,设置深色的顶点,更容易受到风的影响运动。

还有,Billboard随风飘动时,在可以设定伸缩的上限。风到什么强度,草木就不会伸展,设定了控制过度伸长的结构。

板型多边形表现的草木Billboard的随风飘动的情况和伸展控制,也可以通过绘制来设定。

还有,因为风的运动太有规则的话,看起来像作假的,在通过Wave函数生成风的强弱和方向上,导入了增加Noise的结构,使用【不规则的Texture】来给予风的强弱。例如用【V字形状分布浓淡的Texture】给予广阔草原上吹风的效果。可以做出草原在V字型上随风飘动的表现。

在Wave函数里加入Nosie,就增加了吹风的不规则性,尽管如此,还是有不足的情况。

为了表现立体的风的强弱,用浓淡Texture来设定强弱。通过这个,可以使用Texture给予的体积形状来让草木随风飘动。

回过头来,因为草木是用Billboard来表现的,看到的枝叶也实际是板型的多边形。虽然倾斜的飘动,板型多边形也会倾斜摇动,但草木产生的阴影没有变化。FFXV里,在对受风倾斜的草木Billboard做光照时,旋转草木Billboard的法线向量,也加入了扰动的动画。

随风飘动的草木阴影的复杂变化的表现,是通过法线的扰动和旋转来实现的。

完全是Fake的手法,因为法线方向是随着随风摇动的来扰动的,这样草木Billboard的光照条件每次都会变化,阴影也跟着变化。远处看的话,枝叶是以复杂的方向变化的,是相当好的方法。

研究者看到的【游戏业界快乐的地方】

Rungjiratananon在会议的最后,通过SQUARE ENIX中FFXV的开发,总结了【游戏业界快乐的地方】

Rungjiratananon所认为的,游戏业界快乐的地方

一个是在各种混合环境中进行开发,最新的大作游戏,是由物理和数学,AI和光学等等,各种各种的计算机科学组合而成,作为研究主题非常的有挑战性

另外,虽然基础方面还是有强硬派的科学技术,但通过这种的Fake和Trick,超越现实的【作出有很高说服力的假想世界】这点,也是游戏开发才有的魅力。

除此之外,“使用顶级美术师制作的高品位角色3D模型,进行各种技术的实验也很有意思”,“各个领域的优秀人才,拿出各自专业领域的知识,协力同一个内容制作的过程也很有意思”等等,很热情的讲述了SQUARE ENIX中工作的快乐。

时间: 2024-10-14 12:02:29

【FFXV】中物理模拟的结构以及游戏业界的乐趣的相关文章

JS中的运算符&JS中的分支结构

一.JS中的运算符 1.算术运算(单目运算符) + 加.- 减.* 乘./ 除.% 取余.++ 自增.-- 自减 >>> +:有两种作用,连接字符串/加法运算.当+两边全为数字时,进行加法运算: 当+两边有任意一边为字符串时,起连接字符串的作用,连接之后的结果为字符串 除+外,其余符号运算时,会先尝试将左右变量用Number函数转为数字 >>> /: 结果会保留小数点 >>> ++: 自增运算符,将变量在原有基础上+1: --: 自减运算符,将变量在原

第二十一篇:Linux 操作系统中的进程结构

前言 在 Linux 中,一个正在执行的程序往往由各种各样的进程组成,这些进程除了父子关系,还有其他的关系.依赖于这些关系,所有进程构成一个整体,给用户提供完整的服务( 考虑到了终端,即与用户的交互 ). 本文将详细描述 Linux 中的进程结构. 进程结构 上图所描述的是为了给用户提供一次完整服务( 需要处理用户IO等 )所涉及到的一个完整的进程结构,几个部分解释如下: 1. 控制进程 建立与终端连接的进程称为控制进程( 属于后台进程组之一 ) 2. 前台进程组 控制终端( 处理如Ctrl+C

OpenCV中图像的结构和区别

在OpenCV中,现在有很多种结构类型可以用来表示图像,它们之间有区别又有联系,现在记录一下它们之间的区别和相似之处,以便后面查看. 其中类型有: 1. Iplimage,2. Mat,3.CvMat, 4.CVArr: 其中: 1. IplImage: 较老版本的图像存储类型,在2.0之前使用: 2. CvArr: 也是较老的一种存储结构,是一种抽象的基类. 3. CvMat: 矩阵结构. 4. Mat:  新版本中使用的,推荐使用,是一个图像容器,基本上讲 Mat 是一个类,由两个数据部分组

JavaScript中的分支结构

说到JavaScript中的分支结构,我们就不得不提到流程控制这个词,我们所有的程序都是由数据和算法组成的.程序=数据+算法通常我们所说的算法都可以通过"顺序","分支","循环"三种结构来组合完成. 在ECMA中规定了一些语句(也称为流程控制语句,分支结构语句),从本质上来说,这些语句定义了ECMAScript中的主要语法,语句通常使用一个或者多个关键字来完成给定任务. 1.1 if 语句 if 语句 - 只有当指定条件为 true 时,使用该

深入解析 ObjC 中方法的结构

因为 ObjC 的 runtime 只能在 Mac OS 下才能编译,所以文章中的代码都是在 Mac OS,也就是 x86_64 架构下运行的,对于在 arm64 中运行的代码会特别说明. 在上一篇分析 isa 的文章从 NSObject 的初始化了解 isa中曾经说到过实例方法被调用时,会通过其持有 isa 指针寻找对应的类,然后在其中的 class_data_bits_t 中查找对应的方法,在这一篇文章中会介绍方法在 ObjC 中是如何存储方法的. 这篇文章的首先会根据 ObjC 源代码来分

Pjlib中的链表结构

Pjlib的链表结构跟常见的链表结构有所区别,如下图所示: ? ? ? ? ? ? 图1:一般链表结构 ? ? ? ? ? 图2:pjlib中的链表结构 可以看到一般的双向链表是链表节点包含数据域,而pjlib中是数据域包含链表节点.一般的链表指针域是链表结构的指针,而pjlib中是数据结构的指针.这种结构的优势我还没有体会到,可能要慢慢体会吧,但对链表头的理解却造成些许困惑.链表头是一个单独的list,而prev和next指向的是含有list的data结构,这种结构总让我觉得怪怪的. Pjli

C语言中的程序结构

C语言中的程序结构有三种,分别是顺序结构.选择结构和循环结构. 一.按照语句的先后顺序执行的程序结构,称为顺序结构. 下面以一个求三角形面积的例子进行说明,其代码如下: 例1.1 1 #include<stdio.h> 2 int main() 3 { 4 int width,height,s; 5 printf("请输入三角形的底宽:\n"); 6 scanf("%d",&width); 7 printf("请输入三角形的高:\n&q

PCIe 中的Capability 结构的寻址

PCI-X 和PCIe 总线规范要求其设备必须支持Capabilities 结构.在PCI 总线的基本配置空间中,包含一个Capabilities Pointer 寄存器,该寄存器存放Capabilities 结构链表的头指针.在一个PCIe 设备中,可能含有多个Capability 结构,这些寄存器组成一个链表,如下图所示. 其中每一个Capability 结构都有唯一的ID 号,每一个Capability 寄存器都有一个指针,这个指针指向下一个Capability 结构,从而组成一个单向链表

JS中的运算符和JS中的分支结构

JS中的运算符 1.算术运算(单目运算符) + .-.*. /. %取余.++自增 .--自减 +:两种作用,链接字符串/加法运算.当+两边全为数字时,进行加法运算:当+两边有任意一边为字符串时,起链接字符串作用, 链接之后的结果为字符串. 除+外,其余符号运算时,会先尝试将左右变量用Number函数转为数字: /:结果会保留小数点. ++:自增运算符,将变量在原有基础上+1: --:自增运算符,将变量在原有基础上-1: [a++和++a的异同] ①相同点:无论a++还是++a,运算完以后,a的