解析PS2游戏存档3D图标

这篇具有很好参考价值的文章主要介绍了解析PS2游戏存档3D图标。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

解析PS2游戏存档3D图标,粗茶淡饭 代码为伴,游戏,3d,python

看到这个图片,对于熟悉PS2的老玩家来说应该不会陌生。它是PS2记忆卡管理界面中的游戏存档3D图标。本篇文章我们将介绍如何从存档文件里解析出这个活动的小人。

01 解析目标

A:我们能从存档文件中解析到什么?

  • 图标模型的所有顶点、法线
  • 图标模型的动作帧
  • 光照
  • 纹理及纹理坐标
  • 背景颜色及透明度

B:我们需要做什么?

  • 编写着色器渲染背景和图标
  • 将图标模型的动作帧组成动画
  • 构建模型矩阵、视图矩阵、透视矩阵,使显示接近PS2原生效果

完成整个功能估计需要两篇文章,本篇主要介绍A。

02 解析icon.sys

上一篇我们介绍了如何导出游戏的存档文件,事实上每个存档里都会有一个icon.sys的文件,这个可以看作图标的配置文件。icon.sys是一个固定大小(964字节)的文件,其结构如下:

offset length description
0 byte[4] magic:PS2D
4 uint16 0
6 uint16 游戏标题换行符所在位置,注1
8 uint32 0
12 uint32 bg_transparency,背景透明度,0-255
16 uint32[4] bg_color,背景左上角颜色(RGB-,0-255)
32 uint32[4] bg_color,背景右上角颜色(RGB-,0-255)
48 uint32[4] bg_color,背景左下角颜色(RGB-,0-255)
64 uint32[4] bg_color,背景右下角颜色(RGB-,0-255)
80 uint32[4] light_pos1,光源1(XYZ-,0-1)
96 uint32[4] light_pos2,光源2(XYZ-,0-1)
112 uint32[4] light_pos3,光源3(XYZ-,0-1)
128 uint32[4] light_color1,光源1颜色(RGB-,0-1)
144 uint32[4] light_color2,光源2颜色(RGB-,0-1)
160 uint32[4] light_color3,光源3颜色(RGB-,0-1)
176 uint32[4] ambient,环境光(RGB-,0-1)
192 byte[68] sub_title,游戏标题(空字符结尾, S-JIS编码)
260 byte[64] icon_file_normal,普通图标文件名(空字符结尾),注2
324 byte[64] icon_file_copy,拷贝图标文件名(空字符结尾),注2
388 byte[64] icon_file_delete,删除图标文件名(空字符结尾),注2
452 byte[512] 全0

注1:游戏标题sub_title显示为2行,该值即为在标题的第几个字节换行,如图:

解析PS2游戏存档3D图标,粗茶淡饭 代码为伴,游戏,3d,python

注2:每个游戏存档可以对应3个图标icon文件,分别在不同场景显示。

可以看到icon.sys文件里主要提供了背景、光照等数据,另外一个比较重要的部分是3d图标所在的文件名。

03 解析icon文件

不像icon.sys文件,每个游戏的icon文件是不确定的,大小不确定,数量也不确定,但至少会有1个。有的游戏拷贝图标和删除图标与普通图标共用一个图标。

3.1 文件结构

名称 说明
Icon头 固定大小,20个字节
顶点段 保存图标模型的所有顶点和法线数据
动画段 保存图标模型动画帧信息
纹理段 保存图标模型纹理

3.2 Icon头

Icon头存储了我们解码不同数据段所需的所有重要信息,其中包括:

  • “顶点段”中包含的顶点数量以及动画形状的数量
  • 纹理数据是否经过压缩

在图标文件中,Icon头总是位于偏移量 0 处。以下是Icon头结构:

Offset Length Description
0000 uint32 magic0x010000
0004 uint32 animation_shapes,动画形状,注1
0008 uint32 tex_type,纹理类型,注2
0012 uint32 未知,固定值0x3F800000
0016 uint32 vertex_count,顶点数量,必定是3的倍数

注1:图标模型有几套不同的顶点数据,对应不同的动作,称之为“形状”。将不同的形状循环渲染,即可形成动画效果。

注2:“纹理类型”这部分尚不明确,该值是4字节整形,我总结出来每个位相应的功能如下表,未必正确:

mask Description
0001 未知
0010 未知
0100 图标文件中存在纹理数据,有些游戏(如ICO)没有纹理数据,图标全黑
1000 图标文件中的纹理数据是被压缩过的

3.3 顶点段

PS2 图标中的多边形总是由三个顶点形成的三角形组成。由于顶点是按一定规律排列的,因此只需按照规律读取顶点数据,就能轻松构建多边形。利用OpenGL或类似工具渲染这些数据,就能得到一个漂亮的图标线框。

“顶点段”包含图标中所有顶点的数据。每个顶点数据包含一组顶点坐标、法线坐标、纹理坐标以及一组RGBA数据,因此,拥有m个顶点和 n个形状的“顶点段”数据结构如下:

解析PS2游戏存档3D图标,粗茶淡饭 代码为伴,游戏,3d,python

顶点坐标

每个顶点坐标占用8字节,结构如下:

Offset Length Description
0000 int16 X坐标,使用时需除以4096
0002 int16 Y坐标,使用时需除以4096
0004 int16 Z坐标,使用时需除以4096
0006 uint16 未知
法线坐标

每个法线坐标与顶点坐标数据结构一致。

纹理坐标

每个纹理坐标占用4字节,结构如下:

Offset Length Description
0000 int16 U坐标,使用时需除以4096
0002 int16 V坐标,使用时需除以4096
顶点RGBA

每个顶点颜色占用4字节,结构如下:

Offset Length Description
0000 uint8 R,0-255
0001 uint8 G,0-255
0002 uint8 B,0-255
0003 uint8 A,0-255

3.4 动画段

很遗憾关于“动画段”里的大部分内容,我还没完全搞懂含义。不过不用太在意,利用“顶点坐标插值”,仍然可以完成动画动作。

以下是“动画段”的数据结构:

解析PS2游戏存档3D图标,粗茶淡饭 代码为伴,游戏,3d,python

“动画段”包含“动画头”和若干“动画帧”,每个“动画帧”包含若干“关键帧”。

动画头

“动画头”结构如下:

Offset Length Description
0000 uint32 magic:0x01
0004 uint32 frame length:“动画帧”完成一个循环所需的“播放帧”,根据这个值可以计算出每个“动画帧”对应的“播放帧”数量
0008 float32 anim speed:播放速度,作用未知
0012 uint32 play offset:起始播放帧,作用未知
0016 uint32 frame count:“动画段”一共有几个“动画帧”,一般一个“形状”对应一个“动画帧”
帧数据Frame Data

“帧数据”直接位于“动画头”之后。

Offset Type Description
0000 u32 Shape id
0004 u32 Number of keys
0008 u32 UNKNOWN
0012 u32 UNKNOWN
关键帧Frame Key
Offset Type Description
0000 f32 Time
0004 f32 Value

3.5 纹理段

纹理是像素为128x128的图片,使用TIM图像格式进行编码。根据Icon头里的tex_type字段,纹理分为未压缩和压缩两种类型。

未压缩纹理

未压缩纹理的像素格式为BGR555,其中B、G、R各占用5bit,总共15bit,占用2字节(1个bit冗余)。如图:

High-order byte:    Low-order byte:
X B B B B B G G     G G G R R R R R

X = Don't care, R = Red, G = Green, B = Blue

因此原始图片大小固定为128x128x2字节。如果需将它的像素格式转为RGB24,可以用如下方法:

High-order byte:     Middle-order byte:    Low-order byte:
R R R R R 0 0 0      G G G G G 0 0 0       B B B B B 0 0 0

将5bit的色彩值转为8bit时,需将低3位补0。经过上述转换,每像素字节数变为3字节。同理也可将格式转为RGBA32,每像素字节数变为4字节。

压缩纹理

压缩纹理使用非常简单的RLE算法进行压缩。第一个u32是压缩纹理数据的大小。其后的数据始终为u16rle_coderle_data交替出现,直到结束。
rle_data有两个变量:data数量x和重复次数yrle_code作为计数器存在,如果小于0xFF00,则x = 1y = rle_code;如果大于等于0xFF00,则x = (0x10000 - rle_code)y = 1。如下图。

解析PS2游戏存档3D图标,粗茶淡饭 代码为伴,游戏,3d,python

将压缩纹理解压后,再根据上一节的内容即可转换为RGB24RGBA32的图片。

04 结尾

至此为止图标的相关文件已经解析完毕了,万事俱备只欠东风,下一篇我们即将开始渲染模式,使用PyGameModernGL将渲染动画显示出来。

05 参考资料

  • gothi - icon.sys format
  • Martin Akesson - PS2 Icon Format v0.5

06 项目地址

ps2mc-browser

A PS2 game save browser supports displaying 3D icons文章来源地址https://www.toymoban.com/news/detail-772634.html

到了这里,关于解析PS2游戏存档3D图标的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【STM32外设系列】双轴按键PS2摇杆

    🎀 文章作者:二土电子 🌸 关注公众号获取更多资料! 🐸 期待大家一起学习交流!   我们首先来看一下双轴按键PS2摇杆长什么样子   该模块有两种输出,X轴和Y轴以模拟信号(电压)的形式输出,Z轴以数字信号(高低电平)的形式输出。其中各个引脚的作用如下 G

    2024年02月22日
    浏览(43)
  • 基于arduino及PS2的麦克纳姆轮遥控小车

           2、设计原理 通过建模模拟车体基本构架,便于结构设计、无实物展示展示和组装;                              (b) 图 3.1  小车 sw 模型    小车简介:小车将采用钢质小车地盘作为车身;以直流减速电机提供动力;麦克纳姆轮作为车轮;采取可装卸推

    2024年02月02日
    浏览(64)
  • 【STM32】SPI与PS2手柄解码(CUBEMX+HAL库)

    本文工程文件以及ps2数据手册在这个链接,我设置成免费了 【免费】STM32PS2解码工程以及代码(CUBEMX+HAL库)资源-CSDN文库 目录   SPI简介 SPI引脚说明 一些参数的含义 通信的四种模式 通信过程简介 关于SPI的常用HAL库函数 PS2简介 ps2手柄 ps2接收器 PS2解码 CUBEMX工程配置 PS2解码

    2024年04月17日
    浏览(36)
  • openpnp - 汇川 Inovance IS620PS2R8I-IAB-C的参数读取

    设备中用到了一台 汇川 Inovance IS620PS2R8I-IAB-C. 部件总是有寿命的, 万一以后坏了, 买一台同型号的伺服容易, 但是里面的参数设置如果不早做准备, 到时候就难了, 得是装伺服的作者才知道. 琢磨了一下怎么读取这台伺服的参数. X伺服型号(汇川 Inovance IS620PS2R8I-IAB-C) X伺服配的电机

    2024年02月16日
    浏览(53)
  • Unity游戏开发之游戏存档方式

    目录 1.Unity自带存储方式PlayerPrefs 2.XML存储方式 3.Json类型存储方式 1.Unity的序列化问题 2.Unity中支持序列化的类 3.Unity中Json的使用方法  4.SQLite 1.SQLite的一些基础(简单介绍,不会深入讲解) 2.在Unity中使用SQLite 3.SQLite的优劣 结语         属于unity自带的数据存储方法,其形式

    2024年02月06日
    浏览(49)
  • 幻兽帕鲁转移/迁移游戏存档之后,无法迁移角色存档,进入游戏需要重新建角色问题(已解决),服务器到服务器之间的存档转移

    很多朋友在迁移幻兽帕鲁游戏存档到服务器的时候,可能会遇到一个问题,就是迁移完成后,进入到游戏会发现又需要从头开始,重新新建角色。 其实这个问题也很好解决,因为Palworld服务端有两种,一种是有APPID,还有一种是没有APPID。   如果迁移的前后服务器版本不一致

    2024年02月20日
    浏览(47)
  • Unity游戏存档与读档

    目前unity常见存档和读档有几种方式,也就是常见的存储数据的方式(注意存档和读档都是针对单机游戏而言的,角色信息,道具信息,关卡情况等) Unity存档的方式大概分为这两大类 图片来源自siki学院 图片来源自siki学院 第一种:Player Prefs,这是一种键值对的形式,也就是

    2024年02月07日
    浏览(58)
  • 如何使用ps制作ico图标文件

    原文链接:https://blog.csdn.net/SDKL_YI/article/details/103513372 如何使用ps制作ico图标文件 先打开ps导入文件,不管什么格式,是图片能显示就行: 选择磁性索套,可以调整频率,频率越高当然抠出来的图边缘约圆滑,当然也是有上限的,具体数据具体操作改就行了: 套完图片然后在

    2024年02月06日
    浏览(35)
  • 阿里云幻兽帕鲁Linux 服务器下载游戏存档的方法

    阿里云幻兽帕鲁Linux 服务器下载游戏存档的方法也非常简单。 远程连接到阿里云的 linux服务器后,可以在 ECS 远程连接命令行界面,点击左上角的文件,打开文件树。通过一行命令打包。 在打包后的 Saved.tar 文件上右键,选择 下载文件。 点击查看阿里云一键部署幻兽帕鲁服

    2024年02月21日
    浏览(64)
  • 论文解析-基于 Unity3D 游戏人工智能的研究与应用

    这段代码是一个重写了 AgentAction 方法的方法。以下是对每行代码解释: ①public override void AgentAction(float[] vectorAction) 这行代码声明了一个公共的、重写了父类的 AgentAction 方法的方法。它 接受一个 float 类型的数组作为参数。 ② float newAction0 = Mathf.Clamp(vectorAction[0], -1, 1); 这行代

    2024年02月03日
    浏览(55)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包