美文网首页
three.js - Transform objects

three.js - Transform objects

作者: 闪电西兰花 | 来源:发表于2023-09-02 18:16 被阅读0次
    关于物体位移、旋转、缩放等属性可参考此文档 Object3D
    • position
      • position is not just an object,position inherit from Vector3
      • mesh.position.length() 计算从(0,0,0)到(x,y,z)的欧几里得长度,即直线长度
      • mesh.position.distanceTo(vector3)计算向量之间的距离,接收一个三维向量
      • mesh.position.normalize()转换为单位向量
    // Cube
    const geometry = new THREE.BoxGeometry(1,1,1) // 1表示一个单位
    const material = new THREE.MeshBasicMaterial({
      color: '#ff0000'
    })
    const mesh = new THREE.Mesh(geometry, material)
    
    // 修改position写法1:
    mesh.position.x = 0.7
    mesh.position.y = -0.6
    mesh.position.z = 8
    
    // 修改position写法2:
    // mesh.position.set(0.7,-0.6,8)
    
    scene.add(mesh)
    
    // 4. mesh.position.normalize() // 转换为单位向量
    
    // 1. 场景中心(0,0,0)和物体之间的距离
    // normalize后场景中心与物体间的距离为1
    console.log(mesh.position.length())
    
    // 2. 物体至某向量之间的距离,distanceTo方法接受一个三维向量
    console.log(mesh.position.distanceTo(new THREE.Vector3(0.7,-0.6,8)))
    
    // Sizes
    const sizes = {
      width: 800,
      height: 600
    }
    
    // Camera
    const camera = new THREE.PerspectiveCamera(75, sizes.width / sizes.height) 
    camera.position.set(0, 0, 10)
    scene.add(camera) 
    
    // 3. 物体与camera之间的距离
    console.log(mesh.position.distanceTo(camera.position))
    
    • position - 父子元素
      • position属性表示对象的局部位置
      • 几何体直接add进场景时,几何体坐标(也就是几何体位置)是直接参照世界坐标系的,但当一个几何体被add到另一个几何体时(父几何体),几何体位置则相对这个父几何体
      • 以下代码的结果是:子几何体位于原点坐标位置
      // 创建几何体(父子共用)
      const geometry = new THREE.BoxGeometry(1, 1, 1) 
    
      // 子几何体
      const material = new THREE.MeshBasicMaterial({ 
        color: 0x00ff00
      })
      const cube = new THREE.Mesh(geometry, material) 
      cube.position.x = 3 // 修改子几何体位置
    
      // 父几何体
      const parentMaterial = new THREE.MeshBasicMaterial({ 
        color: 0xff0000
      })
      const parentCube = new THREE.Mesh(geometry, parentMaterial)
      parentCube.add(cube) // 将几何体添加进父几何体
      parentCube.position.set(-3, 0 ,0) // 修改父几何体位置
      
      // 将父几何体添加进场景
      scene.add(parentCube) 
    
    • 坐标轴及方向 the direction of each axis is arbitrary,in three.js,we consider:
      • y axis is going upward,green
      • z axis is going backward,blue
      • x axis is going to the right,red
    // Axes helper
    const axesHelper = new THREE.AxesHelper(6) // 坐标轴线段长度
    scene.add(axesHelper)
    
    • scale
      • the default value of each axis is 1
    // 修改scale写法1:
    // mesh.scale.x = 1.4
    // mesh.scale.y = 0.5
    // mesh.scale.z = 2
    
    // 修改scale写法2:
    mesh.scale.set(1.4, 0.5, 2)
    
    • scale - 父子元素
      • scale属性表示对象的局部缩放
      • 父几何体的缩放会影响子几何体,假设父几何体放大2倍,意味着子几何体也会放大2倍;
      • 以下代码结果是: 子几何体放大4倍
    cube.scale.set(2, 2, 2) // 子几何体
    parentCube.scale.set(2, 2, 2) // 父几何体
    
    • rotate
      • with rotation or quaternion,互相绑定
      • rotation has x,y and z properties, but it's a Euler
      • when you change the x,y and z properties,you can imagine putting a stick througth your object's center in the axis's direction and then rotating object on that stick
      • when you rotate on an axis,you might also rotate other axis,例如当在x轴旋转一定角度后,此时的y轴已经变化了
      • 万向节锁:the rotation gose by default in the x,y and z order and you can get strange result like an axis not working anymore ,this is called gimbal lock; 变更旋转顺序:you can change the order by using the object.rotation.reorder('YZX'),do it before changing the rotation
    // 默认旋转顺序:XYZ
    
    // 修改rotation写法1:
    // mesh.rotation.reorder('YXZ')
    // mesh.rotation.x = Math.PI / 4
    // mesh.rotation.y = Math.PI / 4
    
    // 修改rotation写法2:
    mesh.rotation.set(Math.PI / 4, Math.PI / 4, 0, 'YXZ')
    
    • rotate - 父子元素
      • rotation属性表示物体局部旋转
      • 以下代码表示,分别设置父元素旋转45°,子元素旋转45°,实际呈现的结果是子元素旋转了90°
      cube.rotation.x = Math.PI / 4 // 子元素
      parentCube.rotation.x = Math.PI / 4 // 父元素
    
    • lookAt()
      • 相机焦点方向,相机看向某个坐标,接受一个三维变量
    camera.lookAt(mesh.position) // 相机看向物体
    // camera.lookAt(new THREE.Vector3(0,1,0))
    
    • scene graph
      • you can put objects inside groups and use position,rotation and scale on those groups
      • 删除原先cube以及scle,rotation,position的部分
    import * as THREE from "three"
    
    // Scene
    const scene = new THREE.Scene()
    
    // group
    const group = new THREE.Group()
    group.position.y = 1
    group.scale.x = 2
    group.rotation.x = Math.PI / 4
    scene.add(group)
    
    const cube1 = new THREE.Mesh(
      new THREE.BoxGeometry(1,1,1),
      new THREE.MeshBasicMaterial({color: '#ff0000'})
    )
    cube1.position.x = 4
    
    group.add(cube1)
    
    const cube2 = new THREE.Mesh(
      new THREE.BoxGeometry(1,1,1),
      new THREE.MeshBasicMaterial({color: '#00ff00'})
    )
    cube2.position.set(0,4,0)
    
    group.add(cube2)
    
    const cube3 = new THREE.Mesh(
      new THREE.BoxGeometry(1,1,1),
      new THREE.MeshBasicMaterial({color: '#0000ff'})
    )
    cube3.position.set(0,0,4)
    
    group.add(cube3)
    
    // Axes helper
    const axesHelper = new THREE.AxesHelper(6) // 坐标轴长度
    scene.add(axesHelper)
    
    // Sizes
    const sizes = {
      width: 800,
      height: 600
    }
    
    // Camera
    // 垂直视野,纵横比
    const camera = new THREE.PerspectiveCamera(75, sizes.width / sizes.height) 
    // 修改camera位置,默认所有东西都在场景中心,也就是修改位置前camera位于立方体的内部中心
    camera.position.set(2, 2, 10)
    // camera.lookAt(mesh.position)
    // camera.lookAt(new THREE.Vector3(3,0,0))
    scene.add(camera) 
    
    // 物体与camera之间的距离
    // console.log(mesh.position.distanceTo(camera.position))
    
    // Render
    const renderer = new THREE.WebGLRenderer({})
    renderer.setSize(sizes.width, sizes.height)
    document.body.appendChild(renderer.domElement)
    renderer.render(scene, camera)
    

    相关文章

      网友评论

          本文标题:three.js - Transform objects

          本文链接:https://www.haomeiwen.com/subject/dyzludtx.html