客户需求
公司有个项目,是北京某大学的项目,一个虚拟仿真项目,需要模仿一个国外的牛逼软件,我理解为一个受力分析的软件,大概的样子如下
这个图是我手头唯一的图片,实际上这个软件是做了一个三维的受力分析的,客户要求我们也做一个同样效果的图,客户那边根据那个外国软件可以生成一系列的数据,大概的样子如下
看到这个数据就比较尴尬了,我们把这个转为excel,并加入颜色看看效果.
我看了一下一共是2208的数据,这个数据量还比较小,上一次同样的数据,他们给我了2w+的数据量,这个时候我使用unity的epplus来读取这些数据,问题不大读到了,也表现出来了.
开工
使用unity编写了代码读取,具体的配置面板如下
技术问题
- 使用球体,面对2w个点的数据,根本没法应付
- 使用单canvas存在同canvas渲染层级的问题,想看效果的话,可以参考echarts里面的3d散点图
- 使用多canvas又存在和第一个问题相同的问题,渲染数量过大
技术定型
最终为了实现更好的效果,我们还是使用了单canvas的技术定型,因为可以渲染的更多,但是我们需要从后到前的顺序来渲染
因为如果渲染的顺序相反,会出现近的优先渲染,远的后渲染的问题
所以就只能尽可能的锁定视角,本来还想使用例子特效的效果,因为可以使用Billboard(广告牌)的渲染模式,但是还是消耗太大了,
为了方便研究他给的数据,我这边把每个点改成text,并显示对应的index效果如下
这样就可以发现,客户给的数据并不是规则的,从index中无法找到规律,所以只能使用如上的image(一个白色圆的方式)
只能通过圆的方式,看看效果了
问题
这个时候客户说,我们需要的是一个webgl的版本,这个时候我就要调整之前选中的几个技术
- 数据保存成excel,我需要把数据改成json的形式保存
- 消耗的问题,webgl的渲染量级肯定和PC端是没法比的,我需要降低当前的渲染数量,或者增加他的渲染量级的上线
解决
- 第一个解决的方法就是使用python来解决代码如下
# coding: utf-8
import pandas as pd
import json
# 1. 读取一个excel
excel_reader = pd.ExcelFile('data.xlsx') # 指定文件
# 2. 得到所有的sheets
sheet_names = excel_reader.sheet_names # 读取文件的所有表单名,得到列表
# 3. 定义一个obj
sheets = {}
# 4. 循环所有的sheets
for index in range(len(sheet_names)):
# 5. 解析excel对应的sheet的数据
df = excel_reader.parse(sheet_name=sheet_names[index])
# 6. 得到我需要的列,并取十位小数
sheet_obj_excel = df[['id', 'X', 'Y', 'Z',
'X-Dis', 'Y-Dis', 'Z-Dis']].round(10)
# 7.把得到的数据转化为json字符串
sheet_str_json = sheet_obj_excel.to_json(force_ascii=False)
# 8. 得到json对象
sheet_obj_json = json.loads(sheet_str_json)
# 9. 把我们得到的sheet对象放到我们准备好多的
sheets[index] = sheet_obj_json
# 10. 首先是把json字符串变为json对象 然后在格式化 间距4个空格
data5 = json.dumps(sheets, indent=4,
separators=(',', ':'), ensure_ascii=False)
# 11. 写入对应的文件中
file_handle = open('excel2json1.json', mode='w')
file_handle.write(data5)
file_handle.close()
- 解决第二个问题比较棘手,现在唯一能想到的就是dots的方式来处理,但是可能无法达到我想象的效果,所以,还是需要调研一下,而且是否支持webgl,
2020年8月20日更新
因为公司不是很多人会python,有的时候会生成很多,为了照顾大部分人,升级到了自动识别,自动生成的版本
# coding: utf-8
import pandas as pd
import json
import os
# 1. 文件夹路径
dirpath = r'铸铁压缩数据'
# 2. 得到路径下的所有文件
for root, dirs, files in os.walk(dirpath):
# 3. 循环这些文件
for file in files:
# 4. 得到这些文件的名字
fname = os.path.splitext(file)
# 5. 判断这些文件是否为excel
if fname[1] == '.xlsx' or fname[1] == '.xls':
# 7. 读取一个excel
excel_reader = pd.ExcelFile(os.path.join(root, file)) # 指定文件
# 8. 得到所有的sheets
sheet_names = excel_reader.sheet_names # 读取文件的所有表单名,得到列表
# 9. 定义一个obj
sheets = {}
# 10. 循环所有的sheets
for index in range(len(sheet_names)):
# 11. 解析excel对应的sheet的数据
df = excel_reader.parse(sheet_name=sheet_names[index])
# 12. 得到我需要的列,并取十位小数 时间(s) 力(kN) 位移(mm)
sheet_obj_excel = df.round(10)
# 13. 把得到的数据转化为json字符串
sheet_str_json = sheet_obj_excel.to_json(force_ascii=False)
# 14. 得到json对象
sheet_obj_json = json.loads(sheet_str_json)
# 15. 把我们得到的sheet对象放到我们准备好多的
sheets[index] = sheet_obj_json
# 16. 首先是把json字符串变为json对象 然后在格式化 间距4个空格
data5 = json.dumps(sheets, indent=4,
separators=(',', ':'), ensure_ascii=False)
# 17. 得到生成json文件的名字
jsonfilename = 'excel2json' + str(fname[0]) + '.json'
# 18. 写入对应的文件中
file_handle = open(jsonfilename, mode='w')
file_handle.write(data5)
file_handle.close()
# 19. 输出转化完成
print("转化完成\texcel文件:\t" + file + "\t-->\tjson文件:" + jsonfilename)
# 20. 生成完毕,请验收你的json文件
print("-->所有文件都生成完毕了<--")
总结
- 解决问题的办法还是要从设计入手,
我感觉还是要从设计入手修改这个地方,如果单纯从技术方案来解决的话,很难达到满意的效果,国外的效果也不尽如人意,但是就是很好用,也不是单纯的说外国软件好,想一下,这些效果不是那么好的软件,他们的底层基础也是很久时间的积累,但是为什么他们不把效果不断的完善,而是专供数据呢,其实还是一个道理,就是数据才是真正有意义的 - 技术储备还是很重要的,人需要学习的地方还有很多
最近在搞项目管理的技术学习,并且在自己制作一个pmp的管理系统,php的知识也不是那么难学,python的知识也不是那么难学,但是多学一些,你能干的多了就是对自己的帮助,毕竟我是想做技术总监的男人.