sfm眼睛带viewtarget制作

要做眼睛,各位请做好被虐哭的准备。

本篇教程将由三部分构成:一、起源1的眼睛到底什么原理;二、正确的制作方法;三、一些小问题。

一、起源1眼睛的原理。

现在的游戏对眼睛的制作是通过对眼球骨进行骨骼约束,两个眼球骨都有个固定的人体外的骨骼,即目标骨骼,通过约束可以让眼球朝向目标骨骼。

但是起源1的操作让人迷惑:

首先,模型没有眼球骨骼,却有着眼球材质。

第二,眼球的权重被放置在头骨上。

第三,眼球不必须是个球体,可以是一个片,可以是半个球,可以是椭圆,总之什么都行。

第四,眼球被分成了眼白和虹膜,眼白不能动,虹膜可以在眼白上滑动。
在这里插入图片描述

第五,虹膜滑动不是真正的滑动,而是通过UV移动来假装虹膜的滑动,下面给大家上个示意图,大概就是这样,通过移动uv来让眼睛看起来好像是在转动,但其实并没有动。

在这里插入图片描述

第六,眼球材质与平常的贴图不一样,使用的眼球的专属材质,但是,这个专属材质在多年发展中自己也发生了变化,从”Eye”变成了”EyeRefract”,前者的着色器支持眼白和虹膜的贴图,而后者支持<环境光遮蔽纹理>、<envmap反射纹理>和<Cornea角膜纹理>。您也许觉得更新换代是好事,但是我要说的是,后者着色器的缺心眼设定是,模型材质<必须>提供上述三个纹理,否则就显示紫黑格子或者奇怪的反光,如下图所示。
在这里插入图片描述
正常⬆
在这里插入图片描述
缺少ssao⬆
在这里插入图片描述
缺少c
在这里插入图片描述
缺少env

然而大家也都深有体会,envmap从头到尾对自制模型作者一点也不友好,一个是很难自制envmap,另一个是envmap的版本问题会导致有的地方无法使用。环境光遮蔽贴图是3dmax的贴图烘培的产物,用于在静态光照中模拟模型上的阴影,而这个也是难制作,易出问题。也许您会觉得Cornea角膜纹理可能会好制作一点,那么我可以负责任的说,这个纹理简直是个反人类的贴图属性。一般来说,我们会使用蓝色调RGB贴图来作为法线贴图,但!Cornea角膜纹理使用红绿通道作为法线贴图,这是什么弱智操作?这还没完!蓝色通道和透明通道还会作为其他属性去应用,这让一张贴图承载一大堆作用还用反人类的通道做法线,简直就是吃饱了撑的,因此大可以放弃这个”EyeRefract”着色器,回到早期的”Eye”着色器去使用。
在这里插入图片描述

第七,UV滑动即可实现眼球假装转动,但是您需要在qc中写下一些特定属性,才能让模型编译过程中,为mdl模型生成处于模型中的一些隐藏的射线。这些射线的作用是,为引擎标注每个眼睛(可以多个眼睛)的根部位置,以及眼睛应该朝向的正方向。

在这里插入图片描述
在这里插入图片描述

此部分的原理是:1、眼球根部位置可以指定每个眼球的UV该如何旋转,大家都懂两点确定一条线,于是这种射线便由眼球根部射出到Viewtarget上,这个射线与眼球模型相交的地方便将UV的中心放到这里。2、标注eyeposition属性和attachment属性可以告诉眼睛应朝向的正方向,这个正方向作为一个向量,将与步骤1中的Uv变换相互呼应,将UV的形状进行拉伸,以显示正确的虹膜比例在非中心位置。(可能您会看不懂这部分,其实我也不懂,我只是通俗地解释了一遍,虽然解释的不特别准确,但是只要提供正确的位置信息,它就能正确运行,就是这么不讲道理,非常无语。)

在这里插入图片描述

第八,在您做好所有上述准备后,qc中还需要额外的属性才能让sfm正确识别眼球部分qc并创建viewtarget。这个额外属性是两个flex滑条,这个滑条部署在attachment属性提供的”eyes”上面,它们同时作为预设属性,可以通过滑条控制Uv的变化。非常重要的是,必须包含这两个属性才能在sfm中看到viewtarget,否则就没有。

二、正确的制作方法

下面进行准备以及制作眼睛的过程。(该过程使用一个我以前转模的模型制作)
在这里插入图片描述

*可以看到这个模型只有眼睛骨骼。*⬆

1、删除smd模型的眼睛骨骼
在这里插入图片描述

2、为眼睛网格指定新的材质,eyeball_l、eyeball_r
在这里插入图片描述

3、将眼睛网格权重指向头骨,此例子中头骨为bip_head
在这里插入图片描述

4、将眼睛网格重新展开UV(这步可能不用做也可以)
在这里插入图片描述

5、制作虹膜的独立贴图(包含alpha通道,遮蔽虹膜旁的纹理)
在这里插入图片描述
在这里插入图片描述

6、制作眼白的独立贴图(这里用纯白色代替)
在这里插入图片描述

7、把做好的贴图放到材质路径下
在这里插入图片描述

8、开始写vmt

"eyes"
{
	"$basetexture" "flu\HOK\Yao\50502_Yao\eyebase" //眼白
	"$iris" "flu\HOK\Yao\50502_Yao\iris" //虹膜
	"$halflambert" 1 //非必要-半伯朗照明
	"$nodecal" "1" //非必要-禁用子弹贴花
}

在这里插入图片描述
在这里插入图片描述

9、添加qc内容

Qc写法:
$model "medic" "medic.smd" {

	eyeball "eye_right" "bip_head" -1.2783 -3.6165 65.0663 "eyeball_r" 1 3 "iris_unused" 0.5
	eyeball "eye_left" "bip_head" 1.2783 -3.6165 65.0663 "eyeball_l" 1 -3 "iris_unused" 0.5
	//**下面是关于<smd>模型文件<!非常重要!>的说明:
	//smd模型<不能>包含眼球骨骼,<但>模型网格必须存在,<并且>眼球有UV,材质名为(material name),使用"EyeRefract"着色器
	//**下面是属性值的说明:
	//eyeball (name) (bone name) (X) (Y) (Z) (material name) (diameter) (angle) (iris material) (pupil scale)
	//name作用为匹配眼睑规则,只对eyelid属性有效
	//bone name是眼球模型的权重所在骨骼
	//***下面是眼球部分:
	//XYZ为眼球的世界中心位置
	//眼球模型的材质需要是(material name),且眼球的权重应全部为(bone name)
	//从正面看眼球的宽度比例。用于防止虹膜在头部内滚动。
	//(angle)为壁虎眼的角度,人类都有2~4度壁虎眼,为防止斗鸡眼
	//***下面是虹膜部分,可忽略学习:
	//(iris material)<已弃用>,用"iris_unused"代替
	//(pupil scale)虹膜纹理的比例

//必备flex
flexcontroller eyes range -22 22 "eyes_updown"
flexcontroller eyes range -22 22 "eyes_rightleft"
}

//眼睛后部的世界坐标
$eyeposition 0 0 70

//眼睛中心坐标
$attachment "eyes" "bip_head" 0.002 -3.6165 65.0652 absolute
//添加眼部中心位置到头骨上,absolute使用世界位置

步骤9的操作:
在这里插入图片描述

10、查看眼球位置,改qc中位置
在这里插入图片描述

由于您的模型可能不是X轴对称,请勿图方便只改一个、其他复制数字,一定要对应好才可以。分别是两个眼球的中心位置,两眼中间位置,两眼睛后部只有Z轴的位置。

11、导出修改后的smd模型并用crowbar打包

在这里插入图片描述

12、测试及修改模型

下图可以看到模型已经成功制作完毕了。
在这里插入图片描述
图2
在这里插入图片描述
移动viewtarget:
在这里插入图片描述
但是您可以看到一个问题就是虹膜太小,下面修改,增大虹膜比例。同时模型壁虎眼过大,把度数调小。
在这里插入图片描述
成果图如下,壁虎眼好很多,虹膜也比例正常了

在这里插入图片描述

三、一些小问题

1、注意您的模型不一定是X轴对称,请记得要对应好所有位置。

2、注意vmt使用eyes着色器

3、注意贴图指向和写法不要出错

4、注意添加qc时添加全,不要出现遗漏:eyeball、attachment、flexcontorll、eyeposition请全部包含

5、请注意眼睛网格权重放到头骨

6、请注意要删除眼睛骨骼

7、请注意要给眼睛指定单独的材质,例如:eyeball_l、eyeball_r

8、注意虹膜贴图文件的alpha通道。

9、qc中调整虹膜大小比例

10、如果因为vta读取问题导致打包错误,请用dmx格式文件或删除vta相关部分再次尝试。

11、生成的viewtarget可能会错误地驱动眼球UV变化,请注意qc中的正确位置填写

12、Blender或其他软件中查看位置时,一定注意您使用的是全局坐标 or 世界坐标。
在这里插入图片描述
13、左右眼的位置不要搞混了,而且<必须>先写右眼。

一些bug情况:

1、虹膜过小

在这里插入图片描述
2、qc中位置写错(因为这个模型是Y轴对称)

在这里插入图片描述
3、vmt使用eyerefract的问题

在这里插入图片描述

更新(2021-11-30 素材提供:科普莱bot)

经过科普莱大佬的测试后,发现了新的bug问题,即提供两个位置点(眼睛中心、眼睛中心正后方)不能达成正常效果,会造成眼睛的滑条出现错乱的问题。

为此科普莱大佬参考了【油管视频】 老外的教学,发现在

$attachment "eyes" "bip_head" 0.002 -3.6165 65.0652 absolute
//添加眼部中心位置到头骨上,absolute使用世界位置

这个地方仍需提供给 attachment 函数两个位置,即左眼和右眼的中心位置。具体写法如下图。

修改前
⬆修改前
修改后
⬆修改后

可以看到加了两个用绝对值absolute后缀的左眼和右眼的中心位置坐标,效果如下图所示。
康普来动图
左边为修复前,右边为修复后,操作为滑动eye_updowneye_leftright两个滑条。

最后让我们来看一下开心的康普莱。

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_44546865/article/details/119684499
SFM
今日推荐