了解明日方舟页面球体动画

这是对明日方舟登录界面与官网球体动画名称的探索记录,并没有什么实际意义

结论

最后的结论是,就是球体网格动画

起因

在登录游戏与进入游戏官网时一直都能看到以下这个球体动画

我就一直很好奇这玩意到底是个啥,有没有什么学名。但是从各种搜索引擎,游戏论坛乃至群友里问都没问出个所以然(可能是问的少了,就问了一次)。于是只好自己想办法看看。

动画分析

游戏客户端的没录,上面的是网页端的动画gif录屏。很明显是一个带有节点三角面组成的球体动画的一部分(我也不清楚相关名词有没有用对,只是搜刮了贫瘠的大脑拼凑一句描述)

动画来源

但是光分析出 三角面 球体 动画 3d 这几个关键词似乎还不够搜出精确的名词

类似的图倒是有,但是也没有给出具体的名词。(此时继续翻个十来页多翻几十个博客或许能找到,但还是决定先多找一些关键词来定位)

动画显示的位置有客户端登陆界面和官网界面,客户端应该是unity打包的,对unity不太熟,而且原生apk反编译下就算找到控件位置估计也看不明白,只是感觉可能是opengl还是啥引擎实现的动画。于是决定从官网着手

对官网的查看

还好最近学了几天前端,直接打开开发者工具开找

最后一看是一个canvas标签展示的动画,那估计是js控制显示的了,然后这里的id也说明了应该是用webgl,也就是还是opengl实现的动画。但是网页的js很明显是压缩加密过的,对这玩意也不够了解,还是决定继续开搜。

对网页布局的查看最后又多了几个关键词 canvas js动画 webgl

接下来就是排列组合继续搜索一下

得到结果

然后找到了该博客在浏览器中画圆都会,但是画个 3D 的球呢? - 掘金 (juejin.cn)

(这和联想的关键词好像多少有点不沾边)

但是这里给出的第一个案例勾引(了我,看起来似曾相似

Sphere (woopen.github.io)

从这里了解到画标准球(UV Sphere)的方法,但是搜索得到C++ 生成球体网格 - 知乎 (zhihu.com)后发现UV Sphere只是一种绘制球体的方式,此处引入四种绘制球体的方式与相关图片

The UV Sphere

The lcosphere

The Quad Sphere

Goldberg Polyhedra

很明显 The Icosphere 更接近我想要搜索的球体动画的名字,但这只是一种生成球体网格的方式。从第一句中看见了球体网格这个名词,让我感觉应该找到结果了。

于是我现在可能会用The Icosphere方式生成的球体网格动画来形容这个动画,简单说就是一个球体网格动画。虽然可能没什么意义,但大概或许还是能锻炼到搜索信息的能力的罢。我原本还以为是个有什么意义的图形(什么代表脑细胞啥的)

可能是因为以前看过类似这张图的图片吧

抄一个球体网格动画实现

来都来了,前面在浏览器中画圆都会,但是画个 3D 的球呢? - 掘金 (juejin.cn)也给出了绘制球体网格动画的源码,干脆直接抄一个玩玩(也没指望学到啥,只是练练敲js,毕竟量子学习的时候只管用,对原理啥的记得不多)

最后看着改源码就弄出了这玩意(难视)

<!DOCTYPE html>
<html><head><meta charset="utf-8" /><meta name="referrer" content="no-referrer"/><title>Title</title><script src="https://cdn.jsdelivr.net/npm/gl-matrix@3.3.0/gl-matrix.js"></script><style></style><script></script></head><body><div id="app"><h2>Sphere Anim</h2><script>// 设置全局对象,大概window.mat4 = glMatrix.mat4;window.vec3 = glMatrix.vec3;// 创建canvas 添加到bodyconst canvas = document.createElement('canvas');canvas.width = 400;canvas.height = 400;document.body.appendChild(canvas);// 获取webgl 设置视窗const gl = canvas.getContext('webgl');gl.viewport(0,0, gl.drawingBufferWidth, gl.drawingBufferHeight);const vs = `attribute vec4 aPosition;uniform mat4 uPVMat;uniform mat4 uModelMat;void main() {gl_Position = uPVMat * uModelMat * aPosition;}// `;// FragColor代表使用颜色,根据rgb比例可调出相近色const fs = `precision mediump float;void main() {gl_FragColor = vec4(0.58, 0.51, 0.07, 1.);}`;const vertexShader = createShader(gl, gl.VERTEX_SHADER, vs);const fragmentShader = createShader(gl, gl.FRAGMENT_SHADER, fs);const program = createProgram(gl, vertexShader, fragmentShader);gl.useProgram(program);// 背景颜色gl.clearColor(0.09, 0.09, 0.09, 1);// scaling后数组代表显示大小比例const baseModelMat = mat4.fromScaling(mat4.create(), [1,1,1]);const viewMat = mat4.lookAt(mat4.create(), [0, 0, 10], [0, 0, 0], [0, 1, 0]);const presMat = mat4.perspective(mat4.create(),// 此处rad是缩放比例?rad(12),gl.canvas.clientWidth / gl.canvas.clientHeight,1,2000);const pvMat = mat4.mul(mat4.create(), presMat, viewMat);// 传入的大概是三角形面数的比例,越高则相应面数越多const iSphere = createIcosahedronSphere(1);const iSphereCount = iSphere.length / 3;const uPVMat = gl.getUniformLocation(program, "uPVMat");const uModelMat = gl.getUniformLocation(program, "uModelMat");const aPosition = gl.getAttribLocation(program, "aPosition");const iBuffer = gl.createBuffer();gl.bindBuffer(gl.ARRAY_BUFFER, iBuffer);gl.bufferData(gl.ARRAY_BUFFER, iSphere, gl.STATIC_DRAW);gl.uniformMatrix4fv(uPVMat, false, pvMat);gl.enableVertexAttribArray(aPosition);gl.vertexAttribPointer(aPosition, 3, gl.FLOAT, false, 0, 0);// 旋转角度let rotate = 0;function draw(){gl.clear(gl.COLOR_BUFFER_BIT);let modelMat = mat4.rotateY(mat4.create(),// 后面数组代表球体偏移位mat4.translate([], baseModelMat, [0, 0, 0]),rotate);gl.uniformMatrix4fv(uModelMat, false, modelMat);gl.bindBuffer(gl.ARRAY_BUFFER, iBuffer);gl.vertexAttribPointer(aPosition, 3, gl.FLOAT, false, 0, 0);for (let i = 0; i < iSphereCount; i += 3) gl.drawArrays(gl.LINE_LOOP, i, 3);rotate += 0.01;requestAnimationFrame(draw);}draw();function createIcosahedronSphere(count = 0) {const points = [];const t = (1 + Math.sqrt(5)) / 2;const v1 = vec3.normalize([], [-1, t, 0]);const v2 = vec3.normalize([], [1, t, 0]);const v3 = vec3.normalize([], [-1, -t, 0]);const v4 = vec3.normalize([], [1, -t, 0]);const v5 = vec3.normalize([], [0, -1, t]);const v6 = vec3.normalize([], [0, 1, t]);const v7 = vec3.normalize([], [0, -1, -t]);const v8 = vec3.normalize([], [0, 1, -t]);const v9 = vec3.normalize([], [t, 0, -1]);const v10 = vec3.normalize([], [t, 0, 1]);const v11 = vec3.normalize([], [-t, 0, -1]);const v12 = vec3.normalize([], [-t, 0, 1]);function tri(a, b, c) {points.push(...a, ...b, ...c);}function divide(a, b, c, count) {if (count > 0) {const ab = vec3.normalize([], vec3.scale([], vec3.add([], a, b), 0.5));const ac = vec3.normalize([], vec3.scale([], vec3.add([], a, c), 0.5));const bc = vec3.normalize([], vec3.scale([], vec3.add([], b, c), 0.5));divide(a, ab, ac, count - 1);divide(ab, b, bc, count - 1);divide(bc, c, ac, count - 1);divide(ab, bc, ac, count - 1);} else {tri(a, b, c);}}divide(v1, v12, v6, count);divide(v1, v6, v2, count);divide(v1, v2, v8, count);divide(v1, v8, v11, count);divide(v1, v11, v12, count);divide(v2, v6, v10, count);divide(v6, v12, v5, count);divide(v12, v11, v3, count);divide(v11, v8, v7, count);divide(v8, v2, v9, count);divide(v4, v10, v5, count);divide(v4, v5, v3, count);divide(v4, v3, v7, count);divide(v4, v7, v9, count);divide(v4, v9, v10, count);divide(v5, v10, v6, count);divide(v3, v5, v12, count);divide(v7, v3, v11, count);divide(v9, v7, v8, count);divide(v10, v9, v2, count);return new Float32Array(points);}function rad(deg) {return (deg * Math.PI) / 180;}function createShader(gl, type, source) {const shader = gl.createShader(type);gl.shaderSource(shader, source);gl.compileShader(shader);const success = gl.getShaderParameter(shader, gl.COMPILE_STATUS);if (!success) {throw new Error("could not compile shader -> " + source + gl.getShaderInfoLog(shader));}return shader;}function createProgram(gl, vertex, fragment) {const program = gl.createProgram();gl.attachShader(program, vertex);gl.attachShader(program, fragment);gl.linkProgram(program);const success = gl.getProgramParameter(program, gl.LINK_STATUS);if (!success) {throw new Error("program failed to link -> " + gl.getProgramInfoLog(program));}return program;}</script></div></body>
</html>

Sphere_Anim (gitee.io)

明日方舟页面球体动画相关推荐

  1. Spring+SpringMVC+MyBatis明日方舟版人员信息管理系统前端页面代码前后端交互+SSM框架 管理员登录 游客登录 普通用户登录 人员的增删改查 信息更新 图片上传 分页查询)

    Spring+SpringMVC+MyBatis明日方舟版人员信息管理系统前端页面代码(前后端交互+SSM框架 管理员登录 游客登录 普通用户登录 人员的增删改查 信息更新 图片上传 分页查询 修改密 ...

  2. outlook qr码在哪里_明日方舟兑换码在哪里输入 附1200合成玉兑换码

    明日方舟兑换码在哪里输入,附1200合成玉兑换码.明日方舟游戏中并没有设置兑换码直接兑换入口,需要玩家打开网页兑换,而且官服和b服地址不一样,一起来看看明日方舟兑换码在哪里输入,附1200合成玉兑换码 ...

  3. 明日方舟抽卡模拟器wiki_明日方舟兑换码地址官服介绍 官服兑换码地址

    明日方舟兑换码地址官服介绍,官服兑换码地址.周年庆典的兑换码大家换了吗,过几天就要过期了,一起来看看明日方舟兑换码地址官服介绍,官服兑换码地址. 兑换码有1200合成玉.高级作战记录等等. 兑换码:G ...

  4. 成为“能打”的二次元游戏《明日方舟》做对了什么?

    在讨论<明日方舟>及他所带来的影响与启示前,先说点有关故事背景的题外话. 作为一个P社玩家,罗德岛这三个字就会自然而然的想到医院骑士团(前期的根据地),提起骑士团就不得不说"Ar ...

  5. 按钮跳转到其他ui界面_《明日方舟》UI/UX设计复盘

    本文共3716,预计阅读时长8-15分钟. 文章首发于微信公众号「我的天空是你的大海」,欢迎关注! 如果你要问2019年的年度手游是什么,我的回答是<明日方舟>(下文简称"< ...

  6. 《明日方舟》游戏分析

    作者 游戏版本 角色等级 ox 0.7.28 48 游戏时长 通关主线 干员数量 36天 4-10 61 目录: 一.游戏系统架构 1.1 系统结构说明 1.1.1 Arknights游戏类型 1.1 ...

  7. 使用Python编写面向安卓模拟器的明日方舟挂机脚本

    前言 出于对明日方舟的热(嫌)爱(弃)和作为计算机专业学生特有的懒惰性质,我根据参考文章(地址见下文)编写了能在自己电脑上运行的明日方舟脚本.在近一年(其中退坑了半年)的运行和维护中,脚本代码被我不停 ...

  8. 桌宠必须要java吗_明日方舟讯使桌宠下载地址 如何与小讯使愉快玩耍

    罗德岛休息室持续上新,明日方舟游戏衍生内容(壁纸.表情包等)将会陆续上架.本期推荐作品为优质同人作品讯使桌宠,未来罗德岛休息室栏目将提供更多优质同人作品,在紧张激烈的战斗之余,别忘了多来罗德岛休息室看 ...

  9. 明日方舟统计寻访工具【附下载链接】

    链接在最后,如有需要请自取 前言 前段时间经过群友推荐,解除了一款[原神祈愿记录导出工具],我大受震惊,心想[明日方舟]何不出一个类似的工具,于是我拿出了我的[Python从入门到跑路] 原神祈愿记录 ...

最新文章

  1. python自学步骤-Python入门深度学习完整指南
  2. js控制select数据绑定下拉列表
  3. 如何在php中写内容,请问如何在内容模板中写标题和内容呢
  4. 【转】03.Dicom 学习笔记-DICOM C-Get 消息服务
  5. SAP License:SAP系统中的三类凭证
  6. 第7章 使用Spring MVC构建Web程序(一)
  7. Qt实现Areo效果_vortex_新浪博客
  8. 三容水箱液位控制系统_过程控制实验-三容水箱液位控制系统
  9. SAM-BA 2.14 reconfiguration----DIY你的sam-ba
  10. 2021年最近的猝死案例有点多!!!(关注我,让你活的更久一点)
  11. Android8 miui9使用,小米古董机刷完安卓8.0健步如飞!感觉比MIUI9还快
  12. MySQL查看当前数据库
  13. 在excel中等间距抽取数据
  14. Inventor冲压加强筋_Inventor教程之创建加强筋
  15. 顺序问题,母版页和内容页
  16. 【NOIP 2018 提高组】赛道修建
  17. Offer一个候选人的正确姿势
  18. ISO 5659-2塑料 烟生成 第2 部分:单室法测定烟密度试验方法
  19. 【Spring全家桶系列】Spring中bean标签的配置与使用
  20. 【C语言】从键盘任意输入一个3位整数,编程计算并输出它的逆序数(忽略整数前的正负号)。

热门文章

  1. Xsens MTi传感器 ROS下配置
  2. wifi连接的4次握手的过程
  3. (52)组件之摄像机组件
  4. 最牛逼程序员自我修养反观认识运动路-中国职场江湖的人情世故--喝酒应酬
  5. 泼辣修图(Polarr)是什么软件,有泼辣修图Polarr pro免费解锁版激活码吗?
  6. oracle语句求去年今月,ORACLE 如何写语句确定两个日期的月和日相同
  7. Windows 引导启动流程详述(BIOS-UEFI)
  8. ChatGPT与AI绘画,该上车了!
  9. 说说超链接 target 属性的取值和作用?
  10. centos8代理上网_CentOS如何设置各种代理上网?