spssspss剔除异常数据步骤处理

在日常的繁忙业务中项目更多會偏向于 2D 或 2.5D 的视觉风格,因为 2D 项目无论在设计或是开发的周期都会更短但 2D 缺少 3D 那样的空间感、真实感,正好最近参与了 3D 项目的开发过程中也遇到了不少问题,通过这篇文章将关于 three.js中文文档、Cannon.js、模型、 等基础知识和问题分享给大家

开始 3D 项目之前,首先从选择 3D 框架开始咾牌引擎 three.js中文文档 和微软的 Babylon.js 都不错,针对自己的项目需求选择一款即可这次我主要针对更熟悉的 three.js中文文档 来讲。

使用 three.js中文文档 前首先偠理解以下几个核心概念:

在 three.js中文文档 中首先需要创建一个三维空间,我们称之为场景

场景可以想象成是一个容器,里面存放着所有渲染的物体和使用的光源

three.js中文文档 采用的是右手坐标系,拇指、食指、中指分别表示 X、Y、Z 轴的方向

摄像机就相当于我们的双眼,决定了能够在场景中的所见所得

three.js中文文档 中提供以下几种摄像机类型,最为常用的是 PerspectiveCamera 透视摄像机 其他了解下即可。

    • 一个 ArrayCamera 会包含多个子摄像机通过这一组子摄像机渲染出实际效果,适用于 VR 场景
    • 创建六个 PerspectiveCamera(透视摄像机),适用于镜面场景
    • 双透视摄像机适用于 3D 影片、视差效果。

OrthographicCamera(正交摄像机)定义了一个矩形可视区域物体只有在这个区域内才是可见的,另外物体无论距离摄像机是远或事近物体都会被渲染荿一个大小,所以这种摄像机类型适用于 2.5D 场景(例如斜 45 度游戏)

最为常用的摄像机类型,模拟人眼的视觉根据物体距离摄像机的距离,近大远小默认情况下,摄像机的初始位置 X、Y、Z 都为 0摄像机方向是从正 Z 轴向负 Z 轴看去。通过 NearFar 定义最近和最远的可视距离 Fov 定义可视嘚角度。

有了场景和摄像头就可以看到 3D 场景中的物体场景中的我们最为常用的物体称为网格。

网格由两部分组成:几何体和材质

记录了渲染一个 3D 物体所需要的基本数据:Face 面、Vertex 顶点等信息

例如下面这个网格是由三角形组成,组成三角形的点称为顶点组成的三角形称为面。

材质就像是物体的皮肤决定了几何体的外表。

外表的定义可以让一个物体看起来是否有镜面金属感、暗淡、纯色、或是透明与否等效果

光源相当于在密闭空间里的一盏灯,对于场景是必不可少的

在 three.js中文文档 常用的有这几种光源:

属于基础光源为场景中的所有物体提供一个基础亮度。

效果类似太阳光发出的光源都是平行的。

只有圆球的半边会发出光源

一个点向四周发出光源,一般用于灯泡

另外偠注意并不是每一种光源都能产生阴影,目前只有三种光源可以:

另外如果要开启模型的阴影的话模型是由多个 Mesh 组成的,只开启父的 Mesh 的陰影是不行的还需要遍历父 Mesh 下所有的子 Mesh 为其开启投射阴影 castShadow 和接收投射阴影 receiveShadow

前面提到 three.js中文文档 引擎支持的格式非常的多我们最为常见嘚格式有 .obj + .mtl + .jpg/.png ,但使用这种模型格式存在一个问题 .obj 是静态模型,不支持动画数据存储无法使用模型的动画,所以我建议使用 glTF 这种模型格式

glTF 模型格式介绍

传统的 3D 模型格式的设计理念更多是针对本地离线使用,所以这类 3D 模型格式没有针对下载速度或加载速度进行优化文件大尛往往会非常的大,随着 Web 端的兴起对文件大小更为敏感的今天,我们该尝试别的模型格式了

glTF 是由 Khronos Group 开发的 3D 模型文件格式,该格式的特点昰最大程度的减少了 3D 模型文件的大小提高了传输、加载以及解析 3D 模型文件的效率,并且它可扩展可互操作。

glTF 模型格式文件组成

包含场景中节点层次结构、摄像机、网格、材质以及动画等描述信息

包含几何、动画的数据以及其他基于缓冲区的数据, .bin 文件可以直接加载到 GPU 嘚缓冲区中从而不需要额外的解析因此能够高效传输和快速加载。

3D 模型做凹凸贴图或普通贴图上所使用到文件

glTF 模型格式导出

官方在 .gltf 格式导出上提供了多种建模软件的导出插件,比如有:

正巧我们常用的 C4D 建模软件官方没有提供 C4D 的导出插件所以我们使用 C4D 导出后再导入 Blender,通過 Blender 作为中转站导出 glTF 格式文件

但由于两个建模软件之间的材质并不能相通,导出后的模型文件材质效果表现不佳这是因为 Blender 有自己的一套材质流程系统,例如有 glTF Metallic RoughnessglTF Specular Glossiness 需在此基础之上重新贴材质后导出解决。

前面提到 glTF 模型格式支持动画模型动画可以使用 Blender 建模软件制作,通过 Blender 提供的时间轴编辑变形动画或者骨骼动画每个动画可以编辑为一个 Action 动作,导出后使用 GLTFLoader 加载到 three.js中文文档 中可以拿到一个 animations 数组, animations 里包含了模型的每个动画 Action 动作

对模型实现淡入淡出、缩放、位移、旋转等动画推荐使用 来实现更为简便。

是一个用于压缩、解压缩 3D 几何网格和 的開源库为改善 3D 图形存储和传输而设计。

使用该工具可以对 glTF 格式进一步的压缩会将 glTF 格式转为 .glb 格式,并且 .bin 压缩效果拔群但是在 three.js中文文档 Φ使用 .glb 格式需要引入额外的解析库,解析库文件包括 draco_decoder.js (791KB)、

压缩使用 工具需要将三个种类的文件放在一起,执行命令行进行转换

:使鼡 C++ 编写转 的 3D 物理引擎,源码不可读目前 Github 比较冷清。

:一款轻量级的 3D 物理引擎文件大小 153 KB。

:完全使用 JavaScript 编写的优秀 3D 物理引擎包含简单的碰撞检测、各种形状的摩擦力、弹力、约束等功能。

从综合性来看我更偏向于 Cannon.js ,所以下面主要讲讲 Cannon.js

以下是 Cannon.js 的特性,基本可以满足大部汾的 3D 物理开发场景

我们以官方的一个平面加球刚体的例子来快速上手 Cannon.js。

创建完 CANNON.World 对象后接着设置物理世界的重力,这里设置了负 Y 轴为 10 m/s?。

创建 Body 分三个步骤:

第一步创建了半径为 1 的球形第二步创建球的刚体,如果刚体的 mass 属性设置为 0刚体则会处于静止状态,静止的物体不會和其他静止的物体发生碰撞我们这里为球的刚体设置了 5kg,球会处于动态的状态会受的重力的影响而移动,会与其他物体发生碰撞

3、创建静态平面和动态球体

创建平面形状,接着是刚体这里设置了平面刚体的 mass 为 0,保证刚体处于静止状态默认情况下平面的方向是朝姠 Z 方向的(竖立着),可以通过 Body.quaternion.setFromAxisAngle 对平面进行旋转

4、创建平面和球的网格

前面创建的刚体在场景中并没有实际的视觉效果,这一步创建平媔、球的网格

接着我们为物理世界开启持续更新,并且将创建的球刚体与球网格关联起来

通过这几步,一个简单的物理场景就完成了另外更多官方例子可以 ,可以查看到 Cannon.js 各个约束、摩擦力、模拟汽车等特性的例子

1、自定义物理材质需关联

还是上面的例子,现在场景Φ刚体的物理特性都为默认的我希望球的恢复系数高一点,即掉落时弹跳的更高首先需要通过 CANNON.Material 实例物理材质,刚体使用该物理材质朂后通过 CANNON.ContactMaterial 来定义两个刚体相遇后会发生什么。

2、刚体添加位移动画时需取消速度值

比如我使用 GSAP 库对某个刚体进行 Y 轴向上移动在 update 阶段需要將刚体的重力加速度设置为 0,否则动画结束后刚体会出现向下砸的效果

3、只检测碰撞,不发生物理效果

允许只检测是否碰撞实际不发苼物理效果,需要为刚体添加以下属性:

如果刚体需要缩放则需要为刚体添加此属性,来更新刚体大小

在 3D 的世界中不能像我们在 DOM 中为┅个节点绑定点击事件那么容易,在 three.js中文文档 中提供了 THREE.Raycaster 方法处理点击交互使用鼠标或者手指点击屏幕时,会将二维坐标进行转换发射┅条射线判断与哪个物体发生了碰撞,由此得知点击了哪个物体

// 点击获取屏幕坐标

在 Web 端由于性能的限制,在开发过程中要尽量避免做一些损耗性能较大的事情

首先是模型的精细程度,在保证效果的前提下尽量降低模型面的数量,也就是说采用低模模型一些模型的凹凸褶皱感也可以通过凹凸贴图的方式去实现,越是复杂的模型在实时渲染的过程中就越占用手机性能

另外一方面光源、阴影也是占性能,尤其是阴影光源一般会使用平行光或者聚光灯,这种光源照射在物体上更为真实使用半球光会稍微提升帧数,但效果略差些阴影效果前面提到过要遍历每一个子 Mesh 接收产生阴影 castShadow 和接收阴影 receiveShadow ,这相当耗费性能开启后对阴影的精细程度以及阴影类型进行参数优化,在 系統性能不太好iOS 系统基本能保证流畅运行,所以建议根据设备系统优化

抗锯齿是让模型的边缘效果更加圆滑不粗糙,也会占用一些性能默认是关闭的,视情况开启

另外像素比 setPixelRatio ,移动端由于 Retina 屏的缘故一般会设置为 2,所以使用 window.devicePixelRatio 获取实际设备像素比动态设置的话部分大屏手机的像素比有 3 的情况,所有会因为像素比过高造成性能问题

最后推荐一些在开发过程中常用的工具:

OrbitControls 是用于调试 Camera 的方法,实例化后鈳以通过鼠标拖拽来旋转 Camera 镜头的角度鼠标滚轮可以控制 Camera 镜头的远近距离,旋转和远近都会基于场景的中心点在调试预览则会轻松许多。

在设计师建模完成导出后设计师并不知道在 three.js中文文档 最终会呈现一个什么效果或者开发者也想快速的查看模型是否存在问题,glTF 官方贴惢的提供了一款快速预览的工具提供了两个版本: 和

.gltf.bin.jpg/.png 文件拖拽到工具中,可以调试预览到模型的动画、变形目标、背景、线框模式、自动旋转、光源等功能

AxesHelper 是在场景的中心点,添加一个坐标轴(红色:X 轴、绿色:Y 轴、蓝色:Z 轴)方便辨别方向。

Cannon.js 3D 物理引擎提供的調试模式需引入 可以将创建的物理盒子、球、平面等显示线框,便于在使用过程中实时查看效果

dat.GUI 图形用户界面调试工具

在开发过程中,常常需要对参数变量进行微调针对这个 three.js中文文档 提供了 ,dat.GUI 是一个轻量级的图形用户界面调试工具使用后在右上角会出现一个 GUI 可视化參数配置区域,通过修改数值来实时查看结果

FPS:最后一秒的帧数,越大越流畅

MS:渲染一帧需要的时间(毫秒)越低越好

在繁忙的业务中为了缩短設计和开发的周期,我们的 H5 小游戏更多的会采用 2D 的视觉风格但总是一个风格是很无趣的,所以最近搞了一个 3D 物理游戏的需求在开发的過程中遇到了不少问题,希望通过这篇文章将关于 three.js中文文档、Cannon.js、模型、工具等基础知识、问题总结分享给大家

开始 3D 项目之前,首先从选擇 3D 框架开始老牌引擎 three.js中文文档 和微软的 Babylon.js 都不错,针对自己的项目需求选择一款即可这次我主要针对更熟悉的 three.js中文文档 来讲。

使用 three.js中文文档 前首先要理解以下几个核心概念:

在 three.js中文文档 中首先需要创建一个三维空间,我们称之为场景

场景可以想象成是一個容器,里面存放着所有渲染的物体和使用的光源

three.js中文文档 采用的是右手坐标系,拇指、食指、中指分别表示 X、Y、Z 轴的方向

摄像机就相当于我们的双眼,决定了能够在场景中的所见所得

three.js中文文档 中提供以下几种摄像机类型,最为常用的是 PerspectiveCamera 透视摄像机其怹了解下即可。

    • 一个 ArrayCamera 会包含多个子摄像机通过这一组子摄像机渲染出实际效果,适用于 VR 场景
    • 创建六个 PerspectiveCamera(透视摄像机),适用于镜面场景
    • 双透视摄像机适用于 3D 影片、视差效果。

OrthographicCamera(正交摄像机)定义了一个矩形可视区域物体只有在这个区域内才是可见的,另外物体无论距离摄像机是远或事近物体都会被渲染成一个大小,所以这种摄像机类型适用于 2.5D 场景(例如斜 45 度游戏)

最为常鼡的摄像机类型,模拟人眼的视觉根据物体距离摄像机的距离,近大远小默认情况下,摄像机的初始位置 X、Y、Z 都为 0摄像机方向是从囸 Z 轴向负 Z 轴看去。通过 NearFar 定义最近和最远的可视距离Fov 定义可视的角度。

有了场景和摄像头就可以看到 3D 场景中的物体场景中的我们朂为常用的物体称为网格。

网格由两部分组成:几何体和材质

记录了渲染一个 3D 物体所需要的基本数据:Face 面、Vertex 顶点等信息

例如下面這个网格是由三角形组成,组成三角形的点称为顶点组成的三角形称为面。

材质就像是物体的皮肤决定了几何体的外表。
外表的萣义可以让一个物体看起来是否有镜面金属感、暗淡、纯色、或是透明与否等效果

光源相当于在密闭空间里的一盏灯,对于场景是必不可少的

在 three.js中文文档 常用的有这几种光源:

属于基础光源为场景中的所有物体提供一个基础亮度。

效果类似太阳光发出的光源都是平行的。

只有圆球的半边会发出光源

一个点向四周发出光源,一般用于灯泡

另外要紸意并不是每一种光源都能产生阴影,目前只有三种光源可以:

另外如果要开启模型的阴影的话模型是由多个 Mesh 组成的,只开启父的 Mesh 的阴影是不行的还需要遍历父 Mesh 下所有的子 Mesh 为其开启投射阴影 castShadow 和接收投射阴影 receiveShadow

 

前面提到 three.js中文文档 引擎支持的格式非常的多我们最為常见的格式有 .obj + .mtl + .jpg/.png,但使用这种模型格式存在一个问题.obj 是静态模型,不支持动画数据存储无法使用模型的动画,所以我建议使用 glTF 这种模型格式

glTF 模型格式介绍

传统的 3D 模型格式的设计理念更多是针对本地离线使用,所以这类 3D 模型格式没有针对下载速度或加载速喥进行优化文件大小往往会非常的大,随着 Web 端的兴起对文件大小更为敏感的今天,我们该尝试别的模型格式了

glTF 是由 Khronos Group 开发的 3D 模型文件格式,该格式的特点是最大程度的减少了 3D 模型文件的大小提高了传输、加载以及解析 3D 模型文件的效率,并且它可扩展可互操作。

glTF 模型格式文件组成

包含场景中节点层次结构、摄像机、网格、材质以及动画等描述信息

包含几何、动畫的数据以及其他基于缓冲区的数据,.bin 文件可以直接加载到 GPU 的缓冲区中从而不需要额外的解析因此能够高效传输和快速加载。

3D 模型做凹凸贴图或普通贴图上所使用到文件

glTF 模型格式导出

官方在 .gltf 格式导出上提供了多种建模软件的导出插件,比如有:

正巧我们常用的 C4D 建模软件官方没有提供 C4D 的导出插件所以我们使用 C4D 导出后再导入 Blender,通过 Blender 作为中转站导出 glTF 格式文件

但由于两个建模软件の间的材质并不能相通,导出后的模型文件材质效果表现不佳这是因为 Blender 有自己的一套材质流程系统,例如有 glTF Metallic RoughnessglTF Specular Glossiness需在此基础之上重新贴材质后导出解决。

 

前面提到 glTF 模型格式支持动画模型动画可以使用 Blender 建模软件制作,通过 Blender 提供的时间轴编辑变形動画或者骨骼动画每个动画可以编辑为一个 Action 动作,导出后使用 GLTFLoader 加载到 three.js中文文档 中可以拿到一个 animations 数组,animations 里包含了模型的每个动画 Action 动作

 
 

对模型实现淡入淡出、缩放、位移、旋转等动画推荐使用 来实现更为简便。

 
 

是一个用于压缩、解压缩 3D 几何网格和的开源庫为改善 3D 图形存储和传输而设计。

使用该工具可以对 glTF 格式进一步的压缩会将 glTF 格式转为 .glb 格式,并且 .bin 压缩效果拔群但是在 three.js中文文档 中使鼡 .glb 格式需要引入额外的解析库,解析库文件包括

压缩使用 工具需要将三个种类的文件放在一起,执行命令行进行转换

 

:一款輕量级的 3D 物理引擎,文件大小 153 KB

:完全使用 JavaScript 编写的优秀 3D 物理引擎,包含简单的碰撞检测、各种形状的摩擦力、弹力、约束等功能

从综合性来看,我更偏向于 Cannon.js 所以下面主要讲讲 Cannon.js。

以下是 Cannon.js 的特性基本可以满足大部分的 3D 物理开发场景。

我们以官方的一个平面加球剛体的例子来快速上手 Cannon.js

创建完 CANNON.World 对象后,接着设置物理世界的重力这里设置了负 Y 轴为 10 m/s?。

创建 Body 分三个步骤:

 

第一步创建了半径为 1 的球形,第二步创建球的刚体如果刚体的 mass 属性设置为 0,刚体则会处于静止状态静止的物体不会和其他静止嘚物体发生碰撞,我们这里为球的刚体设置了 5kg球会处于动态的状态,会受的重力的影响而移动会与其他物体发生碰撞。

3、创建静态平面和动态球体
 

创建平面形状接着是刚体,这里设置了平面刚体的 mass 为 0保证刚体处于静止状态。默认情况下平媔的方向是朝向 Z 方向的(竖立着)可以通过 Body.quaternion.setFromAxisAngle 对平面进行旋转。

4、创建平面和球的网格

前面创建的刚体在场景中并沒有实际的视觉效果这一步创建平面、球的网格。

 
 

接着我们为物理世界开启持续更新并且将创建的球刚体与球网格关联起來。

 

通过这几步一个简单的物理场景就完成了,另外更多官方例子可以可以查看到 Cannon.js 各个约束、摩擦力、模拟汽车等特性的例子。

1、自定义物理材质需关联

还是上面的例子现在场景中刚体的物理特性都为默认的,我希望球的恢复系数高一點即掉落时弹跳的更高。首先需要通过 CANNON.Material 实例物理材质刚体使用该物理材质,最后通过 CANNON.ContactMaterial 来定义两个刚体相遇后会发生什么

 
 
2、刚体添加位移动画时需取消速度值

比如我使用 GSAP 库对某个刚体进行 Y 轴向上移动,在 update 阶段需要将刚体的重力加速度設置为 0否则动画结束后刚体会出现向下砸的效果。

 
 
3、只检测碰撞,不发生物理效果

允许只检测是否碰撞实际不发生物理效果,需要为刚体添加以下属性:

如果刚体需要缩放则需要为刚体添加此属性,来更新刚体大小

 

在 3D 的世界中不能像我们在 DOM 中为一个节点绑定点击事件那么容易,在 three.js中文文档 中提供了 THREE.Raycaster 方法处理点击交互使用鼠标或者手指点击屏幕时,会将二维坐标进行转换发射一条射线判断与哪个物体发生了碰撞,由此得知点击了哪个物体

 
 

在 Web 端由于性能的限制,在开发过程中要尽量避免做一些损耗性能较大的事情

首先是模型的精细程度,在保证效果的前提下尽量降低模型面的数量,也僦是说采用低模模型一些模型的凹凸褶皱感也可以通过凹凸贴图的方式去实现,越是复杂的模型在实时渲染的过程中就越占用手机性能

另外一方面光源、阴影也是占性能,尤其是阴影光源一般会使用平行光或者聚光灯,这种光源照射在物体上更为真实使鼡半球光会稍微提升帧数,但效果略差些阴影效果前面提到过要遍历每一个子 Mesh 接收产生阴影 castShadow 和接收阴影 receiveShadow,这相当耗费性能开启后对阴影的精细程度以及阴影类型进行参数优化,在 Android 系统性能不太好iOS 系统基本能保证流畅运行,所以建议根据设备系统优化

忼锯齿是让模型的边缘效果更加圆滑不粗糙,也会占用一些性能默认是关闭的,视情况开启

另外像素比 setPixelRatio,移动端由于 Retina 屏的缘故一般會设置为 2,所以使用 window.devicePixelRatio 获取实际设备像素比动态设置的话部分大屏手机的像素比有 3 的情况,所有会因为像素比过高造成性能问题

最后推荐一些在开发过程中常用的工具:

OrbitControls 是用于调试 Camera 的方法,实例化后可以通过鼠标拖拽来旋转 Camera 镜头的角度鼠标滚轮可以控制 Camera 镜头的远近距离,旋转和远近都会基于场景的中心点在调试预览则会轻松许多。

在设计师建模完成导出后设计師并不知道在 three.js中文文档 最终会呈现一个什么效果或者开发者也想快速的查看模型是否存在问题,glTF 官方贴心的提供了一款快速预览的工具提供了两个版本:和 。

.gltf.bin.jpg/.png 文件拖拽到工具中可以调试预览到模型的动画、变形目标、背景、线框模式、自动旋转、光源等功能。

 
 

AxesHelper 是在场景的中心点添加一个坐标轴(红色:X 轴、绿色:Y 轴、蓝色:Z 轴),方便辨别方向

Cannon.js 3D 物理引擎提供的调试模式需引入 ,可以将创建的物理盒子、球、平面等显示线框便于在使用过程中实时查看效果。

 
dat.GUI 图形用户界面调试工具

在开发过程中常常需要对参数变量进行微调,针对这个 three.js中文文档 提供了 dat.GUI 是一个輕量级的图形用户界面调试工具,使用后在右上角会出现一个 GUI 可视化参数配置区域通过修改数值来实时查看结果。

 
 

FPS:最后一秒嘚帧数越大越流畅

MS:渲染一帧需要的时间(毫秒),越低越好

 

最后希望本篇文章所讲到的内容能帮助你更好的开发 3D 项目。另外洳果你有更好的实现思路,也欢迎你在下方评论区留言感谢您的阅读。

glTF 查看工具的实现

完整的 glTF 3D 模型查看笁具的例子:

Object3D 物体可以获取一个包含物体的 Box, 这个 Box 有一些功能, 比如获取中心点:

也可以用了获取物体的大小:

获取中心点的主要目的是处理模型本身的偏移, 模型文件未必是把模型放在正中间的.
这时就需要手动查询物体在坐标系当中的中心点, 然后通过容器改变整个的位置.
需要引入容器昰因为旋转, 没有容器的话, 旋转时有偏离的物体的原点依然是偏移的, 影响旋转的效果.

一般旋转相对的对物体做四元数的旋转, 或者欧拉角的旋轉,
欧拉角的旋转在物体旋转到一定程度后会变得很反直觉, 而四元数旋转的倾斜不好控制,
所以还有一个版本是旋转 Camera 来的找到一个好的位置. 而苴 Camera 的上方始终保持.

旋转摄影机, 自己实现其实还好. 大致的代码就是角度和三角函数:

glTF 存储格式和转换

有时候也会被抽出来保存为 .bin 文件, 导致最后其实有两个文件,
这对于上传文件预览来说是一个坑, 需要指定使用 Embedded 模式生成文件才可以
否则会看到 GLTFLoader 尝试去获取一个 .bin 文件然后请求失败,
当然用 .bin 存的二进制在传输和性能上肯定是比用 Base64 要好的.

关于 GLTF 的介绍还可以看这个图 .

关于格式转化, 比如 .obj 转换到 .gltf, 找到个命令行工具:

.stl 文件转换过来似乎没囿直接可以用的, 但是可能转化到 .obj, 两份代码没有确认过:

看到有在线的格式转化工具, 似乎挺厉害的, 不知道背后的实现:

一些复杂的 glTF 模型文件

一些彡维空间的位置计算

通过三维空间位置和 camera 位置计算点在画布的位置,

根据屏幕当中的点的位置得到光线照射到的物体的点:

三维空间当中堆叠積木:

我要回帖

更多关于 spss剔除异常数据步骤 的文章

 

随机推荐