Jack Huang's Blog


  • 首页

  • 标签

  • 归档

  • 搜索

glTF2.0格式解析

发表于 2019-12-25 | 更新于 2019-12-27

glTF(GL传输格式的衍生简称)是一种使用JSON标准的3D场景和模型的文件格式。 它是Khronos Group 3D格式工作组开发的一种与API无关的运行时资产交付格式。 它在HTML5DevConf 2016上宣布。此格式旨在成为一种高效,可互操作的格式,具有最小的文件大小和应用程序对运行时的处理。 因此,其创建者将其描述为“3D JPEG”。 glTF还为3D内容工具和服务定义了一种通用的发布格式。本文旨通过对glTF2.0格式的解析,进一步加深对3D建模的理解。

基本概念

在对glTF2.0格式解析之前,应先了解一些3D建模或glTF独有的基本概念:

  • scenes, nodes:场景的基本结构
  • cameras:场景的可视配置
  • meshes:构成3D对象的几何
  • buffers, bufferViews, accessors:数据参考和布局描述
  • materials:定义数据如何被渲染
  • textures, images, samplers:对象表面显示
  • skins:顶点蒙皮信息
  • animations:随时间改变的属性

glTF概念之间的关系

图1 glTF概念之间的关系

参考链接

  1. glTF,by KhronosGroup.
  2. glTF,by wikipedia.
  3. glTF Overview,by KhronosGroup.
  4. 骨骼蒙皮动画(SkinnedMesh)的原理解析,by feng.
  5. 【Unity3D】3D模型的使用——FBX的使用与Animation设置,by yongh701.

jszip使用方法简介

发表于 2019-12-24

当大文件需要在网络中传输时,最好进行压缩传输,然后在终点进行解压。以ZIP压缩为例,压缩后文件大小极具减小,可节约带宽,提高系统并发能力。下面介绍使用jszip在浏览器端的解压方法。

JSZip简介

JSZip是一个用于创建、读取和编辑.zip文件的javascript库,有一个可爱而简单的API。JSZip支持Nodejs和浏览器端的安装使用。具体方法如下:

1
2
3
4
5
6
7
With npm : npm install jszip

With bower : bower install Stuk/jszip

With component : component install Stuk/jszip

Manually : download JSZip and include the file dist/jszip.js or dist/jszip.min.js

浏览器端解压zip文件

后端Nodejs将zip文件以二进制形式存储到数据库中。当前端需要该zip文件时,后端将zip文件以二进制形式传输到前端,前端再解压还原。

Nodejs使用JSZip压缩文件

1
2
3
4
5
6
7
8
9
10
11
12
var JSZip = require("jszip");
var zip = new JSZip();

// create a file
zip.file("hello.txt", "Hello[p my)6cxsw2q");
// oops, cat on keyboard. Fixing !
zip.file("hello.txt", "Hello World\n");

// create a file and a folder
zip.file("nested/hello.txt", "Hello World\n");
// same as
zip.folder("nested").file("hello.txt", "Hello World\n");

浏览器端解压Zip文件

1
2
3
4
5
6
7
8
9
10
import JSZip from 'jszip'

let new_zip = new JSZip();

// Read zip package
new_zip.loadAsync(content)
.then(function(zip) {
// you now have every files contained in the loaded zip
new_zip.file("hello.txt").async("string");
});

参考链接

  1. ZIP格式,by wikipedia.
  2. gzip,bzip2,zip三种格式压缩率对比,by CatDeacon.
  3. JSZip,by stuk.

Python第三方包离线安装

发表于 2019-12-19 | 更新于 2024-01-09

需要在离线的情况下,配置电脑的Python环境,具体方法如下:

  1. 寻找一台与离线电脑架构一致且能上网的干净电脑或虚拟机,在线配置Python环境。
  2. 在线电脑上打包Python环境,拷贝到离线电脑上。
  3. 在离线电脑上安装Python环境。

注意:Python第三方包离线安装可以与python的虚拟环境结合起来,即:

1
python -m venv env

在线配置Python环境

安装Python3之后,使用如下命令安装第三方包:

1
2
# 临时使用清华镜像,加快Python第三方包下载速度
pip3 install -i https://mirrors.aliyun.com/pypi/simple/ matplotlib

打包安装的Python第三方包:

1
2
3
pip3 list #查看安装的包
pip3 freeze >requirements.txt
pip3 download -d C:\Python37\packages -i https://mirrors.aliyun.com/pypi/simple/ -r requirements.txt

离线配置Python环境

在离线电脑上安装与在线电脑同样版本和架构的Python。注意:3.9版本以上python已不支持Windows7。

将打包好的Python环境拷贝到离线电脑后,使用如下命令安装第三方包:

1
pip install --no-index --find-links=C:\Python37\packages -r requirements.txt

参考链接

  1. pypi 镜像使用帮助,by 清华大学开源软件镜像站.
  2. Python pip离线安装package方法总结(以TensorFlow为例),by 毛帅.
  3. 离线环境安装python第三方库,by 接纳自己.

C++中Cout输出到文件

发表于 2019-12-12

最近在调试一个C++程序时,没有报任何错误就直接退出了,Cout输出到控制台的信息没法查看,无法找到错误原因。于是想到将Cout输出重定向到文件,以便分析错误原因。具体代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
#include <fstream>

using namespace std;

int main(){
streambuf *psbuf,*backup;
ofstream file;
file.open("test.txt");
backup=cout.rdbuf();
psbuf=file.rdbuf();

cout.rdbuf(psbuf);//将cout输出重定向到文件
cout<< "This will write to test.txt!";

cout.rdbuf(backup);//恢复cout输出重定向到终端
file.close();
return 0;
}

参考链接

  1. NULL指针、零指针、野指针,by fly1988happy.
  2. C++ Null 指针,by w3cschool.
  3. How to redirect cin and cout to files?,by stackoverflow.

红外点源目标探测仿真

发表于 2019-12-11

红外点源目标探测仿真过程中遇到两个问题:一是哪些目标重合到一块,二是如何计算重合目标的中心和半径。这两个问题可分别通过计算图连通分量的算法和最小圆覆盖算法解决。

参考链接

  1. 最小圆覆盖(经典算法【三点定圆),by Coco_T_.
  2. 利用邻接矩阵求解无向图的连通分支的个数,by EsonJohn.
  3. 使用向量叉乘判断线段是否相交并求交点,by leto.
  4. 图的那点事儿(1)-无向图,by SylvanasSun.

C++矩阵的存储方法接出存储方法-行主序与列主序

发表于 2019-12-11

最近要设计一个C++矩阵类,涉及到矩阵元素的存储。根据矩阵元素的存储,通常分为行主序和列主序。

  • 行主序是指以行为优先单位,在内存中逐行存储;

  • 列主序是指以列为优先单位,在内存中逐列存储。

行主序与列主序的代码实现有一定的惯例,表现如下:

  • 行主序以二维数组存储,列主序以一维数组存储;
  • 行主序以二维数组方式命名初始化参数,列主序以一维数组方式命名初始化参数;
  • 行主序以行为单位初始化,列主序以列为单位初始化;

参考链接

  1. OpenGL中矩阵的行主序与列主序,by 天律界中子.

GSL插值函数编译链接出错解决方法

发表于 2019-12-11 | 更新于 2022-07-16

在Windows平台使用VS2017社区版将开源数学库GSL编译链接成DLL后,使用官方示例测试其插值函数。在编译链接该示例过程中报

LNK2001: unresolved external symbol _gsl_interp_cspline

的错误。

解决方法如下,在示例开始处定义如下宏即可。

#define GSL_DLL

完整可运行示例如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#define GSL_DLL

#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <gsl/gsl_errno.h>
#include <gsl/gsl_spline.h>

int
main (void)
{
int i;
double xi, yi, x[10], y[10];

printf ("#m=0,S=17\n");

for (i = 0; i < 10; i++)
{
x[i] = i + 0.5 * sin (i);
y[i] = i + cos (i * i);
printf ("%g %g\n", x[i], y[i]);
}

printf ("#m=1,S=0\n");

{
gsl_interp_accel *acc
= gsl_interp_accel_alloc ();
gsl_spline *spline
= gsl_spline_alloc (gsl_interp_cspline, 10);

gsl_spline_init (spline, x, y, 10);

for (xi = x[0]; xi < x[9]; xi += 0.01)
{
yi = gsl_spline_eval (spline, xi, acc);
printf ("%g %g\n", xi, yi);
}
gsl_spline_free (spline);
gsl_interp_accel_free (acc);
}
return 0;
}

参考链接

  1. Interpolation,by gsl homepage.
  2. [Help-gsl] LNK2001: unresolved external symbol _gsl_interp_cspline,by lists.gnu.org.
  3. [Help-gsl] Re: LNK2001: unresolved external symbol _gsl_interp_cspline,by lists.gnu.org.
  4. C++求积分代码,by Firekisser.
  5. matlab代码—插值,by 从小练武功.

企事业单位IT架构的涅槃与重生之中台

发表于 2019-12-08 | 更新于 2019-12-11

近年来,企事业单位IT建设如火如荼,取得了很多的成果,极大地提高了企事业单位的工作效率。但同时企事业IT建设中存在的数据管理问题、业务管理问题不容忽视。在企事业单位IT建设的早期,项目之间没有整体规划,缺乏统一管理,造成数据孤岛、数据标准化缺失、数据存储杂乱、数据使用泛滥等数据管理问题,同时业务方面也存在重复建设、人亡政息、部门分割、多头管理等业务管理问题。中台架构即是针对上述问题,对企事业IT建设的涅槃和重生。

中台由来

在传统企业IT架构中,通常分成前台和后台。前台即包括各种和用户直接交互的界面,比如web页面、手机app;也包括服务端各种实时响应用户请求的业务逻辑,比如商品查询、订单系统等等。而后台并不直接面向用户,而是面向运营人员的配置管理系统,比如商品管理、物流管理、结算管理。后台为前台提供了一些简单的配置。

在企业竞争不够激烈时,这种IT架构能够满足用户需求,虽然易造成数据冗余、数据孤岛、数据杂乱等问题。而今天随着互联网的蓬勃发展,企业竞争越来越激烈,用户也越来越挑剔。只有以用户为中心,快速影响用户的需求,不断迭代和试错,才能让企事业在竞争当中立于不败,才能更加满足用户的需求。于是中台架构应运而生。

中台架构本质上是对传统前后台IT架构的重构,尤其是后台的重构。在传统的IT架构中,通常会遇到如下两类问题:

  • 一类是,许多业务需求或功能需求高度类似、通用化程度很高,但是由于没有专门的团队负责规划和开发,大量的系统重复开发、重复建设,导致复用性低、效率低、产研资源浪费、用户体验不统一。
  • 另一类是,早期业务发展过程中,为了解决一些当下的业务问题,垂直的、个性化的业务逻辑与基础系统耦合太深,由于没有平台性质的规划,横向系统之间、上下游系统之间的交叉逻辑也非常多,这样导致在新业务、新市场的拓展过程中,系统没法直接复用,甚至没法快速迭代。

这两类问题,在软件开发领域,有专门的名称,叫做“重复造轮子”和“烟囱式架构”。中台的诞生即为了避免“重复造轮子”的尴尬和“烟囱式架构”的无序发展。

中台是真正为前台而生的平台(可以是技术平台,业务能力甚至是组织机构),它存在的唯一目的就是更好的服务前台规模化创新,进而更好的响应服务引领用户,使企业真正做到自身能力与用户需求的持续对接。

中台就像是在前台与后台之间添加的⼀组“变速⻮轮”,将前台与后台的速率进行匹配,是前台与后台的桥梁。它为前台而生,易于前台使用,将后台资源顺滑流向用户,响应用户。

中台价值

中台的存在价值是为它的客户服务,比如业务中台和数据中台要快速响应前台应用的需求。中台建设的价值,在于帮助企业搭建更加适应企业数字化转型的全新IT架构。或者说,中台架构本身就是企业全新IT架构的核心内容和骨干系统,让企业IT运营更加顺畅,更能帮助企业尝试新的商业模式,完成战略转型的目的。

中台构建

根据功能和角色的不同,中台可分为:

  • 业务中台:通过各个项目的共通业务进行下沉,整合成通用的服务平台。
  • 技术中台:为了避免研发人员重复发明轮子,向各个项目提供通用的底层框架、引擎、中间件。
  • 数据中台:为各个项目进行各种数据采集和分析。
  • 算法中台:为各个项目提供算法能力,比如推荐算法、搜索算法、图像识别、语音识别等等。

参考链接

  1. 漫画:什么是中台?,by 程序员小灰.
  2. 互联网公司中所谓中台是怎么定义的?,by zhihu.
  3. 白话中台战略:中台是个什么鬼?,by 王健.
  4. 中台战略全解读(一):中台的发展与进化,by 陈新宇等.

三阶魔方复原方法简介

发表于 2019-11-30 | 更新于 2019-12-02

魔方作为家喻户晓的益智玩具,由匈牙利建筑学教授暨雕塑家鲁比克·艾尔内于1974年发明,最初的名称叫Magic Cube[2],1980年Ideal Toys公司于贩售此玩具,并将名称改为Rubik’s Cube。下面简要介绍魔方复原的方法。

魔方公式书写方式

为了记录下复原、转乱的过程或公式的步骤,会用Singmaster符号来书写(由David Singmaster发明)。书写方式如下:

  • R(Right)、L(Left)、U(Up)、D(Down)、F(Front)、B(Back)分别代表右、左、上、下、前、后层。
  • 若是顺时针旋转,则直接写上符号;若是逆时针旋转,则在符号后加上“’”或是“i”;若是旋转180°,则在符号后加上“2”或是“²”。

魔方数学方程式

变化数

三阶魔方的总变化数是:

$${\displaystyle {\frac {8!\times 3^{8}\times 12!\times 2^{12}}{2\times 2\times 3}}=43,!252,!003,!274,!489,!856,!000\approx 4.33\times 10^{19}}$$

三阶魔方总变化数的算式是这样得来:

  • 8个角块可以互换位置(${\displaystyle 8!}$),也可以旋转(3),但不能单独旋转一个角块,所以总共有${\displaystyle {\frac {8!\times 3^{8}}{3}}}$种变化状态。

  • 12个边块可以互换位置($12!$),也可以翻转(2),但不能单独翻转一个边块(将两个面对调),也不能单独交换两边块,所以总共有${\displaystyle {\frac {12!\times 2^{12}}{2\times 2}}}$种变化状态。

上帝的数字

所有的三阶魔方都可以在有限步数内复原,1982年,佛雷与辛马斯特合著的《魔方手册》定义任意的三阶魔方都可以保证最少n步复原,并称呼n为上帝的数字。在此书中,证明上帝的数字介于17~52之间。

1995年,瑞德证明上帝的数字介于20-29之间。2006年,雷杜用群论证明上界可改进为27。

2007年,计算机科学家古柏曼与他的学生用20台超级电脑花了8000个小时证明上界可改进为26。

2008年,Tomas Rokicki宣布证明了任何魔方可以在25步以内解开[22]。之后又改进为22步。

2010年,包括Tomas Rokicki和Morley Davidson等人的研究团队证明任意组合的魔方可以在20步内还原,现在上帝的数字正式定为20。

魔方复原方法

以白色面为例,说明魔方复原的简单方法。

第一步白色面的复原

第一步白色面的复原非常简单,分成两小步,如图1和图2所示。

解决白色边缘

图1 解决白色边缘

解决白色角落

图2 解决白色角落

白色面的还原比较简单,就不介绍具体步骤了。

第二步中间层的复原

第二步中间层的复原分成两种情况,如图3和图4所示。

中间层左侧边块的复原

U' L' U L U F U' F'
图3 中间层左侧边块的复原

中间层右侧边块的复原

U R U' R' U' F' U F
图4 中间层右侧边块的复原

第三步顶层的复原

第三步最后一层的还原遇到的情况很多,目前我也没有完全搞明白,下面简单介绍最后一层复原的步骤,但并不能保证一定能复原。

形成顶层十字

顶层十字的复原

F R U R' U' F'
图5 顶层十字的复原

根据顶层状态,多次使用公式F R U R’ U’ F’,以形成顶部十字。

交换顶层十字边块

交换顶层边块,使其边缘颜色保持一致,如图6所示。

交换顶层边块

R U R' U R U2 R' U
图6 交换顶层边块

交换顶层角块

现在只剩下黄色的角落,将分两个步骤进行。首先,我们必须以定位它们,在下一步骤中定向它们。

定位顶层角块

定位顶层角块

U R U' L' U R' U' L
图7 定位顶层角块

此算法循环上面图像上顶层的角块,但标有“OK”的前右上角将保留在原位。

定向顶层角块

现在顶层角块都已定位,但角块颜色与周围面不一致,使用如图8所示算法一个一个旋转顶层角块。

定向顶层角块

R' D' R D
图8 定向顶层角块

首先在突出显示的右前方点,拿着你的手有一个不对准的黄色角落的立方体(见图8)。重复R’ D’ R D算法,直到这一块在它的地方与黄色贴纸。

只将一面向上转动,将另一个错误的黄色拐角移到突出显示的点,并重复R’ D’ R D算法,直到这个黄色面被解决。

移动其他未对齐的黄色边角,一个一个到标记的点,并做公式,直到所有的黄色角落都被解决。

顶层最后两个角块位置对颜色不对的复原方法

将色向不对的两个角放在顶层左手边位置,用公式(R;U;R’;U;R;U2;R’;)(L’;U’;L;U’;L’;U2;L;)。

做一遍如果不对的话,就再做一遍就行了.

参考链接

  1. 如何解决魔方 魔方,by cub3x3.
  2. 三阶魔方解法最后两个角如何复原?位置是对的只是颜色对不住?,by qiuyuhanfeng.
  3. 魔方,by wikipedia.
  4. 暴强!!!只需7步,任何魔方6面皆可还原!,by 飞天飘渺.

Eigen入门教程

发表于 2019-11-27

Eigen是用于线性代数的C ++模板库,包括矩阵,向量,数值求解器和相关算法。

安装

从Eigen官网下载最新的Eigen版本。解压Eigen,然后使用Cmake进行配置并生成Visual Studio 15 2017的工程。打开解决方案,先生成ALL_BUILD工程,再生成INSTALL工程,则安装Eigen完毕。将在安装路径下生成Eigen的头文件。

当然也可以不编译安装,直接将Eigen源代码目录下的Eigen子目录复制到Include文件夹即可。

示例

运行时推断矩阵尺寸示例

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
#include <Eigen/Dense>
using namespace Eigen;
using namespace std;
int main()
{
MatrixXd m = MatrixXd::Random(3,3);
m = (m + MatrixXd::Constant(3,3,1.2)) * 50;
cout << "m =" << endl << m << endl;
VectorXd v(3);
v << 1, 2, 3;
cout << "m * v =" << endl << m * v << endl;
}

编译时确定矩阵尺寸示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
	
#include <iostream>
#include <Eigen/Dense>
using namespace Eigen;
using namespace std;
int main()
{
Matrix3d m = Matrix3d::Random();
m = (m + Matrix3d::Constant(1.2)) * 50;
cout << "m =" << endl << m << endl;
Vector3d v(1,2,3);

cout << "m * v =" << endl << m * v << endl;
}

参考链接

  1. Getting started,by eigen home.
上一页1…313233…53下一页

Jack Huang

523 日志
67 标签
© 2025 Jack Huang
由 Hexo 强力驱动
|
主题 — NexT.Muse