vue+three加载天空盒

<template>
  <div>
  </div>
</template>

<script setup>
import {onMounted} from "vue";
import * as THREE from "three";
import { OrbitControls } from "three/examples/jsm/controls/OrbitControls.js";
import posx from '../assets/posx.jpg'
import negx from '../assets/negx.jpg'
import posy from '../assets/posy.jpg'
import negy from '../assets/negy.jpg'
import posz from '../assets/posz.jpg'
import negz from '../assets/negz.jpg'

// 场景
const scene=new THREE.Scene()
// 相机
const camera=new THREE.PerspectiveCamera(75,window.innerWidth/window.innerHeight,0.1,1000)
camera.position.y=30
camera.position.z=30
camera.lookAt(scene.position)
// 渲染器
const renderer=new THREE.WebGL1Renderer()
renderer.setSize(window.innerWidth,window.innerHeight)
renderer.render( scene, camera );
document.body.appendChild(renderer.domElement)
// 控制器
const controls=new OrbitControls(camera,renderer.domElement)
// 坐标轴
const axes=new THREE.AxesHelper(50)
scene.add(axes)
// 光照
const pointLight = new THREE.DirectionalLight(0xffffff);
scene.add(pointLight);

// 天空盒
{
  let skyboxCubemap = new THREE.CubeTextureLoader().load([posx, negx, posy, negy, posz, negz]);
  let skyboxShader = THREE.ShaderLib['cube'];
  skyboxShader.uniforms['tCube'].value = skyboxCubemap;
  scene.add(
      new THREE.Mesh(
          new THREE.BoxGeometry(10000, 10000, 10000),
          new THREE.ShaderMaterial({
            fragmentShader: skyboxShader.fragmentShader,
            vertexShader: skyboxShader.vertexShader,
            uniforms: skyboxShader.uniforms,
            depthWrite: false,
            side: THREE.BackSide
          })
      )
  )
}
// 地面
{
  const planeSize = 40;
  const loader = new THREE.TextureLoader();
  const texture = loader.load('https://threejs.org/manual/examples/resources/images/checker.png');
  texture.wrapS = THREE.RepeatWrapping;
  texture.wrapT = THREE.RepeatWrapping;
  texture.magFilter = THREE.NearestFilter;
  const repeats = planeSize / 2;
  texture.repeat.set(repeats, repeats);
  const planeGeo = new THREE.PlaneGeometry(80, 80);
  const planeMat = new THREE.MeshPhongMaterial({
    map: texture,
    side: THREE.DoubleSide,
  });
  const mesh = new THREE.Mesh(planeGeo, planeMat);
  mesh.rotation.x = Math.PI * -.5;
  scene.add(mesh);
}
const init=()=>{
  controls.update()
  requestAnimationFrame(init)
  renderer.render( scene, camera );
}
onMounted(()=>{
  init()
})
</script>

<style scoped>

</style>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值