当前位置: 首页 > article >正文

ThreeJS-VR小岛(二十七)


素材:

链接: https://pan.baidu.com/s/1CXaRgxuIfKfzjDRJ8Gx1oQ

提取码: prg3

复制这段内容后打开百度网盘手机App,操作更方便哦

关键代码:

 let rgbeLoader = new RGBELoader();

    rgbeLoader.loadAsync("three/050.hdr").then((loader) => {

      //添加球形反射映射

      // texture.mapping = THREE.EquirectangularReflectionMapping;

      const material = new THREE.MeshStandardMaterial({

        map: loader,

      });

      //根据几何体和材质创建物体

      const mesh = new THREE.Mesh(cubeGeometry, material);

      mesh.geometry.scale(1,1,-1);

      //将物体加入到场景

      scene.add(mesh);

      //设置场景背景

      // scene.background = texture;

    });

完整代码:

<template>

  <div id="three_div"></div>

</template>

  <script>

import * as THREE from "three";

import { OrbitControls } from "three/examples/jsm/controls/OrbitControls";

import { RGBELoader } from "three/examples/jsm/loaders/RGBELoader";

import { Water } from "three/examples/jsm/objects/Water2";

export default {

  name: "HOME",

  components: {

    // vueQr,

    // glHome,

  },

  data() {

    return {};

  },

  mounted() {

    //使用控制器控制3D拖动旋转OrbitControls

    //控制3D物体移动

    //1.创建场景

    const scene = new THREE.Scene();

    console.log(scene);

    //2.创建相机

    const camera = new THREE.PerspectiveCamera(

      75,

      window.innerWidth / window.innerHeight,

      0.1,

      1000

    );

    //设置相机位置

    camera.position.set(0, 0, 10);

    //将相机添加到场景

    scene.add(camera);

    //添加物体

    //创建一个半径为1,经纬度分段数位20的球

    const cubeGeometry = new THREE.SphereBufferGeometry(4, 50, 50);

    //纹理加载器

    // let cubeTextureLoader = new THREE.CubeTextureLoader();

    // cubeTextureLoader = cubeTextureLoader

    //   .setPath("three/")

    //   .load([

    //     "sphere.webp",

    //     "sphere.webp",

    //     "sphere.webp",

    //     "sphere.webp",

    //     "sphere.webp",

    //     "sphere.webp",

    //   ]);

    // const material2 = new THREE.MeshBasicMaterial({

    //   color: 0x7a1723,

    //   envMap: cubeTextureLoader,

    // });

    // //根据几何体和材质创建物体

    // const mesh2 = new THREE.Mesh(cubeGeometry, material2);

    // // mesh.geometry.scale(1,1,-1);

    // //将物体加入到场景

    // scene.add(mesh2);

    let rgbeLoader = new RGBELoader();

    rgbeLoader.loadAsync("three/050.hdr").then((loader) => {

      //添加球形反射映射

      // texture.mapping = THREE.EquirectangularReflectionMapping;

      const material = new THREE.MeshStandardMaterial({

        map: loader,

      });

      //根据几何体和材质创建物体

      const mesh = new THREE.Mesh(cubeGeometry, material);

      mesh.geometry.scale(1,1,-1);

      //将物体加入到场景

      scene.add(mesh);

      //设置场景背景

      // scene.background = texture;

    });

    //添加坐标轴辅助器

    const axesHepler = new THREE.AxesHelper(5);

    scene.add(axesHepler);

    //标准材质需要借助灯光

    //添加周围环境灯光(由物体发出的灯光)参数(灯色,强度0-1)

    const light = new THREE.AmbientLight(0xffffff, 1);

    scene.add(light);

    const directionLight = new THREE.DirectionalLight(0xffffff, 1);

    scene.add(directionLight);

    //初始化渲染器

    const render = new THREE.WebGLRenderer();

    //设置渲染器的尺寸

    render.setSize(window.innerWidth, window.innerHeight);

    //设置渲染器字节码,增强渲染效果

    render.outputEncoding = THREE.sRGBEncoding;

    //创建轨道控制器,可以拖动,控制的是摄像头

    const controls = new OrbitControls(camera, render.domElement);

    //设置控制阻尼,让控制器有更真实的效果

    controls.enableDamping = true;

    //将webgl渲染的canvas内容添加到body上

    document.getElementById("three_div").appendChild(render.domElement);

    //渲染下一帧的时候就会调用回调函数

    let renderFun = () => {

      //更新阻尼数据

      controls.update();

      //需要重新绘制canvas画布

      render.render(scene, camera);

      //监听屏幕刷新(60HZ,120HZ),每次刷新触发一次requestAnimationFrame回调函数

      //但是requestAnimationFrame的回调函数注册生命只有一次,因此需要循环注册,才能达到一直调用的效果

      window.requestAnimationFrame(renderFun);

    };

    // window.requestAnimationFrame(renderFun);

    renderFun();

    //画布全屏

    window.addEventListener("dblclick", () => {

      if (document.fullscreenElement) {

        document.exitFullscreen();

      } else {

        //document.documentElement.requestFullscreen();

        render.domElement.requestFullscreen();

      }

    });

    //监听画面变化,更新渲染画面,(自适应的大小)

    window.addEventListener("resize", () => {

      //更新摄像机的宽高比

      camera.aspect = window.innerWidth / window.innerHeight;

      //更新摄像机的投影矩阵

      camera.updateProjectionMatrix();

      //更新渲染器宽度和高度

      render.setSize(window.innerWidth, window.innerHeight);

      //设置渲染器的像素比

      render.setPixelRatio(window.devicePixelRatio);

      console.log("画面变化了");

    });

  },

  methods: {

    paush(animate) {

      animate.pause();

    },

  },

};

</script>

<style scoped lang="scss">

</style>

效果图:


http://www.kler.cn/a/6831.html

相关文章:

  • FFmpeg硬件解码
  • PHP中的魔术函数
  • openharmony标准系统方案之瑞芯微RK3568移植案例
  • 微软开源AI Agent AutoGen 详解
  • 中职网络建设与运维ansible服务
  • 语音合成的预训练模型
  • JSwebAPI ,0基础第一天
  • Windows配置虚拟网络
  • 市场监管总局关于对锂离子电池等产品实施强制性产品认证管理的公告
  • GitHub使用技巧
  • ASEMI代理HMC717ALP3E原装ADI(亚德诺)车规级HMC717ALP3E
  • Kafka3.0.0版本——生产者同步发送消息 (API代码示例)
  • 【SSM】Spring6(七.Spring IoC注解式开发)
  • 第四届国际工业信息安全应急大会完美落幕,赛宁网安载誉满满!
  • 安装VMware虚拟机操作到Linux联网时显示线缆被拔出解决方法(以太网不可用)
  • linux命令整理版
  • FreeRTOS任务状态迁移图
  • git放弃修改,强制覆盖本地代码
  • [C++]C++基础知识概述
  • 子网掩码和CIDR
  • vue实现油色谱大卫三角
  • 经济法基础:第三章 支付结算法律制度
  • 服务器: 这个 token 是我的吗? 我不信
  • P5725 【深基4.习8】求三角形
  • 【Python】PyCharm 快捷操作说明(Tip of the Day):Ctrl 键
  • Android应用程序崩溃:影响、原因和解决方案