three.js物理网格材质(玻璃)

参考资料:threejs中文网

threejs qq交流群:814702116

three.js物理网格材质(玻璃)

上节课给大家介绍了标准网格材质MeshStandardMaterial,下面给大家介绍物理网格材质MeshPhysicalMaterial

MeshPhysicalMaterialMeshStandardMaterial的子类,MeshPhysicalMaterial会继承父类MeshStandardMaterial的属性,比如金属度、粗糙度。

MeshPhysicalMaterial有用更多的材质属性,比如透射度(透光率).transmission、折射率.ior

测试

Blender创建一个球体网格模型,然后通过threejs代码创建一个物理材质对象,赋值给这个球体网格模型。

const spheremesh = gltf.scene.getObjectByName('球体')
spheremesh.material = new THREE.MeshPhysicalMaterial({
    metalness: 0.0,//玻璃非金属  金属度设置0
    roughness: 0.0,//玻璃表面光滑  
    envMapIntensity:1.0,
    transmission:1.0,//透射度(透光率)
    ior:1.5,//折射率
})

透光率(透射度).transmission

为了更好的模拟玻璃、半透明塑料一类的视觉效果,可以使用物理透明度.transmission属性代替Mesh普通透明度属性.opacity

使用.transmission属性设置Mesh透明度,即便完全透射的情况下仍可保持高反射率。

物理光学透明度.transmission的值范围是从0.0到1.0。默认值为0.0。

const mesh = gltf.scene.getObjectByName('球体')
mesh.material = new THREE.MeshPhysicalMaterial({
    transmission: 1.0, //玻璃材质透光率,transmission替代opacity 
})

折射率.ior

非金属材料的折射率从1.0到2.333。默认值为1.5。

不同材质的折射率,你可以百度搜索。

new THREE.MeshPhysicalMaterial({
    ior:1.5,//折射率
})

玻璃透光率.transmission设置

先设置玻璃金属度和粗糙度

const mesh = gltf.scene.getObjectByName('玻璃01')
mesh.material = new THREE.MeshPhysicalMaterial({
    metalness: 0.0,//玻璃非金属 
    roughness: 0.0,//玻璃表面光滑
    envMap:textureCube,//环境贴图
    envMapIntensity: 1.0, //环境贴图对Mesh表面影响程度
})

设置透光率.transmission和折射率.ior

new THREE.MeshPhysicalMaterial({
    transmission: 1.0, //玻璃材质透光率,transmission替代opacity 
    ior:1.5,//折射率
})

Blender设置透射度导出gltf

上节课,小球网格没有设置透视度.transmission,只是设置了金属度、粗糙度,threejs加载gltf默认小球网格的材质是MeshStandardMaterial

通过Blender设置透射度.transmission之后,threejs解析gltf模型默认材质MeshPhysicalMaterial

const spheremesh = gltf.scene.getObjectByName('球体');
console.log('gltf默认材质',spheremesh.material);

这说明threejs会根据gltf材质属性情况,来决定用什么材质渲染,如果用标准网格材质MeshStandardMaterial能渲染,就不用MeshPhysicalMaterial,有些属性比如透射度transmission,MeshStandardMaterial没有,就需要MeshPhysicalMaterial渲染。

总结

并不是所有的3D建模软件都支持设置物理材质,即便支持物理材质,也不意味着你导出的gltf模型,能包含该软件,设置的物理材质属性,比如金属度、粗糙度、透射度…

除了物理材质,也有很多建模软件,自带的材质效果,是无法自动导出到threejs的。

建议:能否导出美术建模软件设置的材质效果,一切以实际测试为准。不同软件,同一个软件不同版本,都会有差异。

  • 10
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 在 three.js 中创建网格地板,可以使用 `Mesh` 类。首先,需要创建一个网格地板的几何体,可以使用 `PlaneGeometry` 类。然后,可以使用一个材质(如 `MeshBasicMaterial` 或 `MeshLambertMaterial`)来创建网格地板的外观。最后,将几何体和材质作为参数传递给 `Mesh` 构造函数,并将新创建的网格地板添加到场景中。 例如: ``` // 创建网格地板的几何体 const geometry = new THREE.PlaneGeometry(width, height, widthSegments, heightSegments); // 创建网格地板的材质 const material = new THREE.MeshBasicMaterial({ color: 0xffffff }); // 创建网格地板 const mesh = new THREE.Mesh(geometry, material); // 将网格地板添加到场景中 scene.add(mesh); ``` 其中,`width` 和 `height` 分别指定网格地板的宽度和高度,`widthSegments` 和 `heightSegments` 分别指定沿网格地板宽度和高度方向的网格数。 ### 回答2: 在three.js中创建网格地板需要经历以下步骤: 1. 首先,我们需要导入three.js库及其他必要的依赖文件。 ``` import * as THREE from 'https://cdn.skypack.dev/three@0.132.2/build/three.module.js'; ``` 2. 创建场景、相机和渲染器。 ``` const scene = new THREE.Scene(); const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000); const renderer = new THREE.WebGLRenderer(); renderer.setSize(window.innerWidth, window.innerHeight); document.body.appendChild(renderer.domElement); ``` 3. 创建网格地板的材质和几何体。 ``` const floorGeometry = new THREE.PlaneGeometry(10, 10, 10, 10); const floorMaterial = new THREE.MeshBasicMaterial({ color: 0x808080, wireframe: true }); ``` 4. 创建网格对象并将材质应用于它。 ``` const floor = new THREE.Mesh(floorGeometry, floorMaterial); scene.add(floor); ``` 5. 设置相机的位置和方向。 ``` camera.position.z = 5; camera.lookAt(floor.position); ``` 6. 创建动画循环函数,并在其中渲染场景。 ``` function animate() { requestAnimationFrame(animate); renderer.render(scene, camera); } animate(); ``` 整个过程中,我们先创建了场景、相机和渲染器,然后定义了网格地板的材质和几何体。接下来,我们使用这些材质和几何体创建一个网格对象,并将它添加到场景中。然后,我们设置相机的位置和方向,以确保地板在可视范围内。最后,我们通过创建动画循环函数来持续渲染场景,使得地板可以旋转或进行其他动画效果。 这样,我们就成功地使用three.js创建了一个简单的网格地板。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Threejs可视化

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

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

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

打赏作者

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

抵扣说明:

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

余额充值