ThreeJS 第二篇:顶点概念、几何体结构

简介: 顶点概念、几何体结构

ThreeJS 第二篇:顶点概念、几何体结构

一、顶点位置数据解析渲染

👼学习本节课的重点是建立顶点的概念。如果你建立了顶点的概念,那么对于你深入理解学习 Three.js 很有帮助。

(一)、JavaScript 类型化数组

类型化数组

(二)、自定义几何体

😋可以直接调用 BoxGeometry 直接创建一个立方体几何体,调用 SphereGeometry 创建一个球体几何体。

下面代码通过 Threejs 引擎的BufferGeometry和BufferAttribute两个 API 自定义了一个具有六个顶点数据的几何体。

var scene = new THREE.Scene();
var geometry = new THREE.BufferGeometry(); //创建一个Buffer类型几何体对象
var vertices = new Float32Array([
  0,
  0,
  0, //顶点1坐标
  50,
  0,
  0, //顶点2坐标
  0,
  100,
  0, //顶点3坐标
  0,
  0,
  10, //顶点4坐标
  0,
  0,
  100, //顶点5坐标
  50,
  0,
  10, //顶点6坐标
]);
// 创建属性缓冲区对象
var attribue = new THREE.BufferAttribute(vertices, 3); //3个为一组,表示一个顶点的xyz坐标
// 设置几何体attributes属性的位置属性
geometry.attributes.position = attribue;
// 三角面(网格)渲染模式
var material = new THREE.MeshBasicMaterial({
  color: 0x0000ff, //三角面颜色
  side: THREE.DoubleSide, //两面可见
}); //材质对象
var mesh = new THREE.Mesh(geometry, material); //网格模型对象Mesh
//点光源
scene.add(mesh); //网格模型添加到场景中

22b7786ecd7c4bc8971c40dc744b29ab.jpg

(三)、点模型 Points

三个点为一组渲染出三角形

// 点渲染模式
var material = new THREE.PointsMaterial({
  color: 0xff0000,
  size: 10.0, //点对象像素尺寸
}); //材质对象
var points = new THREE.Points(geometry, material); //点模型对象
scene.add(points); //点对象添加到场景中

458bf808be2849a4b5ee5255bff42843.jpg

(四)、线模型 Line

可以把上面的点连接起来

// 线条渲染模式
var material = new THREE.LineBasicMaterial({
  color: 0xff0000, //线条颜色
}); //材质对象
var line = new THREE.Line(geometry, material); //线条模型对象
scene.add(line); //线条对象添加到场景中

0e6dcba602494d71bda61c1d1efbfe03.jpg

(五)、几何体本质

一个立方体网格模型,有 6 个面,每个面至少两个三角形拼成一个矩形平面,每个三角形三个顶点构成,对于球体网格模型而言,同样是通过三角形拼出来一个球面,三角形数量越多,网格模型表面越接近于球形。

矩形顶点线条

var scene = new THREE.Scene();
        var geometry = new THREE.BoxGeometry(100, 100, 100);
        var material = new THREE.PointsMaterial({
            color: 0xff0000,
            size: 10.0 //点对象像素尺寸
        }); //材质对象
        // var mesh = new THREE.Mesh(geometry, material); //网格模型对象Mesh
        var line = new THREE.Line(geometry, material);//线条模型对象
        scene.add(line);

fefcfb6bb17b418ea667586b31edcfe9.jpg

球顶点线条

var scene = new THREE.Scene();
        var geometry = new THREE.BoxGeometry(100, 100, 100);
        var material = new THREE.PointsMaterial({
            color: 0xff0000,
            size: 10.0 //点对象像素尺寸
        }); //材质对象
        // var mesh = new THREE.Mesh(geometry, material); //网格模型对象Mesh
        var line = new THREE.Line(geometry, material);//线条模型对象
        scene.add(line);

d5f7131476364c2a97ad148e9f4c59cb.jpg

二、顶点颜色数据插值计算

(一)、顶点颜色数据插值计算

这节介绍一下几何体顶点颜色

顶点一有一个坐标数据,那么他就也有对应的顶点颜色数据…以此类推

(二)、每个顶点设置一种颜色895a91d13562409a9a06e36ec8a60c2a.jpg

var scene = new THREE.Scene();
        var geometry = new THREE.BufferGeometry(); //声明一个缓冲几何体对象
        //类型数组创建顶点位置position数据
        var vertices = new Float32Array([
            0, 0, 0, //顶点1坐标
            50, 0, 0, //顶点2坐标
            0, 100, 0, //顶点3坐标
            0, 0, 10, //顶点4坐标
            0, 0, 100, //顶点5坐标
            50, 0, 10, //顶点6坐标
        ]);
        // 创建属性缓冲区对象
        var attribue = new THREE.BufferAttribute(vertices, 3); //3个为一组,作为一个顶点的xyz坐标
        // 设置几何体attributes属性的位置position属性
        geometry.attributes.position = attribue;
        //类型数组创建顶点颜色color数据
        var colors = new Float32Array([
            1, 0, 0, //顶点1颜色
            0, 1, 0, //顶点2颜色
            0, 0, 1, //顶点3颜色
            1, 1, 0, //顶点4颜色
            0, 1, 1, //顶点5颜色
            1, 0, 1, //顶点6颜色
        ]);
        // 设置几何体attributes属性的颜色color属性
        geometry.attributes.color = new THREE.BufferAttribute(colors, 3); //3个为一组,表示一个顶点的颜色数据RGB
        //材质对象
        var material = new THREE.PointsMaterial({
            // 使用顶点颜色数据渲染模型,不需要再定义color属性
            // color: 0xff0000,
            vertexColors: THREE.VertexColors, //以顶点颜色为准
            size: 10.0 //点对象像素尺寸
        });
        // 点渲染模式  点模型对象Points
        var points = new THREE.Points(geometry, material); //点模型对象
        scene.add(points); //点对象添加到场景
        var axisHelper = new THREE.AxisHelper(250);
        scene.add(axisHelper);

895a91d13562409a9a06e36ec8a60c2a.jpg

(三)、材质属性.vertexColors

通过材质的颜色属性 color 设置模型颜色,而本案例并没有这样设置,而是设置了材质属性.vertexColors。

var material = new THREE.PointsMaterial({
  // 使用顶点颜色数据渲染模型,不需要再定义color属性
  // color: 0xff0000,
  vertexColors: THREE.VertexColors, //以顶点颜色为准
  size: 10.0 //点对象像素尺寸
});

关于材质的属性.vertexColors 可以查看Material 文档 介绍,属性.vertexColors 的默认值是 THREE.NoColors,这也就是说模型的颜色渲染效果取决于材质属性.color,如果把材质属性.vertexColors 的值设置为 THREE.VertexColors,threejs 渲染模型的时候就会使用几何体的顶点颜色数据 geometry.attributes.color。

(四)、颜色插值

var scene = new THREE.Scene();
        var geometry = new THREE.BufferGeometry(); //声明一个缓冲几何体对象
        //类型数组创建顶点位置position数据
        var vertices = new Float32Array([
            0, 0, 0, //顶点1坐标
            50, 0, 0, //顶点2坐标
            0, 100, 0, //顶点3坐标
            0, 0, 10, //顶点4坐标
            0, 0, 100, //顶点5坐标
            50, 0, 10, //顶点6坐标
        ]);
        // 创建属性缓冲区对象
        var attribue = new THREE.BufferAttribute(vertices, 3); //3个为一组,作为一个顶点的xyz坐标
        // 设置几何体attributes属性的位置position属性
        geometry.attributes.position = attribue;
        //类型数组创建顶点颜色color数据
        var colors = new Float32Array([
            1, 0, 0, //顶点1颜色
            0, 1, 0, //顶点2颜色
            0, 0, 1, //顶点3颜色
            1, 1, 0, //顶点4颜色
            0, 1, 1, //顶点5颜色
            1, 0, 1, //顶点6颜色
        ]);
        // 设置几何体attributes属性的颜色color属性
        geometry.attributes.color = new THREE.BufferAttribute(colors, 3); 
        //材质对象
        var material = new THREE.PointsMaterial({
            vertexColors: THREE.VertexColors,
            size: 10.0 //点对象像素尺寸
        });
        // 点渲染模式  点模型对象Points
        var line = new THREE.Line(geometry, material);//线条模型对象
        scene.add(line);

e7658790019f4673a610bed2b365d87b.jpg

之所以出现渐变是因为Threejs通过底层WebGL进行渲染的时候会对顶点的颜色数据进行插值计算。颜色插值计算简单点说,比如一条直线的端点1设置为红色,端点2设置为蓝色,整条直线就会呈现出从点1到红色点2的蓝色颜色渐变,对于网格模型Mesh而言,就是三角形的三个顶点分别设置一个颜色,三角形内部的区域像素会根据三个顶点的颜色进行插值计算。

45da33444a934e558aa8a9c15df63372.png

相关文章
Threejs入门进阶实战案例(5):坐标系理解时辅助坐标系的使用
Threejs入门进阶实战案例(5):坐标系理解时辅助坐标系的使用
139 0
|
开发者
用D3制作矩形式树状结构图(Treemapping)并设计动画效果
矩形式树状结构图一般可以简称为Treemapping。Treemapping的各种制作方法网络上已经流行了许久,但是鲜有人在此之上有创作新意的,我在此基础上制作了一些动画效果供大家参考
406 0
|
1月前
|
vr&ar
Threejs创建圆环结
这篇文章讲解了如何在Three.js中创建一个圆环结(例如绳结状的几何体),包括生成圆环结几何体、应用材质以及将其渲染到场景中的过程。
29 2
Threejs创建圆环结
|
1月前
|
JavaScript API 图形学
ThreeJS入门-创建一个正方体
这篇文章介绍了如何使用Three.js创建一个基本的正方体模型,并提供了实现这一功能的详细步骤和代码示例。
37 0
ThreeJS入门-创建一个正方体
|
3月前
|
存储 数据可视化 API
第5章-着色基础-5.3-实现着色模型
第5章-着色基础-5.3-实现着色模型
20 0
|
4月前
|
图形学 Python
Python绘制动态树形:实现分形树动画
Python绘制动态树形:实现分形树动画
77 0
|
6月前
Three.js点线几何空间图形代码
Three.js点线几何空间图形代码
30 2
Three.js点线几何空间图形代码
|
容器
【D3.js 学习总结】24、D3几何 - 多边形 
# d3.geom.polygon ![](https://img.alicdn.com/tps/TB1dXPjLXXXXXXBXVXXXXXXXXXX-500-506.png) polygon函数有3个用途: * polygon.area() 用来计算多边形面积; * polygon.centroid() 用来计算多边形中心坐标; * polygon.clip(subject)
2866 0
|
前端开发 JavaScript 容器
Three.js入门: 构建一个立方体
Three.js 是一个 JavaScript 库,用于在 Web 浏览器中创建 3D Web 图形。前面介绍过一些基本的知识和实现简单的效果《Three.js 入门指南》和《【Three.js】随着元宇宙开启WEB3D之路》,本文从简单的构建立方体出发,介绍一些基础概念。
206 0
|
vr&ar 图形学
【Unity3D 灵巧小知识点】☀️ | Unity 四元数、欧拉角 与 方向向量 之间转换
Unity 小科普 老规矩,先介绍一下 Unity 的科普小知识: Unity是 实时3D互动内容创作和运营平台 。 包括游戏开发、美术、建筑、汽车设计、影视在内的所有创作者,借助 Unity 将创意变成现实。