超详细——手把手教你用threejs实现一个酷炫的模型发光扫描效果(一)

前言

模型特效是大家在3d可视化项目所追求的,但很多人苦于无法实现一个好的模型效果,本次就手把手一步一步教你实现一个酷炫的模型发光扫描特效,帮让你的项目提升一个逼格。话不多说,先上效果:

本文所使用的的相关功能模块:

  1. 3d模型场景加载

  2. 模型材质修改

  3. shaderMaterial生成扫描特效

  4. unrealBloom实现发光效果

  5. 模型压缩优化

项目地址:

http://59.110.7.171:9999/

文末点击查看原文获取源码


3d模型场景加载

准备一个模型,搭建一个基本的threejs场景。

import * as THREE from 'three';
import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader';
let renderer,scene,camera,controls
  // 初始化场景对象
  const init = function() {

    scene = new THREE.Scene();
    camera = new THREE.PerspectiveCamera(60, window.innerWidth / window.innerHeight, 1, 10000);
    camera.position.set(5, 5, 5);
    camera.layers.enable(1);
    renderer = new THREE.WebGLRenderer({
        antialias: true
    });
    renderer.setPixelRatio(window.devicePixelRatio);
    renderer.setSize(window.innerWidth, window.innerHeight);
    renderer.outputEncoding = THREE.sRGBEncoding;
    document.body.appendChild(renderer.domElement);
    controls = new OrbitControls(camera, renderer.domElement);
    var light = new THREE.DirectionalLight(0xffffff, 1);
    light.position.setScalar(1000);
    scene.add(new THREE.AmbientLight(0xffffff, .5));
    loadGLTF('./racingCar2.glb').then(function(obj){
        scene.add(obj)
        renderSelect(obj)
    })
  }
  // 加载模型
  const loadGLTF = async function(path) {
      var loader = new GLTFLoader();
      var obj = await loader.loadAsync(path);
      return obj.scene;
  }
  // 渲染器
  function render() {
    renderer.render(scene, camera);
    controls.update()
    requestAnimationFrame(render);
}
init()
 render()

threejs的渲染结构如下图所示:

scene(场景):所有3d对象的容器,相当于现实中的世界。

camera(相机): 相机是观察者,相当于现实中的眼睛。常用的相机有两种,分别是 正交投影相机(OrthographicCamera) 和 **透视投影相机(PerspectiveCamera) ,**在3d场景下基本都使用透视相机,透视相机有四个参数,分别如下:

fov — 摄像机视锥体垂直视野角度
aspect — 摄像机视锥体长宽比
near — 摄像机视锥体近端面
far — 摄像机视锥体远端面

controls(控制器):控制器用于调整相机的位置,有了控制器就可以自由地移动视角观察模型了。

r****enderer(渲染器):用于渲染场景,webgl渲染是一帧一帧渲染的,每调用一次renderer.render(scene, camera)方法,就会重新渲染一次场景,一般情况下requestAnimationFrame每秒调用60次,因此场景渲染频率为60帧。

**light(灯光):**人之所以能看到物体,都是由于光反射到眼睛里的,因此没有灯光场景都是黑暗的。常用的光源种类有四种,分别为:环境光(AmbientLight),平行光(DirectionalLight),点光源(PointLight),聚光灯(SpotLight)。

网格对象(Mesh):网格对象由几何体(Geometry)材质(Material)两部分组成,Geometry 负责几何模型,Material 负责外观样式。我们加载的模型可以看成一个组(Group),一个复杂的模型是由多个网格组合而成的,每个网格对象则相当于汽车的独立零件。

**几何对象(Geometry )😗*几何体对象负责外形,其内部存储了顶点相关的数据,比如顶点点位、顶点索引、uv坐标等。threejs中内置了许多常用的几何体如:正方体,圆柱体,球体等,我们可通过threejs内置的几何对象构建一个简单的模型,而复杂的模型则需要建模师去建模。

**材质对象(Material)😗*材质对象负责着色,绘制几何体的表面属性,比如漫反射、镜面反射、光泽度、凹凸等。材质对象的许多属性都可以用纹理贴图表示,比如漫反射贴图、凹凸贴图等。

基于以上元素我们就可以搭建一个基本场景了,当然,仅仅拥有一个场景是远远不够的,完成一个项目还需要给模型添加交互,特效等等,我会在后续继续进行讲解。


欢迎关注我的公众号获取webgl资料及最新文章,您也可以添加我的微信进行沟通交流:
公众号:web前端可视化
微信:voidjay

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要用Pytorch手写一个Transformer模型,可以按照以下步骤进行: 1. 导入所需的库和模块,包括torch、torch.nn、torch.nn.functional以及Transformer模型所需的子模块如EncoderLayer和DecoderLayer。 2. 定义Transformer模型的编码器部分。编码器由多个EncoderLayer组成,每个EncoderLayer包含自注意力机制(Self-Attention)、前馈神经网络和残差连接。 3. 定义Transformer模型的解码器部分。解码器也由多个DecoderLayer组成,每个DecoderLayer包含自注意力机制、编码器-解码器注意力机制和前馈神经网络。 4. 定义Transformer模型本身。它包含编码器和解码器,以及最后的线性层用于生成输出。 5. 实现模型的前向传播函数。在前向传播函数中,输入数据将分别经过编码器和解码器,并返回最后的输出。 6. 初始化模型并定义损失函数和优化器。 7. 定义训练循环。在每个训练迭代中,将输入数据传递给模型进行前向传播,计算损失值,并进行反向传播和参数更新。 8. 进行模型训练。根据实际情况,可以调整参数、训练数据和训练次数等。 请注意,以上步骤是一个大致的框架,具体的实现细节可能会有所不同。可以参考引用中提到的huggingface提供的transformer模型代码,以及Transformer模型的论文《Attention is All You Need》来进行更详细实现。 huggingface官方文档: [link] Transformer模型图: [link]<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [手把手教你用Pytorch代码实现Transformer模型详细的代码解读)](https://blog.csdn.net/qq_43827595/article/details/120394042)[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^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值