three.js官网即开发dome

three.js官方
官网地址:threejs官网网址
three.js中文网
http://www.webgl3d.cn/

根据官网文档
安装依赖
安装threejs和构建工具vite

# three.js
npm install --save three

# vite
npm install --save-dev vite

在终端运行

npx vite

为啥用npx,npx是什么?
npx 与 Node.js 一同安装,可运行 Vite 等命令行程序,这样你就不必自己在 node_modules/ 中搜索正确的文件。

1.创建3D场景

	import * as THREE from 'three';
	//引入轨道控制器
	import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls.js';
	// 创建3d场景
	const scene = new THREE.Scene();
    //创建相机
      const camera = new THREE.PerspectiveCamera(75, 100 / 200, 0.1, 100);
      camera.position.z = 1;
      camera.position.y = 1;
      //创建图形
      const geometry = new THREE.BoxGeometry();
      //创建材质
      const material = new THREE.MeshBasicMaterial({ color: 0x00ff00 });
      //创建网格
      const cube = new THREE.Mesh(geometry, material);
      scene.add(cube);
      //添加网格地面
      const gridHelper = new THREE.GridHelper(30, 30);
      scene.add(gridHelper);

      //创建渲染器
      const renderer = new THREE.WebGLRenderer();
      renderer.setSize(width, height);
      renderer.setAnimationLoop( animate );
      document.body.appendChild(renderer.domElement);
      //创建轨道控制器
      const controls = new OrbitControls(camera, renderer.domElement);
      //监听轨道控制器
      controls.addEventListener('change', function () {
        // renderer.render(scene, camera);
      });
      //添加动画效果
      function animate(time) {
        requestAnimationFrame(animate);
        cube.rotation.x = time /2000;
        cube.rotation.y = time /1000;
        controls.update();//添加轨道控制器
        renderer.render(scene, camera);//进行渲染
      }

2.轨道控制器(OrbitControls)
是附加组件,需要单独引入

/引入轨道控制器
import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls.js';

属性(开发时查看官方文档)

 	//创建轨道控制器
    const controls = new OrbitControls(camera, renderer.domElement);
    //监听轨道控制器
    controls.addEventListener('change', function () {
        //监听
    });
	//添加阻尼
    controls.enableDamping = true;
    controls.dampingFactor = 0.05;
    //自动旋转
    controls.autoRotate = true;

3.三维坐标轴(AxesHelper)
用于简单模拟3个坐标轴的对象.
红色代表 X 轴. 绿色代表 Y 轴. 蓝色代表 Z 轴.

4.材质贴图和环境贴图
map材质贴图

 //创建纹理
      const texture = new THREE.TextureLoader().load( "textures/mu.jpg" );
       //创建图形
      const geometry = new THREE.BoxGeometry(1,1,1);
      //创建材质
      const material = new THREE.MeshBasicMaterial({ 
        // color: 0x00ff00 //16进制
        map: texture
      });

立体纹理(cubeTexture)
alphaMap环境贴图

5.threejs_dome项目开发
1>项目搭建(有Node.js,脚手架的环境)

vue create threejs_dome

选择vue3搭建项目搭建完成后下载相关依赖
下载安装three.js (注意版本)

npm i threejs

下载UI组件element- plus,icon库,工具库lodash,less,less-loader

npm i element-plus 
npm i  @element-plus/icons-vue vue-router lodash 
npm i less less-loader

2> 路由配置
在router.js文件配置路由

import { createRouter,createWebHistory } from 'vue-router'
const routes = [
  {
    path: '/login',
    name: 'Login',
    component: () => import('../views/login.vue')
  }
  //自行定义路由....
]

export default createRouter({
  history: createWebHistory(),
  routes
})

路由挂载到main.js文件
App文件加路由显示占位
3> threejs_dome文件

import {onMounted} from 'vue' //引入生命周期
import * as THREE from 'three' //引入three
import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls' //引入轨道控制器


//定义变量
let container //容器  
const Image_bg = new URL('../assets/images/bg.jpg',import.meta.url) .href//加载图片
const Image_map = new URL('../assets/images/map.jpg',import.meta.url) .href//纹理贴图
let width //宽度
let height //高度
let depth = 1400 //深度
let zAxis  //相机在z轴的位置
let camera //相机
let scene //场景
let renderer //渲染器
let sphere //球体网格

onMounted(() => {
  container = document.getElementById('login-three-container')
  width = container.clientWidth
  height = container.clientHeight
  initScene()//初始化场景
  initSceneBg()//初始化背景
  initCamera()//初始化相机
  initSphere() //初始化球体
  initLight()//初始化灯光
  initOrbitControls()//初始化控制器
  initRenderer()//初始化渲染器
  animate()//动画
})
 

//场景
  const initScene = () => {
    scene = new THREE.Scene() //场景
    scene.fog = new THREE.Fog(0x000000, 0, 10000)//雾
  }
  //背景
  const initSceneBg = () =>{
    //创建纹理
    new THREE.TextureLoader().load(Image_bg,(texture) =>{
      //创建立方体
      const geometry = new THREE.BoxGeometry(width, height, depth)
      //材质
      const material = new THREE.MeshBasicMaterial({ map: texture,side: THREE.BackSide })//side 显示位置
      //网格
      const mesh = new THREE.Mesh(geometry, material)
      //添加场景
      scene.add(mesh)
    })
    const geometry = new THREE.BoxGeometry(100, 100, 100)
    const material = new THREE.MeshBasicMaterial({ map: texture })

  }
  //相机
  const initCamera = () => {
    //视野夹角
    const fov = 15
    //相机距离物体的距离(已知一条边:物体的宽度/2,算出相机距离物体的距离,Math.PI是180除以12等于15夹角)
    const distance = width / 2 /Math.tan( Math.PI / 12)
    zAxis = Math.floor(distance - depth / 2 )//有可能出现小数用Math.floor取整照相机z轴距离
    camera.position.set(0, 0, zAxis)
    camera = new THREE.PerspectiveCamera(fov, width / height, 1, 30000)
    //设置相机所在的位置
    camera.position.set(0, 0, zAxis)
    //相机看向原点
    camera.lookAt(0, 0, 0)
  }
  //创建球体
  const initSphere = () => {
    const geometry = new THREE.SphereGeometry(50, 64, 32)
    //高光材质
    const material = new THREE.MeshBasicMaterial({ color: 0xffffff })
    //添加纹理
    const texture = new THREE.TextureLoader().load(Image_map)
    material.map(texture)
    //位置
    sphere.position.set(1400, 200, -200)
    //网格
    sphere = new THREE.Mesh(geometry, material)
    scene.add(sphere)
  }
  //光照
  const initLight = () => {
  //环境光
  const ambientLight = new THREE.AmbientLight(0xffffff, 1)
  scene.add(ambientLight)
  //点光源
  const pointLight = new THREE.PointLight(0xffffff, 5, 0)
  //设置位置
  pointLight.position.set(0, 100, -200)
  scene.add(pointLight)
  }
  //球体的自转
  const renderSphere = () => {
    sphere.rotateY(0.001)
  }
  //渲染器
  const initRenderer = () => {
    renderer = new THREE.WebGLRenderer({ antialias: true })
    //定义渲染器的尺寸
    renderer.setSize(width, height)
    //renderer.setPixelRatio(window.devicePixelRatio)
    //挂载到容器中
    container.appendChild(renderer.domElement)
  }
  //轨道控制器
  const initOrbitControls = () => {
    const controls = new OrbitControls(camera, renderer.domElement)
    //能够控制属性
    controls.enable = true
    //自动更新
    controls.update()
  }
 //动画刷新
  const animate = () => {
    //重绘制
    renderer.render(scene, camera)
    requestAnimationFrame(animate)
    renderSphere()//球体动画
  }
  • 8
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要实现一个完整的车内场景,需要进行以下步骤: 1. 创建一个球体(Sphere)来表示车内场景的完整的 dome。 2. 使用 Three.js 中的 CubeTextureLoader 加载一个天空盒贴图(Skybox texture)。 3. 将天空盒贴图设置为球体的材质(Material)。 4. 如果需要在车内场景中添加其他物体,如座椅、方向盘等,可以按照常规的 Three.js 开发流程来添加这些物体。 以下是一个简单的示例代码,可以作为参考: ```javascript // 创建场景 var scene = new THREE.Scene(); // 创建相机 var camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000); camera.position.set(0, 0, 0); // 创建球体 var sphereGeometry = new THREE.SphereGeometry(500, 60, 40); var sphereMaterial = new THREE.MeshBasicMaterial({ envMap: new THREE.CubeTextureLoader().load([ 'skybox_px.jpg', 'skybox_nx.jpg', 'skybox_py.jpg', 'skybox_ny.jpg', 'skybox_pz.jpg', 'skybox_nz.jpg' ]) }); var sphere = new THREE.Mesh(sphereGeometry, sphereMaterial); sphere.material.side = THREE.BackSide; scene.add(sphere); // 添加其他物体 // ... // 渲染场景 var renderer = new THREE.WebGLRenderer(); renderer.setSize(window.innerWidth, window.innerHeight); document.body.appendChild(renderer.domElement); function animate() { requestAnimationFrame(animate); renderer.render(scene, camera); } animate(); ``` 其中,'skybox_px.jpg' 等六张图片分别表示天空盒贴图的六个面。可以在网上搜索下载这些图片,也可以使用 Three.js 提供的示例图片。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值