最近deepseek好像蛮火的 听说可以用它来辅助解决一些问题 虽然之前我装blender插件出的问题它一个也没解决 于是灵坤一动 想到说不定可以让它分析一下之前烂尾的cam文件 还真给它搞出来些东西 故开个帖记录一下方便交流研究 (本人能力有限 如有错误请见谅) (目前研究的成果是使用hxd将cam文件转16进制以后喂给ds后得来的 还好cam文件不大不会超出深度思考的长度)
零、准备工作 随便找一个cam 使用hxd打开如下 目前来说比较重要的就是图中三色框框中的部分 cam文件里每项占四个字节 可以直接硬修改 比让ds生成的python好用多了 它生成的放游戏里和空文件没有什么两样或者是我打开方式不对?
一、相机位置
相机位置修改目前来看是最简单的 在上图中 红框中是相机位置信息 0000000行0A-0d的部分是相机的x轴位置 0e-00000010行01是y轴位置 02-05是z轴位置 如图 图中为配合该cam的主城地板模型 模型原点在蓝色圆圈处 红色箭头代表x轴的正方向 绿色箭头代表z轴的正方向 y轴正方向是竖直向上的 图中蓝色线条代表相机平面 可以看出相机在z轴正方向上(绿色箭头方向)且距离较远 在x轴原点(红色箭头起点)差不多平过来的位置 同时在y轴上具有高度(否则相机就贴地了) 根据以上16进制字节还原十进制 可以看出x坐标为-43.33 y坐标为25.57 z坐标为198.01 与图中位置吻合 因此将十进制转为16进制即可修改相机位置(坐标原点为世界原点 与模型原点一致 16进制还原十进制部分见后文四)
二、相机旋转
相机旋转在开头图中蓝框与绿框两部分组成 其中绿框部分为主体 绿框中 前四字节为x分量 最后四字节为z分量 修改此二者可以进行相机的旋转 旋转后如果相机有偏转情况 可以由蓝框中最后四字节进行微调 此部分由于涉及到比较复杂的数学计算 可参考链接OpenGL(九) 摄像机_相机视角方向向量-CSDN博客或直接让ds进行运算(因为我还没找着方便的法子所以暂时没法写
三、fov及分辨率
此部分大概由于源码或引擎限制 修改fov无效 另外 帝国3原版估计为了适配不同的机器 将cam文件分为了普通分辨率及宽屏 以后缀widescreencamera作区分 因此同一个机位会对应两个cam文件 一个主城加上五个卡牌建筑总共是六个机位十二个cam 不过每个机位的两个cam共用一样的文件也可以运行 所以目前来说区分的意义不大了 该部分未做测试
四、16进制修改及ds参考截图
16进制转十进制可使用IEEE-754 浮点转换器(以下称网页一)以及在线字节大端序小端序转换工具(以下称网页二)工具进行转换 要注意的是 hxd中的代码是小端序(一种格式)需要先将十进制在网页一中转换 此时代码为大端序 再由网页二进行转换 即可在hxd中使用
附ds中各位置代码作用(参考用 不完全准确)版本一: 版本二:
由于本人不会编程与图形学 对文件的分析进度较缓 等鸡啄完了米 狗舔完了面以后慢慢补点知识再继续更新
由于学习了外网高人点拨 本贴获得了圆满成果 研究永远终止并附高人点拨内容如下 在此特别感谢discord的@Colors和@Chumbegue两位(不知道原方法出自谁 两位好像也是转述 顺便也对发现该方法的原作者致以敬意)

在经历了无数次崩溃和大量尝试之后,我终于搞明白了如何正确且自由地编辑家乡城市摄像机。首先,你依然需要大致遵循以下步骤。不过,在做任何事之前,去 "bin/startup/gamey.cfg" 文件,把里面的两个 WorldSize 都设为 0。这样就能正确加载家乡城市的“地图”,并实现无限移动。它甚至会自动加载家乡城市文件中设置的默认摄像机文件,所以你不需要通过控制台加载默认摄像机了。你甚至不再需要使用 lookAt 命令了。另外,记住使用 "shift+鼠标滚轮" 和 "ctrl+方向键" 来进行更多的摄像机移动操作。 将你要编辑的家乡城市重命名为 homecityspanish.xml(把原本的西班牙家乡城市改成别的名字)。 通过选项菜单(Options)进入控制台(Console)。 把控制台窗口调整到合适的大小。(它的默认大小能在UI文件里修改吗?) 输入命令 modeEnter("GCQuest"); 然后回车。 按 ` 键(波浪键)来开启和关闭控制台。 在控制台关闭的状态下,使用 Ctrl+左/右方向键 或 Shift+滚轮 来旋转,Ctrl+滚轮 缩放,Ctrl+上/下方向键 来调整俯仰角。调整到你想要的摄像机角度。 使用 loadCamera(string name); 和 saveCamera(string name); 来加载和保存摄像机。目录是 [游戏文档文件夹]\Scenario,例如,Documents\My Games\Age of Empires 3\Scenario。在你的字符串中不要包含文件扩展名(".cam")。
|