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
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

跃焱邵隼

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

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

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

打赏作者

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

抵扣说明:

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

余额充值