threejs 计算 uv position normal 等

有时候自定义几何体 需要贴各种图怎么办?

比如加载geojson数据

简单描述一下 计算方法吧...

const texture =  this.app.textureLoader.load(
 'https://www.wellyyss.cn/public/logo.png'
)

    texture.wrapS = texture.wrapT = this._3d.RepeatWrapping;
    texture.repeat.set( 1, 1);

    const _3d = this._3d
    const geometry = new _3d.BufferGeometry();

    const vertices = [
      0, 0, 0, // 0
      30, 0, 0,  // 1
      30, 0, 30, // 2
      0, 0, 30  // 3  这种顺序 将会 构成 三角面的 index角标规划

    ];

    let normals = [];

    const indices = new _3d.Uint16BufferAttribute([0, 3, 1, 1, 3, 2], 1); 
    // 每个数字代表 vertices 中的 顶点顺序 位置 —— 多种排序方法 构成三角面的正反面

    const number = 10 // uv 的 x y 都是 从 0 到 1 ; 
    // 当 number > 1 时候 如果没有写 Repeat方式 那么 超出的 会显示空白
    // 当 number < 1 时候 那么 就会显示 ‘裁剪后’得图片
    const uvs = [
      0, 0, 
      0, number,
      number, number, 
      number, 0
    ]


    // 类球面法向量计算
    const v = new this._3d.Vector3()
    vertices.forEach((e, i) => {
      if(i > vertices.length -2) return
      if(i % 3 === 0) {
        v.x = vertices[i]
        v.y = vertices[i + 1]
        v.z = vertices[i + 2]
        v.normalize();
        normals.push( v.x, v.y, v.z );
      }

    })

    // // 单平面 向上的 法向量
    // normals = [
    //   0, 0, 1,
    //   0, 0, 1,
    //   0, 0, 1,
    //   0, 0, 1
    // ]

    geometry.setIndex(indices);
    geometry.setAttribute('position', new this._3d.Float32BufferAttribute(vertices, 3));
    geometry.setAttribute('normal', new this._3d.Float32BufferAttribute(normals, 3));
    geometry.setAttribute('uv', new this._3d.Float32BufferAttribute( uvs, 2));



    const mesh = new _3d.Mesh(
      geometry,
      new _3d.MeshPhongMaterial({ side: _3d.DoubleSide, map: texture }),

    );

    this.scene.add(mesh)

   

 图例示意

更多教程 见

@跃焱邵隼

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Three.js中的Geometry是其他很多Geometry(如BoxGeometry、SphereGeometry)的基类,它是用来创建几何体的对象。Geometry对象包含了顶点、面和UV坐标等信息,可以用来描述一个物体的形状。\[1\] 在Three.js中,可以通过添加顶点、面和UV坐标来创建一个Geometry对象。顶点是物体的顶点坐标,面是由顶点组成的三角形或四边形,而UV坐标则是用来贴上纹理的坐标。通过设置这些属性,可以创建出各种不同形状的物体。 例如,可以通过以下代码创建一个三角形,并为其贴上纹理: ```javascript var vertices = \[ new THREE.Vector3(-1.0, -1.0, 0.0), new THREE.Vector3(1.0, -1.0, 0.0), new THREE.Vector3(1.0, 1.0, 0.0) \]; var face = new THREE.Face3(0, 1, 2); var faces = \[face\]; var uvs = \[ \[ new THREE.Vector2(0.0, 0.0), new THREE.Vector2(1.0, 0.0), new THREE.Vector2(1.0, 1.0) \] \]; var geometry = new THREE.Geometry(); geometry.vertices = vertices; geometry.faces = faces; geometry.faceVertexUvs\[0\] = uvs; var texture = new THREE.TextureLoader().load('test.jpg'); var material = new THREE.MeshBasicMaterial({ map: texture }); var mesh = new THREE.Mesh(geometry, material); scene.add(mesh); ``` 这段代码创建了一个三角形的Geometry对象,并为其贴上名为'test.jpg'的纹理。最后,通过创建一个Mesh对象,将Geometry和Material结合起来,并将其添加到场景中。\[2\] 除了基本的几何体,Three.js还提供了许多其他类型的Geometry,如ConeGeometry、BoxGeometry等,可以根据需要选择合适的Geometry来创建不同形状的物体。例如,可以使用ConeGeometry来创建一个圆锥体: ```javascript var cone = new THREE.Mesh(new THREE.ConeGeometry(100, 100, 100, 10, false, 0, Math.PI * 3 / 2), material); scene.add(cone); ``` 这段代码创建了一个圆锥体的Geometry对象,并使用相应的Material创建了一个Mesh对象,最后将其添加到场景中。\[3\] #### 引用[.reference_title] - *1* *2* [Threejs中Geometry的用法示例](https://blog.csdn.net/yb0022/article/details/103329939)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [THREE.JS之几何体(Geometry)](https://blog.csdn.net/u011135260/article/details/52725162)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

跃焱邵隼

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

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

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

打赏作者

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

抵扣说明:

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

余额充值