Three.js学习随笔

学习新技术

2022.2月开始由于工作需要,学习了WebGL标准语法和使用以及Three.js框架的使用,它们之间的关系类似于Java和以Java为基础的各个大神写的各种框架。WebGL是一种标准性语言,使用它需要了解许多计算机图形学的基础知识;而Three.js是一个非常简便的框架,它不需要你学习计算机图形相关的理论,它提供了许多API,用户只需要简单的调用即可。

THREE.js使用过程中遇到的问题

1.three/examples/jsm中代码引用
问题描述:在three/exmaples/jsm中有许多有用的工具可以让我们在使用过程中非常方便,比如说OrbitControls.js这是一个轨道控制器,非常好用,但编译时往往就是会告诉你需要npm install xxxx/xxxx/xxxx/OrbitControls.js
解决方案
我在网上搜索时一般都是下载‘import-three-example’然后在vue.config.js中配置,在github中也有相关的文章,但最后说three修改了引用方式不再维护,最后解决方式是 npm i @types/three --save-dev

2.three.js的光源阴影出不来
问题描述:在three.js中可以存在多光源,实际情况下光源就会产生影子,开发时出现了很多次明明感觉代码是正确的,但实际阴影出不来的情况,其实原因很可能是某一步骤漏写了
解决方案
为了以后不漏写任何步骤,故列明生成影子需要执行的操作

  1. renderer.shadowMap.enabled = true 渲染器需要设置可生成阴影
  2. mesh.receiveShadow = true 物体可接收阴影
  3. Light.castShadow = true;光源可以生成阴影
    Light.target = mesh;光源的面向对象

3.天空盒不显示
问题1描述:在使用cube的着色器时一直报错

runtime-core.esm-bundler.js?5c40:218 Uncaught TypeError: Cannot set properties of undefined (setting 'value')
    at Proxy.setSkybox (App.vue?3dfd:171)
    at Proxy.init (App.vue?3dfd:138)
    at Proxy.mounted (App.vue?3dfd:26)
    at callWithErrorHandling (runtime-core.esm-bundler.js?5c40:155)
    at callWithAsyncErrorHandling (runtime-core.esm-bundler.js?5c40:164)
    at Array.hook.__weh.hook.__weh (runtime-core.esm-bundler.js?5c40:2667)
    at flushPostFlushCbs (runtime-core.esm-bundler.js?5c40:356)
    at render (runtime-core.esm-bundler.js?5c40:5643)
    at mount (runtime-core.esm-bundler.js?5c40:3877)
    at Object.app.mount (runtime-dom.esm-bundler.js?830f:1590)

其实问题一直在这里

cubeShader.uniforms['tCube'].value = cubeMap;

cubeShader一直不存在‘tCube’这一项,直接设置不存在的tCube的value值是会报错的
问题2描述
按照以前的写法设置’tCube’一直加载不出来天空盒,提示

ERROR: 0:177: 'envColor' : undeclared identifier
ERROR: 0:177: '=' : dimension mismatch
ERROR: 0:177: 'assign' : cannot convert from 'const highp float' to 'out highp 4-component vector of float'

解决方案
在three.js的0.138.0(npm install的版本中),THREE.shaderLib[‘cube’]着色器的内容已经修改了。
以前的版本写法:

var cubeShader = THREE.ShaderLib[ 'cube' ];         //传入纹理图片
        cubeShader.uniforms[ 'tCube' ].value = cubeMap;

        //着色器材质
        var skyBoxMaterial = new THREE.ShaderMaterial( {
            fragmentShader: cubeShader.fragmentShader,
            vertexShader: cubeShader.vertexShader,
            uniforms: cubeShader.uniforms,
            side: THREE.BackSide
        } );

现在的版本写法:

var cubeShader = THREE.ShaderLib['cube'];         //传入纹理图片
      cubeShader.uniforms['envMap'].value = cubeMap 

      //着色器材质
      var skyBoxMaterial = new THREE.ShaderMaterial({
        fragmentShader: cubeShader.fragmentShader,
        vertexShader: cubeShader.vertexShader,
        uniforms: cubeShader.uniforms,
        depthWrite: false,
        side: THREE.BackSide
      });
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你想学习关于 three.js 的内容吗?我可以为你提供一些相关的信息和资源。首先,three.js 是一个用于创建 3D 图形的 JavaScript 库,它可以在 Web 浏览器中渲染复杂的三维场景和动画效果。如果你想学习如何使用 three.js,以下是一些步骤和资源供你参考: 1. 了解基础知识:在开始学习 three.js 之前,建议你先掌握 HTML、CSS 和 JavaScript 的基础知识。 2. 安装和设置:你可以通过下载 three.js 的最新版本文件或使用 CDN 来引入 three.js 库。确保在你的 HTML 文件中正确地链接和配置 three.js。 3. 学习文档和示例:three.js 官方网站提供了详细的文档和示例,你可以通过阅读文档和尝试示例来了解 three.js 的各种功能和用法。官方文档地址是:https://threejs.org/docs/index.html 4. 学习基本概念:熟悉 three.js 中的基本概念,如场景(Scene)、相机(Camera)、渲染器(Renderer)、几何体(Geometry)、材质(Material)等。理解这些概念对于构建三维场景至关重要。 5. 创建简单场景:从简单的场景开始,逐步添加和调整对象、光照和材质等。通过实践来熟悉 three.js 的基本用法和 API。 6. 学习进阶技术:一旦你掌握了基本的用法,你可以学习更高级的技术,如动画、纹理映射、阴影、粒子效果等。three.js 提供了丰富的功能和扩展库,你可以根据自己的需求进一步探索。 除了官方文档外,还有一些优秀的教程和资源可供参考,例如: - three.js Fundamentals:https://threejsfundamentals.org/ ***

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值