1,136
个编辑
更改
影子坐标
,创建页面
'''影子坐标'''是一种在Ballance制图人中描述产生影子的一个名词。影子坐标与物体(CK3dEntity)有关而与物体的网格(CKMesh)无关。而在稳定的产生影子的方法被发现后,所谓的影子坐标说法不合理,更准确的说法应该是影子属性(Property)或者影子标识(Flag)。为了前后兼顾,因此本文仍然采用影子坐标一词。
== 历史 ==
在早期的自制地图中,制图者已经注意到归入Shadow中的物件会产生影子,但是有些物件可以,有些不可以,在大量总结规律之后,得到如下结论:原版关卡的结构都可以产生,而自定义的结构不可以。之后便产生了影子坐标的说法,即:原版关卡的文件中,所有物体均已具有影子坐标,且复制已具有影子坐标的物体时,影子坐标可以被同时复制。并且制图者已经认识到影子坐标与物体相关而与网格无关,并通过切换原版物体关联的网格来强行让物体具有影子坐标,并在游戏中显示。
== 再发现 ==
2020年7月22日,[[yyc12345]]在制作完地图[[斯卡布罗集市]]之后一直念念不忘这种奇特的加影子的方式,希望探究影子到底是由什么引起的。
再发现的主要步骤是这样的:
# 打开一个原版关卡
# 从外界导入一个自定义物体(CK3dEntity)
# 选顶一个原版关卡物体(CK3dEntity)
# 将原版关卡的物体(CK3dEntity)对应的Mesh(CKMesh)关联到自定义物体(CK3dEntity)上
# 清理其余所有无用组件,然后保存
# 使用{{zh|Virtools SDK}}编写独立的Virtools播放器,尝试读取物体(CK3dEntity)的一些属性来比较两者的不同
比较的结果便是,两者的MoveableFlags不同,但是二者在Virtools 3.5环境下,通过遍历枚举VX_MOVEABLE_FLAGS所有可能的情况,发现两者完全一致,进一步研究之后发现原版物件(CK3dEntity)使用了一个不存在于Virtools 3.5中的VX_MOVEABLE_FLAGS中的标识。并且观察枚举VX_MOVEABLE_FLAGS,非常容易发现其并不连续,因此一个大胆的推论就是:影子使用了一个Virtools 3.5遗弃的VX_MOVEABLE_FLAGS标识来进行实现。
之后通过编写代码,为一些自定义物体加上此标识后,影子出现。也进行了许多额外的测试,包括将原版关卡中的物体的此标识去除观察影子是否消失来进行验证。
== 影子的实质 ==
影子坐标的实指就是一个VX_MOVEABLE_FLAGS中被遗弃的标识。在Virtools 2.1中起作用,而在Virtools 3.5中完全不可见。
这种实现方式也注定了不可能通过Virtools 3.5的原生操作来实现自主添加影子,只能被动地借用原版具有影子坐标的物体(CK3dEntity)来实现影子。但是可以通过VSL和Virtools SDK编写的脚本与插件来实现。
为物体加上影子的代码可以参见下文(C++):
<pre>obj = (CK3dEntity*)ctx->GetObjectByName("NAME");
DWORD objFlag = obj->GetMoveableFlags();
objFlag |=8;
obj->SetMoveableFlags(objFlag);
</pre>
此方法可稳定使物体具有影子坐标。
== 历史 ==
在早期的自制地图中,制图者已经注意到归入Shadow中的物件会产生影子,但是有些物件可以,有些不可以,在大量总结规律之后,得到如下结论:原版关卡的结构都可以产生,而自定义的结构不可以。之后便产生了影子坐标的说法,即:原版关卡的文件中,所有物体均已具有影子坐标,且复制已具有影子坐标的物体时,影子坐标可以被同时复制。并且制图者已经认识到影子坐标与物体相关而与网格无关,并通过切换原版物体关联的网格来强行让物体具有影子坐标,并在游戏中显示。
== 再发现 ==
2020年7月22日,[[yyc12345]]在制作完地图[[斯卡布罗集市]]之后一直念念不忘这种奇特的加影子的方式,希望探究影子到底是由什么引起的。
再发现的主要步骤是这样的:
# 打开一个原版关卡
# 从外界导入一个自定义物体(CK3dEntity)
# 选顶一个原版关卡物体(CK3dEntity)
# 将原版关卡的物体(CK3dEntity)对应的Mesh(CKMesh)关联到自定义物体(CK3dEntity)上
# 清理其余所有无用组件,然后保存
# 使用{{zh|Virtools SDK}}编写独立的Virtools播放器,尝试读取物体(CK3dEntity)的一些属性来比较两者的不同
比较的结果便是,两者的MoveableFlags不同,但是二者在Virtools 3.5环境下,通过遍历枚举VX_MOVEABLE_FLAGS所有可能的情况,发现两者完全一致,进一步研究之后发现原版物件(CK3dEntity)使用了一个不存在于Virtools 3.5中的VX_MOVEABLE_FLAGS中的标识。并且观察枚举VX_MOVEABLE_FLAGS,非常容易发现其并不连续,因此一个大胆的推论就是:影子使用了一个Virtools 3.5遗弃的VX_MOVEABLE_FLAGS标识来进行实现。
之后通过编写代码,为一些自定义物体加上此标识后,影子出现。也进行了许多额外的测试,包括将原版关卡中的物体的此标识去除观察影子是否消失来进行验证。
== 影子的实质 ==
影子坐标的实指就是一个VX_MOVEABLE_FLAGS中被遗弃的标识。在Virtools 2.1中起作用,而在Virtools 3.5中完全不可见。
这种实现方式也注定了不可能通过Virtools 3.5的原生操作来实现自主添加影子,只能被动地借用原版具有影子坐标的物体(CK3dEntity)来实现影子。但是可以通过VSL和Virtools SDK编写的脚本与插件来实现。
为物体加上影子的代码可以参见下文(C++):
<pre>obj = (CK3dEntity*)ctx->GetObjectByName("NAME");
DWORD objFlag = obj->GetMoveableFlags();
objFlag |=8;
obj->SetMoveableFlags(objFlag);
</pre>
此方法可稳定使物体具有影子坐标。