Three.js学习(二)几何体的变化

1,313 阅读3分钟

这里开始先介绍一下常用的相机

正投影相机OrthographicCamera

在这种投影模式下,无论物体距离相机距离远或者近,在最终渲染的图片中物体的大小都保持不变。

OrthographicCamera( left : Number, right : Number, top : Number, bottom : Number, near : Number, far : Number )

left — 摄像机视锥体左侧面。
right — 摄像机视锥体右侧面。
top — 摄像机视锥体上侧面。
bottom — 摄像机视锥体下侧面。
near — 摄像机视锥体近端面。
far — 摄像机视锥体远端面。

透视投影相机PerspectiveCamera

这一投影模式被用来模拟人眼所看到的景象,它是3D场景的渲染中使用得最普遍的投影模式

PerspectiveCamera( fov : Number, aspect : Number, near : Number, far : Number )

fov — 摄像机视锥体垂直视野角度
aspect — 摄像机视锥体长宽比
near — 摄像机视锥体近端面
far — 摄像机视锥体远端面

透视投影相机是个锥型,所以满足视野的 近大远小

Three.js学习(一)创建一个简单的立方体 - 掘金 (juejin.cn) 成功创建了一个立方体

这里学习改变object的四种属性
position
scale
rotation
quaternion

在学习之前我们先建立出来坐标系,方便我们更好的观察 立方体在xyz轴中的变化 three.js给了我们辅助三维坐标系AxesHelper 其中的值代表坐标系大小

image.png

调整相机的角度 我们可以看到z轴

image.png

image.png

开始改变

-----------------为了方便观察 以下每个示例后都会还原到在中点的立体图

如果你想改变立方体在XYZ轴上的位置
可以通过给cubeMesh设置position
也可以通过cubeMesh.position.set()直接设置xyz的值

image.png

如果需要缩放 通过给cubeGeometry设置scale
也可以通过cubeMesh.scale.set()直接设置xyz的值

image.png

两种旋转方式

第一种转动场景中的object

使用rotation
通过给cubeMesh设置rotation.x 立方体绕x轴 旋转了45度

image.png

但是有一个点需要特别注意
这里我把原先的立方体变为长方体 const cubeGeometry = new THREE.BoxGeometry(1, 2, 0.5)
并且设置在材质样式中 设置 网格模型以线条的模式渲染wireframe:true,

这样设置的原因是 为了看清楚转换后 object自身三维坐标的转换

我设置如下代码

image.png

最终效果图

image.png

意思是长方体先绕X轴旋转了45度 未标题-1.jpg

然后根据最新的三维坐标 再绕Y轴旋转了45度 就变成了最终效果图的样式

image.png

如果给cubeMesh设置rotation.reorder('YXZ')则执行顺序会发生改变 Y轴---X轴---Z轴
reorder的意思是(重新排序)
则渲染效果如下

image.png

第二种转动场景中的相机

通过设置 三维向量(Vector3)

image.png

在相机中通过lookAt给它一个三维向量,则相机聚焦的中心点就会发生变化\

代码如下时 image.pngcamera.lookAt(new THREE.Vector3(0,0,0)) 相机是看着中间的

image.png

camera.lookAt(new THREE.Vector3(1,0,0))

image.png

camera.lookAt(new THREE.Vector3(3,0,0))

image.png

这里可以观察到相机中点在x轴上又移动了,因为这里使用的是透视投影相机PerspectiveCamera,视野是个锥形,你可以想象你正面看着电脑屏幕 头往右边移动,电脑发生了变化

以下为全部代码

import * as THREE from "three"

// Canvas
const canvas = document.querySelector('canvas.webgl')

// Sizes
const sizes = {
    width: 800,
    height: 600
}

// Scene 场景
const scene = new THREE.Scene()

/**
 * Axes Helper 辅助三维坐标系
 */
const axesHelper = new THREE.AxesHelper(2)
scene.add(axesHelper)

// Object 对象
const cubeGeometry = new THREE.BoxGeometry(1, 1, 1)//创建一个立方体几何对象
const cubeMaterial = new THREE.MeshBasicMaterial({
    color: '#ff0000',
    //wireframe:true,//网格模型以线条的模式渲染
})//材质
const cubeMesh = new THREE.Mesh(cubeGeometry, cubeMaterial)

//cubeMesh.position.x = 2 //立方体在x轴上移动一个单位
// cubeMesh.position.y = 1 //立方体在y轴上移动一个单位
// cubeMesh.position.z = 1 //立方体在z轴上移动一个单位

//cubeMesh.position.set(2,1,1)

//-------------------------------------------------------------------

// cubeMesh.scale.x = 2
// cubeMesh.scale.y = 1.5
// cubeMesh.scale.z = 0

//cubeMesh.scale.set(2,1.5,0) //立方体在x轴上扩展1.2 y轴扩展1.5

//-------------------------------------------------------------------

// cubeMesh.rotation.reorder('YXZ')
// cubeMesh.rotation.x = Math.PI /4
// cubeMesh.rotation.y = Math.PI / 4

scene.add(cubeMesh)


// Camera 相机
const camera = new THREE.PerspectiveCamera(100, sizes.width / sizes.height)
camera.position.z = 3
// camera.position.y = 1
// camera.position.x = 1

// camera.lookAt(new THREE.Vector3(0,0,0))
scene.add(camera)

// Renderer 渲染
const renderer = new THREE.WebGLRenderer({
    canvas: canvas
})
renderer.setSize(sizes.width, sizes.height)
renderer.render(scene, camera)