学习threejs,通过设置纹理属性来修改纹理贴图的位置和大小

👨‍⚕️ 主页: gis分享者

👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅!

👨‍⚕️ 收录于专栏:threejs gis工程师


文章目录


一、🍀前言

本文详细介绍如何基于threejs在三维场景中通过设置纹理属性来修改纹理贴图的位置和大小,亲测可用。希望能帮助到您。一起学习,加油!加油!

1.1 ☘️Texture 贴图

创建一个纹理贴图,将其应用到一个表面,或者作为反射/折射贴图。
构造函数:

Texture( image, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding )
常用属性:

方法:

二、🍀通过设置纹理属性来修改纹理贴图的位置和大小

1. ☘️实现思路

  • 1、初始化renderer渲染器
  • 2、初始化Scene三维场景scene,创建THREE.CubeTextureLoader立方体纹理加载器cubeTextureLoader,加载cubeTextureLoader的六个方位的图片获取纹理对象cubeTexture,scene背景background设置为cubeTexture。
  • 3、初始化camera相机,定义相机位置 camera.position.set
  • 4、初始化THREE.AmbientLight环境光源,scene场景加入环境光源,初始化THREE.DirectionalLight平行光源,设置平行光源位置,设置平行光源投影,scene添加平行光源。
  • 5、加载几何模型:创建THREE.AxesHelper坐标辅助工具helper,scene场景中加入helper。创建THREE.BoxGeometry立方体几何体geometry,创建THREE.MeshBasicMaterial基础材质material,material设置map贴图、水平和垂直贴图包裹,传入geometry和material创建THREE.Mesh网格对象,scene中加入创建的网格对象。
  • 6、加入gui控制(material添加修改纹理贴图的位置和大小方法,具体实现看下面代码样例)、controls控制,加入stats监控器,监控帧数信息。

2. ☘️代码样例

html 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>learn58(通过设置纹理属性来修改纹理贴图的位置和大小)</title>
    <script src="lib/threejs/127/three.js-master/build/three.js"></script>
    <script src="lib/threejs/127/three.js-master/examples/js/controls/OrbitControls.js"></script>
    <script src="lib/threejs/127/three.js-master/examples/js/libs/stats.min.js"></script>
    <script src="lib/threejs/127/three.js-master/examples/js/libs/dat.gui.min.js"></script>
    <script src="lib/js/Detector.js"></script>
</head>
<style type="text/css">
    html, body {
        margin: 0;
        height: 100%;
    }

    canvas {
        display: block;
    }
</style>
<body onload="draw()">
</body>
<script>
  var renderer, camera, scene, gui, light, stats, controls
  var initRender = () => {
    renderer = new THREE.WebGLRenderer({antialias: true})
    renderer.setClearColor(0xeeeeee)
    renderer.setSize(window.innerWidth, window.innerHeight)
    renderer.setPixelRatio(window.devicePixelRatio)
    renderer.shadowMap.enabled = true
    document.body.appendChild(renderer.domElement)
  }

  var initCamera = () => {
    camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 0.1, 1000)
    camera.position.set(0, 0, 15)
  }

  var initScene = () => {
    var cubeTextureLoader = new THREE.CubeTextureLoader()
    cubeTextureLoader.setPath('data/texture/skybox/space/')
    var cubeTexture = cubeTextureLoader.load([
      'right.jpg', 'left.jpg',
      'top.jpg', 'bottom.jpg',
      'front.jpg', 'back.jpg'
    ])
    scene = new THREE.Scene()
    scene.background = cubeTexture
  }

  var initGui = () => {
    gui = {
      offsetX: 0,
      offsetY: 0,
      repeatX: 1,
      repeatY: 1,
      rotation: 0,
      centerX: 0.5,
      centerY: 0.5,
      RepeatWrapping: true
    }
    var datGui = new dat.GUI()
    //将设置属性添加到gui当中,gui.add(对象,属性,最小值,最大值)
    datGui.add(gui, "offsetX", 0.0, 1.0).onChange(updateUV)
    datGui.add(gui, "offsetY", 0.0, 1.0).onChange(updateUV)
    datGui.add(gui, "repeatX", 0.25, 2.0).onChange(updateUV)
    datGui.add(gui, "repeatY", 0.25, 2.0).onChange(updateUV)
    datGui.add(gui, "rotation", -2.0, 2.0).onChange(updateUV)
    datGui.add(gui, "centerX", 0.0, 1.0).onChange(updateUV)
    datGui.add(gui, "centerY", 0.0, 1.0).onChange(updateUV)
    datGui.add(gui, 'RepeatWrapping').onChange(e => {
      if (e) {
        // wrapS表示x轴的纹理的回环方式
        material.map.wrapS = material.map.wrapT = THREE.RepeatWrapping
      } else {
        material.map.wrapS = material.map.wrapT = THREE.ClampToEdgeWrapping //设置会默认的最后一像素伸展
      }
      material.map.needsUpdate = true
    })
  }

  var initLight = () => {
    scene.add(new THREE.AmbientLight(0x444444))
    light = new THREE.DirectionalLight(0xffffff)
    light.position.set(0, 20, 20)
    light.castShadow = true
    scene.add(light)
  }

  var initModel = () => {
    var helper = new THREE.AxesHelper(50)
    scene.add(helper)

    var geometry = new THREE.BoxGeometry(5, 5, 5)
    var loader = new THREE.TextureLoader()
    var texture = loader.load('data/img/UV_Grid_Sm.jpg')
    texture.wrapS = texture.wrapT = THREE.RepeatWrapping
    texture.matrixAutoUpdate = false // 设置纹理属性matrixAutoUpdate为false以后,纹理将通过matrix属性设置的矩阵更新纹理显示
    material = new THREE.MeshBasicMaterial({map: texture})
    scene.add(new THREE.Mesh(geometry, material))
  }

  var updateUV = () => {
    // 一种方法,直接全写在一个方法内
    //texture.matrix.setUvTransform( API.offsetX, API.offsetY, API.repeatX, API.repeatY, API.rotation, API.centerX, API.centerY )

    // 另一种方法,分开写
    material.map.matrix
      .identity() //矩阵重置
      .translate(-gui.centerX, -gui.centerY) //设置中心点
      .rotate(gui.rotation) // 旋转
      .scale(gui.repeatX, gui.repeatY) //缩放
      .translate(gui.centerX, gui.centerY) //设置中心点
      .translate(gui.offsetX, gui.offsetY) //偏移
  }

  var initStats = () => {
    stats = new Stats()
    document.body.appendChild(stats.dom)
  }
  var initControls = () => {
    controls = new THREE.OrbitControls(camera, renderer.domElement)
    controls.enableDamping = true
  }

  var render = () => {
    renderer.render(scene, camera)
  }

  var onWindowResize = () => {
    camera.aspect = window.innerWidth / window.innerHeight
    camera.updateProjectionMatrix()
    renderer.setSize(window.innerWidth, window.innerHeight)
  }

  var animate = () => {
    render()
    stats.update()
    controls.update()
    requestAnimationFrame(animate)
  }

  var draw = () => {
    if (!Detector.webgl) Detector.addGetWebGLMessage()

    initGui()
    initRender()
    initScene()
    initCamera()
    initLight()
    initModel()
    initStats()
    initControls()

    animate()

    window.onresize = onWindowResize
  }
</script>
</html>

效果如下:

相关推荐
gis分享者21 小时前
学习threejs,使用VideoTexture实现视频Video更新纹理
threejs·视频贴图·videotexture
gis分享者6 天前
学习threejs,使用设置normalMap法向量贴图创建更加细致的凹凸和褶皱
threejs·normalmap·法向量贴图
gis分享者6 天前
学习threejs,使用CubeCamera相机创建反光效果
threejs·cubecamera·立方体相机·反光效果
gis分享者12 天前
学习threejs,通过SkinnedMesh来创建骨骼和蒙皮动画
threejs·蒙皮网格·skinnedmesh·骨骼和蒙皮动画
gis分享者13 天前
学习threejs,导入FBX格式骨骼绑定模型
threejs·骨骼动画·fbx
gis分享者14 天前
学习threejs,对模型多个动画切换展示
threejs·动画切换
allenjiao14 天前
webgl threejs 云渲染(服务器渲染、后端渲染)解决方案
webgl·云渲染·threejs·服务器渲染·后端渲染·云流化·三维云渲染
gis分享者19 天前
学习threejs,使用TWEEN插件实现动画
threejs·tween·补间动画
优雅永不过时·19 天前
Three.js 原生 实现 react-three-fiber drei 的 磨砂反射的效果
前端·javascript·react.js·webgl·threejs·three