Three.js加载简单纹理贴图并应用到网格(凹凸贴图、法向贴图、移位贴图)

这篇具有很好参考价值的文章主要介绍了Three.js加载简单纹理贴图并应用到网格(凹凸贴图、法向贴图、移位贴图)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

简介

  1. 纹理最基础的用法就是作为贴图被添加到材质上,当用这种方法创建网格时,网格的颜色就来源于纹理
  2. UV贴图实质上就是指定模型上的哪一部分需要被映射到纹理的相应位置
  3. 可以用如下方法加载纹理
var textureLoader = new THREE.TexturenLoader();
var texture = textureLoader.load("../../assets/textures/sss.jpg");

使用THREE.TextureLoader()从指定位置加载图片,图片格式可以是png,jpg或jpeg

  1. 纹理的加载是异步的:如果纹理加载较大,而程序在文件加载完成之前开始渲染场景,那么在最开始的瞬间会看到场景中一些物体没有贴图。如果希望等待纹理加载完成。可以为THREE.TextureLoader.load()添加回调函数。
var textureLoader = new THREE.TextureLoader();
var texture = textureLoder.load("../../assets/textures/sss.jpg",onloadFunction,onProgressFunction,onErrorFunction);

onloadFunction在纹理加载完成时被调用,onProgressFunction可以随时汇报加载进度,onError在纹理加载出故障时被调用

  1. 用图片来作为纹理使用时,最好使用长宽为2的次方的正方形图片
  2. 纹理的放大和缩小。可以设置magFilter属性来指定纹理如何放大,minFilter来指定纹理如何缩小
    这两个属性的属性值可以设置如下表所示的属性值
名称 描述
THREE.NearestFilter(最邻近过滤) 这个过滤器会将纹理上最近的像素颜色应用于面上。在放大时,会导致方块化,在缩小时,会丢失很多细节
THREE.LinearFilter(线性过滤) 这个过滤器最终的颜色是由周围四个像素值决定的。在缩小时仍会丢失一些细节,但是在放大时会平滑很多,方块化也比较少一些出现

也可以使用mipmap。mipmap是把纹理按照2的倍数进行缩小。mipmap纹理过滤模式如下表所示
关于mipmap,https://blog.csdn.net/qq_42428486/article/details/118856697

💡 如果没有设置magFilter和minFilter属性的值。Three.js会将THREE.LinearFilter作为magFilter属性的默认值,将THREE.LinearMipMapLinearFilter作为minFilter属性的默认值。

简单案例

结果

Three.js加载简单纹理贴图并应用到网格(凹凸贴图、法向贴图、移位贴图)文章来源地址https://www.toymoban.com/news/detail-454722.html

分析

  1. 上述场景中有三个物体,分别运用了移位贴图,凹凸贴图、法向贴图(具体属性特征可以看之前的文章);
  2. 场景中有性能插件、光源、平面、GUI
  3. 先搭建HTML框架
<!DOCTYPE html>
<html lang="zh">
<head>
	<meta charset="UTF-8">
	<meta name=viewport
		  content="width=device-width,initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no,minimal-ui">
	<script type="text/javascript" src="../libs/three/three.js"></script>
	<script type="text/javascript" src="../libs/three/controls/OrbitControls.js"></script>
	<script type="text/javascript" src="../libs/util/dat.gui.js"></script>
	<script type="text/javascript" src="../libs/util/Stats.js"></script>
	<script type="text/javascript" src="js/basicTexture.js"></script>
	<script type="text/javascript" src="../js/util.js"></script>
	<script type="text/javascript" src="js/utils.js"></script>
	<link rel="stylesheet" href="../css/default.css">
	<title>Title</title>
	<style></style>
	<script></script>
</head>
<body>
<div id="webgl-output">

</div>
<script type="text/javascript">
	(function() {
		draw()
	})()
</script>
</body>
</html>
  1. 进行场景的初步创建(定义场景、渲染器、摄像机),在定义渲染器时可以将渲染的结果添加到 html框架的div中
	//初始化场景
    var scene = new THREE.Scene();
    //渲染器
    var renderer = new THREE.WebGLRenderer();
    renderer.setClearColor(new THREE.Color(0x000000));
    renderer.setSize(window.innerWidth, window.innerHeight);
    //告诉渲染器开启阴影投射
    renderer.shadowMap.enabled = true;
    document.getElementById("webgl-output").appendChild(renderer.domElement);
    //摄像机
    var camera = new THREE.PerspectiveCamera(45, window.innerWidth/window.innerHeight,0.1,1000);
    camera.position.set(0,20,40);
    camera.lookAt(new THREE.Vector3(0,0,0));
    scene.add(camera);
  1. 设置光源和地面
	//地面
    var groundPlane = addLargeGroundPlane(scene);
    groundPlane.position.y = -10;
    //聚光源
    var spotLight = new THREE.SpotLight(0xffffff);
    spotLight.position.set(-10,30,40);
    spotLight.shadow.mapSize.width = 20480;
    spotLight.shadow.mapSize.height = 20480;
    spotLight.shadow.camera.fov = 150;
    spotLight.castShadow = true;
    spotLight.decay = 2;
    spotLight.penumbra = 0.05;
    spotLight.name = "spotLight"
    scene.add(spotLight);
    scene.add(new THREE.AmbientLight(0x444444));
  1. 添加 物体与贴图
	//加载器
    var textureLoader = new THREE.TextureLoader();
    //法向贴图
    var polyhedron = new THREE.BoxGeometry(4,4,4);
    var polyheMaterial = new THREE.MeshStandardMaterial({
        map: textureLoader.load("../assets/textures/general/plaster.jpg"),
        normalMap: textureLoader.load("../assets/textures/general/plaster-normal.jpg"),
        // bumpScale: 15,
        // normalScale: 1,
        metalness: 0.2,
        roughness: 0.07,
    });
    var polyhedronMesh = new THREE.Mesh(polyhedron,polyheMaterial);
    polyheMaterial.normalScale.set(-5,-5);
    polyhedronMesh.castShadow = true;
    polyhedronMesh.position.x = 10;
    polyhedronMesh.position.z =10;
    scene.add(polyhedronMesh);
    //凹凸贴图
    var polyhedron2 = new THREE.BoxGeometry(4,4,4);
    var polyheMaterial2 = new THREE.MeshStandardMaterial({
        map: textureLoader.load("../assets/textures/stone/stone.jpg"),
        bumpMap: textureLoader.load("../assets/textures/stone/stone-bump.jpg"),
        metalness: 0.2,
        roughness: 0.07,
    });
    var polyhedronMesh2 = new THREE.Mesh(polyhedron2,polyheMaterial2);
    polyhedronMesh2.castShadow = true;
    polyhedronMesh2.position.x = 0;
    polyhedronMesh2.position.z = 10;
    scene.add(polyhedronMesh2);
    //移动贴图
    var sphereGeometry = new THREE.SphereGeometry(4,20,20);
    var sphereMaterial = new THREE.MeshStandardMaterial({
        map: textureLoader.load("../assets/textures/w_c.jpg"),
        displacementMap: textureLoader.load("../assets/textures/w_d.png"),
        metalness: 0.2,
        roughness: 0.07,
        color: 0xffffff,
    });
    var sphere = new THREE.Mesh(sphereGeometry,sphereMaterial);
    sphere.castShadow = true;
    sphere.position.x = -10;
    sphere.position.z = 10;
    scene.add(sphere);
  1. 添加性能插件、GUI控制界面
	var stats = new Stats();
	document.getElementById("webgl-output").appendChild(stats.domElement);
 	var bump = new function (){
        this.rotationSpeed = 0.02;
        this.bumpScale = 1;
        this.normalScaleX = 1;
        this.normalScaleY = 1;
        this.displacementScale = sphereMaterial.displacementScale;
        this.displacementBias= sphereMaterial.displacementBias;
    }
    gui.add(bump,'bumpScale',-1,1,0.001).onChange(function (e){
        polyheMaterial2.bumpScale = e;
    });
    gui.add(bump,'normalScaleX',-3,3,0.001).onChange(function (e){
        polyheMaterial.normalScale.set(bump.normalScaleX,bump.normalScaleY);
    });
    gui.add(bump,'normalScaleY',-3,3,0.001).onChange(function (e){
        polyheMaterial.normalScale.set(bump.normalScaleX,bump.normalScaleY);
    })
    gui.add(bump,'displacementScale',-5,5,0.01).onChange(function(e){
       sphereMaterial.displacementScale = e;
    });
    gui.add(bump,'displacementBias',-5,5,0.01).onChange(function (e){
       sphereMaterial.displacementBias  = e;
    });
  1. 设置摄像机控制器
 var controls = new THREE.OrbitControls( camera, renderer.domElement );
  1. 设置场景对浏览器的自适应
	window.addEventListener("resize",OnResize,false);
	function OnResize(){
        camera.aspect = window.innerWidth/window.innerHeight;
        camera.updateProjectionMatrix();
        renderer.setSize(window.innerWidth,window.innerHeight);
    }
  1. 最后告诉渲染器使用指定的摄像机渲染
	render()
    function render(){
        stats.update();
        requestAnimationFrame(render);
        renderer.render(scene, camera);

        // polyhedronMesh.rotation.y += 0.02;
    }

完整代码

var camera,renderer,scene
function draw(){
    //初始化性能插件
    var stats = new Stats();
	document.getElementById("webgl-output").appendChild(stats.domElement);
     //渲染器
    var renderer = new THREE.WebGLRenderer();
    renderer.setClearColor(new THREE.Color(0x000000));
    renderer.setSize(window.innerWidth, window.innerHeight);
    //告诉渲染器开启阴影投射
    renderer.shadowMap.enabled = true;
    document.getElementById("webgl-output").appendChild(renderer.domElement);
    //摄像机
    var camera = new THREE.PerspectiveCamera(45, window.innerWidth/window.innerHeight,0.1,1000);
    camera.position.set(0,20,40);
    camera.lookAt(new THREE.Vector3(0,0,0));
    scene.add(camera);
    //交互鼠标控制场景移动旋转
    var controls = new THREE.OrbitControls( camera, renderer.domElement );
    //是否可以缩放
    controls.enableZoom = true;
    //是否自动旋转
    controls.autoRotate = true;
    //设置相机距离原点的最远距离
    controls.minDistance  = 1;
    //设置相机距离原点的最远距离
    controls.maxDistance  = 200;
    //是否开启右键拖拽
    controls.enablePan = true;
    //初始化场景
    scene = new THREE.Scene();
    //地面
    var groundPlane = addLargeGroundPlane(scene);
    groundPlane.position.y = -10;
    //聚光源
    var spotLight = new THREE.SpotLight(0xffffff);
    spotLight.position.set(-10,30,40);
    spotLight.shadow.mapSize.width = 20480;
    spotLight.shadow.mapSize.height = 20480;
    spotLight.shadow.camera.fov = 150;
    spotLight.castShadow = true;
    spotLight.decay = 2;
    spotLight.penumbra = 0.05;
    spotLight.name = "spotLight"
    scene.add(spotLight);
    // initDefaultLighting(scene);
    scene.add(new THREE.AmbientLight(0x444444));
    //加载器
    var textureLoader = new THREE.TextureLoader();
    //gui
    var gui = new dat.GUI();
    //坐标轴
    var axes = new THREE.AxesHelper(50);
    // scene.add(axes);
    //法向贴图
    var polyhedron = new THREE.BoxGeometry(4,4,4);
    var polyheMaterial = new THREE.MeshStandardMaterial({
        map: textureLoader.load("../assets/textures/general/plaster.jpg"),
        normalMap: textureLoader.load("../assets/textures/general/plaster-normal.jpg"),
        // bumpScale: 15,
        // normalScale: 1,
        metalness: 0.2,
        roughness: 0.07,
    });
    var polyhedronMesh = new THREE.Mesh(polyhedron,polyheMaterial);
    polyheMaterial.normalScale.set(-5,-5);
    polyhedronMesh.castShadow = true;
    polyhedronMesh.position.x = 10;
    polyhedronMesh.position.z =10;
    scene.add(polyhedronMesh);
    //凹凸贴图
    var polyhedron2 = new THREE.BoxGeometry(4,4,4);
    var polyheMaterial2 = new THREE.MeshStandardMaterial({
        map: textureLoader.load("../assets/textures/stone/stone.jpg"),
        bumpMap: textureLoader.load("../assets/textures/stone/stone-bump.jpg"),
        metalness: 0.2,
        roughness: 0.07,
    });
    var polyhedronMesh2 = new THREE.Mesh(polyhedron2,polyheMaterial2);
    polyhedronMesh2.castShadow = true;
    polyhedronMesh2.position.x = 0;
    polyhedronMesh2.position.z = 10;
    scene.add(polyhedronMesh2);
    //移动贴图
    var sphereGeometry = new THREE.SphereGeometry(4,20,20);
    var sphereMaterial = new THREE.MeshStandardMaterial({
        map: textureLoader.load("../assets/textures/w_c.jpg"),
        displacementMap: textureLoader.load("../assets/textures/w_d.png"),
        metalness: 0.2,
        roughness: 0.07,
        color: 0xffffff,
    });
    var sphere = new THREE.Mesh(sphereGeometry,sphereMaterial);
    sphere.castShadow = true;
    sphere.position.x = -10;
    sphere.position.z = 10;
    scene.add(sphere);

    var bump = new function (){
        this.rotationSpeed = 0.02;
        this.bumpScale = 1;
        this.normalScaleX = 1;
        this.normalScaleY = 1;
        this.displacementScale = sphereMaterial.displacementScale;
        this.displacementBias= sphereMaterial.displacementBias;
    }
    gui.add(bump,'bumpScale',-1,1,0.001).onChange(function (e){
        polyheMaterial2.bumpScale = e;
    });
    gui.add(bump,'normalScaleX',-3,3,0.001).onChange(function (e){
        polyheMaterial.normalScale.set(bump.normalScaleX,bump.normalScaleY);
    });
    gui.add(bump,'normalScaleY',-3,3,0.001).onChange(function (e){
        polyheMaterial.normalScale.set(bump.normalScaleX,bump.normalScaleY);
    })
    gui.add(bump,'displacementScale',-5,5,0.01).onChange(function(e){
       sphereMaterial.displacementScale = e;
    });
    gui.add(bump,'displacementBias',-5,5,0.01).onChange(function (e){
       sphereMaterial.displacementBias  = e;
    });

    window.addEventListener("resize",OnResize,false);

    render()
    function render(){
        stats.update();
        requestAnimationFrame(render);
        renderer.render(scene, camera);
    }

    function OnResize(){
        camera.aspect = window.innerWidth/window.innerHeight;
        camera.updateProjectionMatrix();
        renderer.setSize(window.innerWidth,window.innerHeight);
    }
}

到了这里,关于Three.js加载简单纹理贴图并应用到网格(凹凸贴图、法向贴图、移位贴图)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Three.js】Three.js中的纹理—图像应用和属性调整

      Three.js是一种强大的JavaScript库,用于创建基于Web的交互式3D图形和动画。在Three.js中,纹理是一项重要的功能,它允许我们将图像应用到几何体对象上,并通过调整纹理的属性来实现更丰富的视觉效果。 本文将介绍Three.js中的纹理功能,并演示如何将图片作为纹理应用到几何

    2024年02月15日
    浏览(54)
  • Three.js 模型加载及加载简单动画

    时间过的好快啊~再一次感叹,忙忙碌碌一年又过去了,新年第一帖,新的一年也要加油呀! 简单介绍下Three.js吧,Three.js是基于原生WebGL封装运行的三维引擎,在所有WebGL引擎中,Three.js是国内文资料最多、使用最广泛的三维引擎。因为使用简单,入门比较容易。 Three.js的具体

    2024年02月12日
    浏览(48)
  • three.js 基础认识与简单应用

    学习总结初衷:          1. 公司项目需要。         2. 做一下笔记,方便以后学习查看,好记性不如烂笔头;也能筑固基础,加深印象。         3. 现在国内关于Three.js的学习资料很少,总结一下多多少少也能给有需要的小伙伴一些帮助。 1. 什么是three.js?你将它理解成

    2024年02月03日
    浏览(44)
  • HDRI贴图下载及Three.js利用

    最令人兴奋的项目之一是在 Three js 中添加HDRI背景。 HDRI图像是从房间内部或花园、丛林或山脉等开放环境等场景中以 360 度捕获的。 你可以自己创建任何这些图像,但这不是本教程的主题。 相反,我们将从网站获取这些图像之一,并使用轨道控件,让用户能够转动物体并以

    2024年02月06日
    浏览(57)
  • 面向Three.js开发者的3D自动纹理化开发包

    DreamTexture.js 是面向 three.js 开发者的 3D 模型纹理自动生成与设置开发包,可以为 webGL 应用增加 3D 模型的快速自动纹理化能力。 图一为原始模型, 图二图三为贴图后的模型。提示词: city, Realistic , cinematic , Front view ,Game scene graph DreamTexture.js 基于 Three.js 和稳定扩散(stable dif

    2024年02月06日
    浏览(51)
  • 凹凸/法线/移位贴图的区别

    你是否在掌握 3D 资产纹理的道路上遇到过障碍? 不要难过! 许多刚接触纹理或 3D 的艺术家在第一次遇到凹凸贴图(Bump Map)、法线贴图(Normal Map)和移位贴图(Displacement Map)时通常会感到困惑。 他们似乎都在做同样的事情,对吧? ’ 推荐:用 NSDT场景设计器 快速搭建3

    2023年04月13日
    浏览(44)
  • photoshop制作法线和凹凸贴图

          做个选区    Ctrl+j   法线贴图 生成凹凸贴图                

    2024年02月16日
    浏览(40)
  • 网格(mesh)点跟踪及在贴图中的应用

            本文介绍网格跟踪的思路及其在贴图中的使用效果。网格跟踪即跟踪所有的网格点,然后根据网格点估算某一点的变形,相较于曲面跟踪可以在保证一定精度条件下大幅提高处理速度。这里介绍一种简单的网格跟踪思路,效果如下图所示:   网格由用户通过输入一个

    2024年02月12日
    浏览(45)
  • Three.js Tri-panner (三面贴图) 材质 两种实现方式

    介绍 Tri-panner 在babylonjs中有支持 但是three.js目前的基础材质并不支持 需要自己定义shader 或者使用目前还没有什么完善的文档的 NodeMaterial 下面展示两种实现方式 自定义shader NodeMaterial 这是threejs新系统充满未来 目前还没有一个完善的文档 并且不太稳定 r132的时候支持这个材质

    2024年01月18日
    浏览(42)
  • web3d-three.js场景设计器-mesh网格添加多模型-模型描述随动

    给场景中的模型加上广告牌描述,可以在模型的MESH里添加Sprite,配上相应的文字, 描述Sprite的位置则是在mesh中的相对位置,比如模型高10,那么我们可以给一个y等于10 来进行适配,这样在移动模型mesh网格时可以整体移动。 function createBox(data) {   const geometry = new THREE.BoxGeom

    2024年02月21日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包