three.js使用轨道控件OrbitControls控制相机(vue中使用three.js65)

本文主要是介绍three.js使用轨道控件OrbitControls控制相机(vue中使用three.js65),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

使用轨道控件OrbitControls控制相机

  • 1.demo效果
  • 2.OrbitControls介绍
  • 3. 实现要点
    • 3.1 vue中引入OrbitControls控制器
    • 3.2 创建轨道控件实例
    • 3.3 render中更新轨道控件
  • 4. demo代码

1.demo效果

在这里插入图片描述

如上图,该demo通过轨道控件OrbitControls控制相机。实现按住鼠标左键旋转物体,按住鼠标右键平移物体,滚动滚轮缩放物体,还可以通过方向键移动物体位置

2.OrbitControls介绍

通过轨道控件OrbitControls 可以实现按住鼠标左键旋转物体,按住鼠标右键平移物体,滚动滚轮缩放物体,还可以通过方向键移动物体位置

OrbitControls操控说明
以下是操控和动作的比对说明

操控动作
按鼠标左键移动在场景中旋转物体
按鼠标右键移动在场景中移动物体
滚动滚轮或按住中键并移动缩放物体
方向键场景中移动物体

3. 实现要点

3.1 vue中引入OrbitControls控制器

在项目工程中引入OrbitControls控制器如下

import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls.js'

3.2 创建轨道控件实例

// 创建轨道控制器
createControls() {this.clock = new THREE.Clock() // 创建THREE.Clock对象,用于计算上次调用经过的时间this.controls = new OrbitControls(this.camera, this.renderer.domElement)this.controls.autoRotate = true // 是否自动旋转
}

3.3 render中更新轨道控件

render() {const delta = this.clock.getDelta() //获取自上次调用的时间差this.controls.update(delta) // 相机更新this.renderer.render(this.scene, this.camera)requestAnimationFrame(this.render)
}

4. demo代码

<template><div id="container" />
</template><script>
import * as THREE from 'three'
import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls.js'
export default {data() {return {earchMesh: null,camera: null,scene: null,renderer: null,controls: null}},mounted() {this.init()},methods: {// 初始化init() {this.createScene() // 创建场景this.createModels() // 创建模型this.createLight() // 创建光源this.createCamera() // 创建相机this.createRender() // 创建渲染器this.createControls() // 创建控件对象this.render() // 渲染},// 创建场景createScene() {this.scene = new THREE.Scene()},// 创建模型createModels1() {const publicPath = process.env.BASE_URLconst planetTexture = THREE.ImageUtils.loadTexture(`${publicPath}textures/planets/Earth.png`)const specularTexture = THREE.ImageUtils.loadTexture(`${publicPath}textures/planets/EarthSpec.png`)const normalTexture = THREE.ImageUtils.loadTexture(`${publicPath}textures/planets/EarthNormal.png`)const planetMaterial = new THREE.MeshPhongMaterial()planetMaterial.specularMap = specularTexture// planetMaterial.specular = new THREE.Color(0xff0000)planetMaterial.shininess = 2planetMaterial.normalMap = normalTextureplanetMaterial.map = planetTexture// planetMaterial.shininess = 150const sphereGeom = new THREE.SphereGeometry(20, 40, 40)this.earchMesh = new THREE.Mesh(sphereGeom, planetMaterial)this.scene.add(this.earchMesh)},createModels() {const publicPath = process.env.BASE_URLconst planetTexture = THREE.ImageUtils.loadTexture(`${publicPath}textures/planets/mars_1k_color.jpg`)const normalTexture = THREE.ImageUtils.loadTexture(`${publicPath}textures/planets/mars_1k_normal.jpg`)const planetMaterial = new THREE.MeshPhongMaterial()planetMaterial.map = planetTextureplanetMaterial.bumpMap = normalTexture// planetMaterial.shininess = 50const sphereGeom = new THREE.SphereGeometry(20, 40, 40)this.earchMesh = new THREE.Mesh(sphereGeom, planetMaterial)this.scene.add(this.earchMesh)},// 创建光源createLight() {// 环境光const ambientLight = new THREE.AmbientLight(0x111111) // 创建环境光this.scene.add(ambientLight) // 将环境光添加到场景const directionLight = new THREE.DirectionalLight(0xffffff)directionLight.position.set(-20, 30, 40)directionLight.intensity = 1.5this.scene.add(directionLight)},// 创建相机createCamera() {const element = document.getElementById('container')const width = element.clientWidth // 窗口宽度const height = element.clientHeight // 窗口高度const k = width / height // 窗口宽高比// PerspectiveCamera( fov, aspect, near, far )this.camera = new THREE.PerspectiveCamera(45, k, 0.1, 1000)this.camera.position.set(30, 30, 30) // 设置相机位置this.camera.lookAt(new THREE.Vector3(0, 0, 0)) // 设置相机方向this.scene.add(this.camera)},// 创建渲染器createRender() {const element = document.getElementById('container')this.renderer = new THREE.WebGLRenderer({ antialias: true, alpha: true })this.renderer.setSize(element.clientWidth, element.clientHeight) // 设置渲染区域尺寸this.renderer.shadowMap.enabled = true // 显示阴影// this.renderer.shadowMap.type = THREE.PCFSoftShadowMapthis.renderer.setClearColor(0x000000, 1) // 设置背景颜色element.appendChild(this.renderer.domElement)},render() {const delta = this.clock.getDelta() // 获取自上次调用的时间差this.controls.update(delta) // 相机更新this.renderer.render(this.scene, this.camera)requestAnimationFrame(this.render)},// 创建轨道控制器createControls() {this.clock = new THREE.Clock() // 创建THREE.Clock对象,用于计算上次调用经过的时间this.controls = new OrbitControls(this.camera, this.renderer.domElement)this.controls.autoRotate = true // 是否自动旋转}}
}
</script><style>
#container {position: absolute;width: 100%;height: 100%;
}
</style>

这篇关于three.js使用轨道控件OrbitControls控制相机(vue中使用three.js65)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/277104

相关文章

C#使用MQTTnet实现服务端与客户端的通讯的示例

《C#使用MQTTnet实现服务端与客户端的通讯的示例》本文主要介绍了C#使用MQTTnet实现服务端与客户端的通讯的示例,包括协议特性、连接管理、QoS机制和安全策略,具有一定的参考价值,感兴趣的可... 目录一、MQTT 协议简介二、MQTT 协议核心特性三、MQTTNET 库的核心功能四、服务端(BR

使用@Cacheable注解Redis时Redis宕机或其他原因连不上继续调用原方法的解决方案

《使用@Cacheable注解Redis时Redis宕机或其他原因连不上继续调用原方法的解决方案》在SpringBoot应用中,我们经常使用​​@Cacheable​​注解来缓存数据,以提高应用的性能... 目录@Cacheable注解Redis时,Redis宕机或其他原因连不上,继续调用原方法的解决方案1

CSS 样式表的四种应用方式及css注释的应用小结

《CSS样式表的四种应用方式及css注释的应用小结》:本文主要介绍了CSS样式表的四种应用方式及css注释的应用小结,本文通过实例代码给大家介绍的非常详细,详细内容请阅读本文,希望能对你有所帮助... 一、外部 css(推荐方式)定义:将 CSS 代码保存为独立的 .css 文件,通过 <link> 标签

java中XML的使用全过程

《java中XML的使用全过程》:本文主要介绍java中XML的使用全过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录什么是XML特点XML作用XML的编写语法基本语法特殊字符编写约束XML的书写格式DTD文档schema文档解析XML的方法​​DOM解析XM

使用Java实现Navicat密码的加密与解密的代码解析

《使用Java实现Navicat密码的加密与解密的代码解析》:本文主要介绍使用Java实现Navicat密码的加密与解密,通过本文,我们了解了如何利用Java语言实现对Navicat保存的数据库密... 目录一、背景介绍二、环境准备三、代码解析四、核心代码展示五、总结在日常开发过程中,我们有时需要处理各种软

使用Nginx配置文件服务器方式

《使用Nginx配置文件服务器方式》:本文主要介绍使用Nginx配置文件服务器方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1. 为什么选择 Nginx 作为文件服务器?2. 环境准备3. 配置 Nginx 文件服务器4. 将文件放入服务器目录5. 启动 N

使用nohup和--remove-source-files在后台运行rsync并记录日志方式

《使用nohup和--remove-source-files在后台运行rsync并记录日志方式》:本文主要介绍使用nohup和--remove-source-files在后台运行rsync并记录日... 目录一、什么是 --remove-source-files?二、示例命令三、命令详解1. nohup2.

Qt之QMessageBox的具体使用

《Qt之QMessageBox的具体使用》本文介绍Qt中QMessageBox类的使用,用于弹出提示、警告、错误等模态对话框,具有一定的参考价值,感兴趣的可以了解一下... 目录1.引言2.简单介绍3.常见函数4.按钮类型(QMessage::StandardButton)5.分步骤实现弹窗6.总结1.引言

Python使用Reflex构建现代Web应用的完全指南

《Python使用Reflex构建现代Web应用的完全指南》这篇文章为大家深入介绍了Reflex框架的设计理念,技术特性,项目结构,核心API,实际开发流程以及与其他框架的对比和部署建议,感兴趣的小伙... 目录什么是 ReFlex?为什么选择 Reflex?安装与环境配置构建你的第一个应用核心概念解析组件

Qt中Qfile类的使用

《Qt中Qfile类的使用》很多应用程序都具备操作文件的能力,包括对文件进行写入和读取,创建和删除文件,本文主要介绍了Qt中Qfile类的使用,具有一定的参考价值,感兴趣的可以了解一下... 目录1.引言2.QFile文件操作3.演示示例3.1实验一3.2实验二【演示 QFile 读写二进制文件的过程】4.