Threejs实现天空盒,全景场景,地面草地

简介: Threejs实现天空盒,全景场景,地面草地

1,介绍:


该示例使用的是 r95版本Three.js库。将创建一个场景实现天空盒全景背景图,添加坐标轴,添加地面并设置地面材质。效果图如下:


2,主要说明:


创建天空盒,主要就是6张图构建整个场景的图片。这六张图分别是朝前的(posz)、朝后的(negz)、朝上的(posy)、朝下的(negy)、朝右的(posx)和朝左的(negx)。Three.js会将这些图片整合到一起来创建一个无缝的环境贴图。代码如下:


var scene = new THREE.Scene();
var urls = [
  'assets/textures/cubemap/flowers/posx.jpg',
  'assets/textures/cubemap/flowers/negx.jpg',
  'assets/textures/cubemap/flowers/posy.jpg',
  'assets/textures/cubemap/flowers/negy.jpg',
  'assets/textures/cubemap/flowers/posz.jpg',
  'assets/textures/cubemap/flowers/negz.jpg'
];
var cubeLoader = new THREE.CubeTextureLoader();
scene.background = cubeLoader.load(urls);

创建地面并添加材质,Three.js提供了两个新型材质:THREE.MeshStandardMaterial(标准材质)和THREE.MeshPhysicalMaterial(物理材质),这里使用的是MeshPhysicalMaterial标准材质。代码如下:


/**
 * 创建地面并添加材质
 * wrapS属性定义的是纹理沿x轴方向的行为,而warpT属性定义的是纹理沿y轴方向的行为。
 * Three.js为这些属性提供了如下两个选项:
 * ·THREE.RepeatWrapping允许纹理重复自己。
 * ·THREE.ClampToEdgeWrapping是属性的默认值。
 * 属性值为THREE.ClampToEdgeWrapping时,那么纹理的整体不会重复,只会重复纹理边缘的像素来填满剩下的空间。
 */
function createPlaneGeometryBasicMaterial() {
  var textureLoader = new THREE.TextureLoader();
  var cubeMaterial = new THREE.MeshStandardMaterial({
    map: textureLoader.load("assets/textures/stone/cd.jpg"),
  });
  cubeMaterial.map.wrapS = THREE.RepeatWrapping;
  cubeMaterial.map.wrapT = THREE.RepeatWrapping;
  cubeMaterial.map.repeat.set(8, 8)
  // 创建地平面并设置大小
  var planeGeometry = new THREE.PlaneGeometry(100, 100);
  var plane = new THREE.Mesh(planeGeometry, cubeMaterial);
  // 设置平面位置并旋转
  plane.rotation.x = -0.5 * Math.PI;
  plane.position.x = 0;
  plane.position.z = 0;
  return plane;
}


3,源码如下:


<!DOCTYPE html>
<html>
  <head>
    <title>Threejs实现天空盒、场景背景、全景</title>
    <script type="text/javascript" src="libs/three.js"></script>
    <script type="text/javascript" src="libs/OrbitControls.js"></script>
    <style>
      body {
        margin: 0;
        overflow: hidden;
      }
    </style>
  </head>
  <body>
    <div id="dom"></div>
    <script type="text/javascript">
      var camera;
      var renderer;
      function init() {
        // 创建一个场景,它将包含我们所有的元素,如物体,相机和灯光。
        var scene = new THREE.Scene();
        var urls = [
          'assets/textures/cubemap/flowers/posx.jpg',
          'assets/textures/cubemap/flowers/negx.jpg',
          'assets/textures/cubemap/flowers/posy.jpg',
          'assets/textures/cubemap/flowers/negy.jpg',
          'assets/textures/cubemap/flowers/posz.jpg',
          'assets/textures/cubemap/flowers/negz.jpg'
        ];
        var cubeLoader = new THREE.CubeTextureLoader();
        scene.background = cubeLoader.load(urls);
        // 创建一个摄像机,它定义了我们正在看的地方
        camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 0.1, 1000);
        // 将摄像机对准场景的中心
        camera.position.x = 10;
        camera.position.y = 50;
        camera.position.z = 90;
        camera.lookAt(scene.position);
        var orbit = new THREE.OrbitControls(camera);
        // 创建一个渲染器并设置大小,WebGLRenderer将会使用电脑显卡来渲染场景
        renderer = new THREE.WebGLRenderer();
        renderer.setSize(window.innerWidth, window.innerHeight);
        // scene.add(new THREE.AmbientLight(0x666666));
        var ambientLight = new THREE.AmbientLight("#ffffff", 1);
        scene.add(ambientLight);
        // 在屏幕上显示坐标轴
        var axes = new THREE.AxisHelper(100);
        scene.add(axes);
        // 将平面添加到场景中
        var plane = createPlaneGeometryBasicMaterial();
        scene.add(plane);
        // 将呈现器的输出添加到HTML元素
        document.getElementById("dom").appendChild(renderer.domElement);
        // 启动动画
        renderScene();
        // 创建一个地面
        function createPlaneGeometryBasicMaterial() {
          var textureLoader = new THREE.TextureLoader();
          var cubeMaterial = new THREE.MeshStandardMaterial({
            map: textureLoader.load("assets/textures/stone/cd.jpg"),
          });
          cubeMaterial.map.wrapS = THREE.RepeatWrapping;
          cubeMaterial.map.wrapT = THREE.RepeatWrapping;
          cubeMaterial.map.repeat.set(8, 8)
          // 创建地平面并设置大小
          var planeGeometry = new THREE.PlaneGeometry(100, 100);
          var plane = new THREE.Mesh(planeGeometry, cubeMaterial);
          // 设置平面位置并旋转
          plane.rotation.x = -0.5 * Math.PI;
          plane.position.x = 0;
          plane.position.z = 0;
          return plane;
        }
        function renderScene() {
          orbit.update();
            // 使用requestAnimationFrame函数进行渲染
            requestAnimationFrame(renderScene);
            renderer.render(scene, camera);
        }
        // 渲染的场景
        renderer.render(scene, camera);
      }
      window.onload = init;
      // 随着窗体的变化修改场景
      function onResize() {
          camera.aspect = window.innerWidth / window.innerHeight;
          camera.updateProjectionMatrix();
          renderer.setSize(window.innerWidth, window.innerHeight);
      }
      // 监听窗体调整大小事件
      window.addEventListener('resize', onResize, false);
    </script>
  </body>
</html>
目录
相关文章
|
2月前
|
开发框架
threejs做特效:实现物体的发光效果-EffectComposer详解!
【8月更文挑战第7天】实现物体的发光效果-EffectComposer详解!
94 6
threejs做特效:实现物体的发光效果-EffectComposer详解!
|
2月前
|
API
|
2月前
|
存储 算法 开发者
黑神话:悟空中的动态光照与阴影效果
【8月更文第26天】在《黑神话:悟空》这款游戏中,高质量的光照和阴影效果对于营造出逼真的游戏环境至关重要。为了达到这种效果,游戏开发团队采用了先进的实时渲染技术,包括动态光照和阴影技术。本文将详细介绍这些技术如何被用来增强场景的真实感。
84 3
|
2月前
|
Windows
PPT 三维地球动画
PPT 三维地球动画
14 1
|
2月前
|
图形学
小功能⭐️Unity动态更换天空盒、旋转天空盒
小功能⭐️Unity动态更换天空盒、旋转天空盒
|
5月前
|
前端开发
3D立体盒子练习
3D立体盒子练习
31 0
|
12月前
|
搜索推荐 图形学
透明度和透明贴图制作玻璃水杯
模型透明度是控制整个模型的透明度属性,而透明贴图是一种贴图技术,用于控制模型表面每个像素的透明度级别。透明贴图可以与模型的透明度属性结合使用,以实现更复杂和精细的透明效果。通过调整透明贴图的透明度通道,可以实现模型表面不同部分的个性化透明度设置。
132 0
|
前端开发 容器
3D旋转选秀盒,收纳刹那间的小美好
浏览器发展至今,在网页上呈现 3D 效果已经非常简单了,只需要我们用上一个 css 属性,就可以让我们的页面元素拥有 3D 效果,今天我们就使用这个特性来做一个 3D 旋转盒子。
102 0
Threejs实现宇宙中地球动态展示和卫星绕地运动
Threejs实现宇宙中地球动态展示和卫星绕地运动
953 0
Threejs实现宇宙中地球动态展示和卫星绕地运动
|
前端开发 容器
「CSS畅想」七夕寄情,我绘制了一副双色莲花图
用技术实现梦想,用梦想打开创意之门。七夕寄情,我用CSS绘制了一副双色莲花图。
184 1
「CSS畅想」七夕寄情,我绘制了一副双色莲花图