Threejs入门之九:认识缓冲几何体BufferGeometry(二)

前面一节我们初步了解了BufferGeometry,它可以自定义任何几何形状,它的数据存储在BufferAttribute中。我们也使用BufferGeometry创建了一个自定义的mesh物体,但是,如果你跟着步骤创建了这个物体,用鼠标反转你会发现,这个物体只有一个面可以看到,反转后是看不到任何物体的,这是因为在Threejs中,空间中一个三角形是有正反两面的,在Three.js中规则你的眼睛(相机)对着三角形的一个面,如果三个顶点的顺序是逆时针方向,该面视为正面,如果三个顶点的顺序是顺时针方向,该面视为反面
我们可以在创建材质的时候配置side属性来设置物体的正反面是否可见
1. 三角面的正反面
Three.js的材质默认正面可见,反面不可见

const material = new THREE.MeshBasicMaterial({
    color: 0x0000ff, 
    side: THREE.FrontSide, //默认只有正面可见
})

设置两面均可见

const material = new THREE.MeshBasicMaterial({
    side: THREE.DoubleSide, //两面可见
})

设置背面可见

const material = new THREE.MeshBasicMaterial({
    side: THREE.BackSide, //设置只有背面可见
})

2.点模型对象
Points是用于显示点的模型对象,它和我们前面用过的网格模型Mesh一样,都是threejs提供的一种模型对象。其构造函数如下

Points( geometry : BufferGeometry, material : Material )
geometry —— (可选)是一个BufferGeometry的实例,默认值是一个新的BufferGeometry。
material —— (可选) 是一个对象,默认值是一个PointsMaterial。

前面我们使用网格模型Mesh的时候使用的材质是MeshBasicMaterial,同样,点模型Points也有自己对应的点材质PointsMaterial
这里我们依然使用上节定义的类型数组作为各个顶点的数据

//创建顶点数据
const vertices = new Float32Array([
  0, 0, 0, //顶点1坐标
  100, 0, 0, //顶点2坐标
  0, 100, 0, //顶点3坐标
  0, 0, 30, //顶点4坐标
  0, 0, 100, //顶点5坐标
  60, 0, 20, //顶点6坐标
])

创建缓冲区对象BufferAttribute (opens new window)表示threejs几何体顶点数据。

const attribute = new THREE.BufferAttribute(vertices, 3)

设置几何体attributes属性的位置属性

geometry.attributes.position = attribute

创建点模型的材质

// 点模型材质
const material = new THREE.PointsMaterial({
    color: 0xffff00,
    size: 10.0 //点对象像素尺寸
})

创建点模型,并将几何体和材质作为参数传递给points

const points = new THREE.Points(geometry, material);

刷新浏览器,发现原来的面已经变成了几个点
在这里插入图片描述
3.线模型对象
我们使用BufferGeometry同样可以创建线物体,Threejs给我们提供了多种线模型对象,连续先模型Line、闭合线条LineLoop、非连续的线条LineSegments等;同样,线模型对应的也有响应的线材质LineBasicMaterial
创建线材质

// 线材质
const material = new THREE.LineBasicMaterial({
    color: 0xff0000
})

创建Line对象

// 创建线模型对象
const line = new THREE.Line(geometry, material)

刷新浏览器查看效果
在这里插入图片描述
创建LineLoop对象

// 闭合线条
const line = new THREE.LineLoop(geometry, material)

刷新浏览器看效果
在这里插入图片描述
创建LineSegments对象

//非连续的线条
const line = new THREE.LineSegments(geometry, material)

效果如下
在这里插入图片描述
由此可以看出三者的区别:Line是连续的首位不闭合的线;LineLoop是连续的闭合线;LineSegments是非连续的两两相连的线
今天先写到这里吧,下次我们继续深入理解BufferGeometry的更多特性

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

九仞山

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值