骑砍战团MOD开发(49)-使用ScoEditor编辑sco文件制作游戏场景

news2024/11/14 17:06:27

一.ScoEditor下载霸王•吕布 / ScoEditor · GitCodeicon-default.png?t=N7T8https://gitcode.net/qq_35829452/scoeditor二.ScoEditor导出文件种类

     mission_objects.json:场景物/出生点/通道等物体

     layer_ground_elevation.pfm:场景terrain/ground地形增量,采用PFM深度图存储

     ai_mesh.obj:AI网格静态模型,由点/线面构成

三.mission_objects.json

     object_type = ['prop', 'entry', 'item', 'unused', 'plant', 'passage']
 
     object = {
         'type': object_type[type], 类型,场景物/出生点/通道
         'id': id, ID.scene_props.py定义ID
         'garbage': '%0#x' % garbage,
         'rotation_matrix': [mtx_a, mtx_b, mtx_c], 旋转矩阵(右手坐标系,ZXY顺序旋转),转化后获得沿XYZ旋转角度
         'pos': pos, 世界坐标系坐标
         'str': str, spr_torch等标识
         'entry_no': entry_no, (若为prop则prop_instance_get_variation_id获取)
         'menu_entry_no': menu_item_no,(若为prop则prop_instance_get_variation_id_2获取)
         'scale': scale, 伸缩变换比例
     }

     <1.旋转角度转化:euler_angle_to_rotation.bat/rotation_to_euler_angle.bat

     将Blender旋转角度调整为ZXY模式,输入rotx,roty,rotz至 euler_angle_to_rotation.py中得到旋转矩阵,拷贝至mission_objects.json.

     <2.blender python脚本实现导出mission_object.json

import bpy
import math
import json
import mathutils
# mission_obj data_format
# object_type = ['prop', 'entry', 'item', 'unused', 'plant', 'passage']
# object = {
#   'type': object_type[type], 类型,场景物/出生点/通道
#   'id': id, ID.scene_props.py定义ID
#   'garbage': '%0#x' % garbage,
#   'rotation_matrix': [mtx_a, mtx_b, mtx_c], 旋转矩阵(右手坐标系,ZXY顺序旋转),转化后获得沿XYZ旋转角度
#   'pos': pos, 世界坐标系坐标
#   'str': str, spr_torch等标识
#   'entry_no': entry_no, (若为prop则prop_instance_get_variation_id获取)
#   'menu_entry_no': menu_item_no,(若为prop则prop_instance_get_variation_id_2获取)
#   'scale': scale, 伸缩变换比例
#}

# 获取当前场景中所有的对象
objects = bpy.context.scene.objects

mission_objects = []
for object in objects:
    mission_obj = {}
    mission_obj['type'] =  object.get('type')
    mission_obj['id'] = object.get('id')
    mission_obj['garbage'] = object.get('garbage')
    rotation_euler_XYZ = object.rotation_euler.copy()
    rotation_euler_XYZ[0] = rotation_euler_XYZ[0] * -1
    rotation_euler_XYZ[1] = rotation_euler_XYZ[1] * -1
    rotation_euler_XYZ[2] = rotation_euler_XYZ[2] * -1
    rot_matrix = rotation_euler_XYZ.to_matrix()
    mission_obj['rotation_matrix'] = [
     [rot_matrix[0][0], rot_matrix[0][1], rot_matrix[0][2]],
     [rot_matrix[1][0], rot_matrix[1][1], rot_matrix[1][2]],
     [rot_matrix[2][0], rot_matrix[2][1], rot_matrix[2][2]],
    ]
    mission_obj['pos'] = [object.location.x, object.location.y, object.location.z]
    mission_obj['str'] = object.get('str')
    mission_obj['entry_no'] = object.get('entry_no')
    mission_obj['menu_entry_no'] = object.get('menu_entry_no')
    mission_obj['scale'] = [object.scale.x, object.scale.y, object.scale.z]
    mission_objects.append(mission_obj)
    
mission_objects_json = json.dumps(mission_objects, indent=4)
 
# 打开文件进行写入,如果文件不存在则创建
with open('F:\mission_objects.json', 'w', encoding='utf-8') as file:
    file.write(mission_objects_json)  # 将字符串写入文件

     <3.blender python脚本实现导入mission_object.json

import bpy
import math
import json
import mathutils
# mission_obj data_format
# object_type = ['prop', 'entry', 'item', 'unused', 'plant', 'passage']
# object = {
#   'type': object_type[type], 类型,场景物/出生点/通道
#   'id': id, ID.scene_props.py定义ID
#   'garbage': '%0#x' % garbage,
#   'rotation_matrix': [mtx_a, mtx_b, mtx_c], 旋转矩阵(右手坐标系,ZXY顺序旋转),转化后获得沿XYZ旋转角度
#   'pos': pos, 世界坐标系坐标
#   'str': str, spr_torch等标识
#   'entry_no': entry_no, (若为prop则prop_instance_get_variation_id获取)
#   'menu_entry_no': menu_item_no,(若为prop则prop_instance_get_variation_id_2获取)
#   'scale': scale, 伸缩变换比例
#}

# 获取当前场景中所有的对象
objects = bpy.context.scene.objects

def get_object_by_mission_object(mission_object):
    spr_name = mission_object["str"]
    type = mission_object["type"]
    if type == 'entry':
        return objects["lol_entry_point"]
    elif type == 'prop':
        for object in objects:
            if ('spr_' + object.name) == spr_name:
                return object
    
def handle_mission_object(mission_object_index, mission_object):
    object = get_object_by_mission_object(mission_object)
    new_obj = object.copy()
    new_obj.data = object.data.copy()
    new_obj.data.materials[0] = object.data.materials[0].copy()
    new_obj.rotation_euler = object.rotation_euler.copy()
    new_obj.location = object.location.copy()
    new_obj.scale = object.scale.copy()
    
    new_obj.name = object.name + '_' + str(mission_object_index)
    
    #set mission_object pos rotation and scale
    new_obj.location.x = mission_object["pos"][0]
    new_obj.location.y = mission_object["pos"][1]
    new_obj.location.z = mission_object["pos"][2]
    
    
    new_obj.scale.x = mission_object["scale"][0]
    new_obj.scale.y = mission_object["scale"][1]
    new_obj.scale.z = mission_object["scale"][2]
    
    
    rotation_matrix = mathutils.Matrix(mission_object["rotation_matrix"])
    new_obj.rotation_euler = rotation_matrix.to_euler()
    new_obj.rotation_euler[0] = new_obj.rotation_euler[0] * (-1)
    new_obj.rotation_euler[1] = new_obj.rotation_euler[1] * (-1)
    new_obj.rotation_euler[2] = new_obj.rotation_euler[2] * (-1)
    
    #set mission_object prop
    new_obj["id"] = mission_object["id"]
    new_obj["type"] = mission_object["type"]
    new_obj["garbage"] = mission_object["garbage"]
    new_obj["str"] = mission_object["str"]
    new_obj["entry_no"] = mission_object["entry_no"]
    new_obj["menu_entry_no"] = mission_object["menu_entry_no"]
    bpy.context.collection.objects.link(new_obj)

with open('F:/mission_objects.json', "r") as file:
    mission_objects_json_str = file.read()
    print(mission_objects_json_str)

mission_objects = json.loads(mission_objects_json_str)

for mission_object_index, mission_object in enumerate(mission_objects):
    handle_mission_object(mission_object_index, mission_object)
        

四.ai_mesh.obj

五.layer_ground_elevation.pfm

六.解包sco文件

    将拷贝sco文件至工具目录,运行unpack.bat进行解包.

七.封包sco文件

    修改解包文件夹下的文件,运行repack.bat重新打包生成sco文件.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1536865.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

二、SpringBoot3 配置文件

本章概要 统一配置管理概述属性配置文件使用YAML 配置文件使用批量配置文件注入多环境配置和使用 2.1 统一配置管理概述 SpringBoot工程下&#xff0c;进行统一的配置管理&#xff0c;你想设置的任何参数&#xff08;端口号、项目根路径、数据库连接信息等等)都集中到一个固定…

Echarts地图之——如何给省份名称添加背景图片背景色

上次添加的背景是给整张地图添加的&#xff0c;如果想要给省份名称设置背景图&#xff0c;我们就要在label配置里面去添加设置。 series: [ {type: map,map: china,aspectScale: 0.85,zoom: 1.2,top: 9%,left: 11%,roam: false,selectedMode: multiple,label: {show: true,col…

基于springboot的服装商城系统(含源文件)

&#xff08;源码附文章底部&#xff09; 摘 要 随着科学技术的飞速发展&#xff0c;社会的方方面面、各行各业都在努力与现代的先进技术接轨&#xff0c;通过科技手段来提高自身的优势&#xff0c;时装购物系统当然也不能排除在外。时装购物系统是以实际运用为开发背景&#…

C++关键字:const

文章目录 一、const的四大作用1.修饰 变量、数组2.修饰 函数的形参、修饰 引用 (最常用&#xff09;3.修饰 指针&#xff1a;常量指针、指针常量 、只读指针4.修饰 类的成员函数、修饰 类的对象 一、const的四大作用 1.修饰 变量、数组 1.const修饰变量&#xff1a; 被const修…

牛客周赛 Round 37 E.魔法之森的蘑菇

广搜板子&#xff0c;加个方向就好了 注意多测清空问题 #include<bits/stdc.h> using namespace std; using ll long long; #define int long long const int N 1e510; const int inf 0x3f3f3f3f; const int mod 1e97;int n,m; char g[1010][1010]; bool vis[1010][1…

思科网络中DHCP协议的配置

一、什么是DHCP&#xff1f;DHCP有什么作用&#xff1f; &#xff08;1&#xff09;DHCP&#xff08;Dynamic Host Configuration Protocol&#xff09;是一种网络协议&#xff0c;用于在局域网中自动分配IP地址和其他网络配置信息给计算机设备。我们电脑连接WiFi的时一般就是…

CCF-CSP认证考试 202305-3 解压缩 100分题解

更多 CSP 认证考试题目题解可以前往&#xff1a;CSP-CCF 认证考试真题题解 原题链接&#xff1a; 202305-3 解压缩 时间限制&#xff1a; 5.0s 内存限制&#xff1a; 512.0MB 题目背景 西西艾弗岛运营公司是一家负责维护和运营岛上基础设施的大型企业。在公司内&#xff0c;…

戳-考察C++基础的两道小题

昨天分享了一天本来是考察unique_ptr禁止拷贝行为的&#xff0c;但是粘贴的时候贴成正确代码了&#xff0c;于是&#xff0c;今天继续找两道小题来练练手。 今天这两道小题&#xff0c;你能回答上来不&#xff0c;题目1有至少6处错误&#xff0c;你能找到几个&#xff1f;题目2…

旅游小程序开发的费用及功能

随着科技的发展和智能手机的普及&#xff0c;越来越多的行业开始利用小程序来进行线上服务。旅游业作为一个重要的服务业&#xff0c;也纷纷推出了自己的旅游小程序&#xff0c;以方便游客在线预订、查询景点信息等。那么&#xff0c;旅游小程序开发的费用是多少&#xff1f;功…

Flask项目中使用蓝湖实现启动项配置——多个controller项

项目结构 # controller1-__init__.py from flask import Blueprintcont2_sale_blueprint Blueprint(cont2_sale_blueprint, __name__) cont2_user_blueprint Blueprint(cont2_user_blueprint, __name__) from . import user_controller from . import sale_controller# contr…

哨兵位及用哨兵位实现链表的链接

哨兵位&#xff1a; 通俗的话讲就是额外开辟一块空间&#xff0c;指向链表的头部。 合并两个有序链表 已解答 简单 相关标签 相关企业 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1&#xff1a; 输入&#…

思腾合力受邀出席文化和旅游虚拟现实应用推广交流活动并作主题演讲

3月21日&#xff0c;由文化和旅游部产业发展司主办&#xff0c;中国信息通信研究院、北京市石景山区文化和旅游局、中国动漫集团有限公司承办的“数字赋能文旅场景建设行动——文化和旅游虚拟现实应用推广交流活动”在北京首钢一高炉SoReal科幻乐园成功举办。 思腾合力CMO徐莉受…

北斗卫星在公路养护中的应用

北斗卫星在公路养护中的应用 北斗卫星是我国自主研发的一款卫星导航系统&#xff0c;它为公路养护工作提供了新的解决方案。通过使用北斗卫星技术&#xff0c;公路养护部门可以实时获取道路状况&#xff0c;提高工作效率&#xff0c;为交通安全保驾护航。 首先&#xff0c;北斗…

海边游艇港口迈入智能新纪元:数字孪生系统引领未来趋势

在浩瀚的海洋边&#xff0c;游艇港口不仅是停泊游艇的港湾&#xff0c;更是展现城市风貌与智慧科技的窗口。如今&#xff0c;随着数字化技术的飞速发展&#xff0c;海边游艇港口也迎来了前所未有的变革——数字孪生系统的应用&#xff0c;正悄然改变着传统游艇港口的运营模式&a…

【书生·浦语大模型实战营】学习笔记2

Lagent&#xff1a;智能体框架&#xff0c;实现将一个大语言模型转化为多种类型的智能体&#xff0c;更好地发挥InternLM的性能 浦语灵笔&#xff1a;视觉语言大模型 InternLM-Chat-7B智能对话Demo 环境准备 使用复制的internlm-demo环境 # 执行该脚本文件来安装项目实验环境…

GPT-5可能会在今年夏天作为对ChatGPT的“实质性改进”而到来

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

明明有这个字段但是又一直说不存在,完美解决 Unknown column ‘xxx ‘ in ‘where clause‘

一、情景再现 二、排查错因&#xff1a;仔细看多了空格&#xff0c;映射的时候就有问题 三、去看映射&#xff0c;果然多了空格&#xff0c;去掉空格&#xff0c;重启 四、完美解决

PyTorch深度学习:遥感影像地物分类的高效工具

我国高分辨率对地观测系统重大专项已全面启动&#xff0c;高空间、高光谱、高时间分辨率和宽地面覆盖于一体的全球天空地一体化立体对地观测网逐步形成&#xff0c;将成为保障国家安全的基础性和战略性资源。未来10年全球每天获取的观测数据将超过10PB&#xff0c;遥感大数据时…

《数字集成电路物理设计》学习笔记(持续更新中)

参考书籍&#xff1a; 《数字集成电路物理设计》pdf下载百度云链接&#xff1a; 链接: https://pan.baidu.com/s/1jOD54q_f9KLhfX6InabTRA?pwd8888 提取码: 8888 复制这段内容后打开百度网盘手机App&#xff0c;操作更方便哦 --来自百度网盘超级会员v8的分享 目录 第1章 集…

Swift 中的 Sequence 是什么 ?

在 Swift 中&#xff0c;Sequence 是一个协议&#xff0c;它表示一个可以遍历其元素的集合类型。任何遵循 Sequence 协议的类型都必须提供一个迭代器&#xff0c;用于按顺序访问其元素。迭代器是通过 makeIterator() 方法获取的&#xff0c;该方法返回一个遵循 IteratorProtoco…