Skip to content
本页目录

物体的缩放、位移和旋转

缩放

js
//例如设置x轴放大3倍、y轴方向放大2倍、z轴方向不变
cube.scale.set(3, 2, 1)
//单独设置某个轴的缩放
cube.scale.x = 3

位移

js
cube.position.set(1, 2, 3)

//单独设置某个轴的位移
cube.position.x = 3

旋转

js
//直接设置旋转属性,例如围绕x轴旋转90度
cube.rotation.x = -Math.PI / 4

//围绕x轴旋转45度
cube.rotation.set(-Math.PI / 4, 0, 0, 'XZY')

效果

代码

vue
<template>
  <div>
    <canvas ref="canvas" />
  </div>
</template>

<script setup lang="ts">
import * as THREE from 'three'
import { ref, onMounted } from 'vue'
// import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls'

const canvas = ref()

onMounted(async () => {
  const { OrbitControls } = await import('three/examples/jsm/controls/OrbitControls')

  // 创建一个场景
  const scene = new THREE.Scene()

  // 创建一个相机(透视相机)
  // 角度,宽高比, 进端, 远端
  const camera: any = new THREE.PerspectiveCamera(
    75,
    parseInt(getComputedStyle(canvas.value).width) / window.innerHeight,
    0.1,
    1000
  )

  // 设置相机位置
  camera.position.set(0, 0, 10)

  // 添加到场景中
  scene.add(camera)

  // 创建几何体
  const cubeGeometry = new THREE.BoxGeometry(1, 1, 1)
  // 创建材质
  const cubeMaterial = new THREE.MeshBasicMaterial({ color: 0xffaa00 })
  // 根据几何体和材质创建物体
  const cube: any = new THREE.Mesh(cubeGeometry, cubeMaterial)

  // 将几何体添加到场景中
  scene.add(cube)

  //例如设置x轴放大3倍、y轴方向放大2倍、z轴方向不变
  // cube.scale.set(3, 2, 1);
  //单独设置某个轴的缩放
  cube.scale.y = 3

  cube.position.x = 1
  cube.position.y = 3
  // cube.position.set(1,2,3)

  //直接设置旋转属性,例如围绕y轴旋转90度
  cube.rotation.y = -Math.PI / 4

  //围绕x轴旋转45度
  // cube.rotation.set(-Math.PI / 4,  0, 0,"XZY");

  // 初始化渲染器
  const renderer = new THREE.WebGLRenderer({
    // 将webGL渲染的canvas添加到dom上
    canvas: canvas.value,
    // 允许透明
    alpha: true
  })
  // 设置背景色
  renderer.setClearColor(0x007fff, 0.2)
  // 设置渲染的尺寸大小
  renderer.setSize(parseInt(getComputedStyle(canvas.value).width), window.innerHeight)

  // 创建轨道控制器
  // 要控制的相机,canvas元素
  const controls = new OrbitControls(camera, renderer.domElement)

  function render() {
     // 每一帧位移 0.01
    cube.position.x += 0.01
    // 每一帧缩放 0.01
    cube.scale.y += 0.01
    // 每一帧旋转 0.1°
    cube.rotation.y += 0.01
    if (cube.position.x > 3) {
      cube.position.x = 0
      cube.scale.y = 1
      cube.rotation.y = 0
    }

    // 使用渲染器,通过场景,相机来渲染
    renderer.render(scene, camera)
    //   渲染下一帧的时候就会调用render函数
    requestAnimationFrame(render)
  }
  render()

  // 添加坐标轴辅助器
  const axesHelper = new THREE.AxesHelper(5)
  scene.add(axesHelper)
})
</script>
<style scoped>
canvas {
  width: 100%;
  height: 100vh;
}
</style>

lemon's personal blog.