首页 > 其他分享 >点按钮相机飞行到设备前观察

点按钮相机飞行到设备前观察

时间:2024-08-23 08:52:57浏览次数:6  
标签:const THREE js 相机 camera 飞行 obj 按钮 new

效果如下:

882955d977784c618a3a9b7eb5e891fd.png

一、原理

420d85280f0e475d854107cc4257a676.png

2bb909d61b7a437d8c816bb58a2431cc.png

二、完整代码:

1、html

    <div class="pos">
        <div id="A" class="bu">设备A</div>
        <div id="B" class="bu" style="margin-left: 10px;">设备B</div>
        <div id="car" class="bu" style="margin-left: 10px;">停车场</div>
        <div id="all" class="bu" style="margin-left: 10px;">整体</div>
    </div>

2、model.js


// 引入Three.js
import * as THREE from 'three';
// 引入gltf模型加载库GLTFLoader.js
import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js';


const loader = new GLTFLoader(); //创建一个GLTF加载器

const model = new THREE.Group(); //声明一个组对象,用来添加加载成功的三维场景

loader.load("../工厂.glb", function (gltf) { //gltf加载成功后返回一个对象
    // console.log('控制台查看gltf对象结构', gltf);
    // console.log('场景3D模型数据', gltf.scene);
    model.add(gltf.scene); //三维场景添加到model组对象中
})


export default model;
 

3、index.js

import * as THREE from 'three';
import {
    OrbitControls
} from 'three/addons/controls/OrbitControls.js';
import TWEEN from '@tweenjs/tween.js';
import model from './model.js'; //模型对象

//场景
const scene = new THREE.Scene();
scene.add(model); //模型对象添加到场景中


//辅助观察的坐标系
const axesHelper = new THREE.AxesHelper(100);
scene.add(axesHelper);


//光源设置
const directionalLight = new THREE.DirectionalLight(0xffffff, 1);
directionalLight.position.set(100, 60, 50);
scene.add(directionalLight);
const ambient = new THREE.AmbientLight(0xffffff, 0.4);
scene.add(ambient);


//相机
const width = window.innerWidth;
const height = window.innerHeight;
const camera = new THREE.PerspectiveCamera(30, width / height, 1, 3000);
camera.position.set(202, 123, 125);
camera.lookAt(0, 0, 0);


// WebGL渲染器设置
const renderer = new THREE.WebGLRenderer({
    antialias: true, //开启优化锯齿
});
renderer.setPixelRatio(window.devicePixelRatio); //防止输出模糊
renderer.setSize(width, height);
document.body.appendChild(renderer.domElement);
//解决加载gltf格式模型颜色偏差问题
renderer.outputEncoding = THREE.sRGBEncoding;


// 渲染循环
function render() {
    TWEEN.update();
    renderer.render(scene, camera);
    requestAnimationFrame(render);
}
render();

const controls = new OrbitControls(camera, renderer.domElement);

// 画布跟随窗口变化
window.onresize = function () {
    renderer.setSize(window.innerWidth, window.innerHeight);
    camera.aspect = window.innerWidth / window.innerHeight;
    camera.updateProjectionMatrix();
};

// 切换到设备A预览状态
document.getElementById('A').addEventListener('click', function () {
    const A = model.getObjectByName('设备A标注');
    const pos = new THREE.Vector3();
    A.getWorldPosition(pos); //获取三维场景中某个对象世界坐标
    // 相机飞行到的位置和观察目标拉开一定的距离
    const pos2 = pos.clone().addScalar(30);//向量的x、y、z坐标分别在pos基础上增加30
    // 相机从当前位置camera.position飞行三维场景中某个世界坐标附近
    new TWEEN.Tween({
            // 相机开始坐标
            x: camera.position.x,
            y: camera.position.y,
            z: camera.position.z,
            // 相机开始指向的目标观察点
            tx: 0,
            ty: 0,
            tz: 0,
        })
        .to({
            // 相机结束坐标
            x: pos2.x,
            y: pos2.y,
            z: pos2.z,
            // 相机结束指向的目标观察点
            tx: pos.x,
            ty: pos.y,
            tz: pos.z,
        }, 2000)
        .onUpdate(function (obj) {
            // 动态改变相机位置
            camera.position.set(obj.x, obj.y, obj.z);
            // 动态计算相机视线
            camera.lookAt(obj.tx, obj.ty, obj.tz);
        })

        // 考虑OrbitControls的影响,完成时重新设置目标点和更新相机控件
        .onComplete(function(obj){
               controls.target.set(obj.tx, obj.ty, obj.tz);
               controls.update();
          })
        .start();
})
 

ui交互threejsweb3

来自专栏

three.js

resize,m_fixed,h_224,w_224 qq_35430208 35篇文章  1人订阅

pointRight.png

subject.pngAI必读

发布于2024-08-19著作权归作者所有

标签:const,THREE,js,相机,camera,飞行,obj,按钮,new
From: https://blog.csdn.net/cui137610/article/details/141450916

相关文章

  • avalonia学习之按钮
    Button按钮是一个对指针动作做出反应的控件(并且有一些键盘等效物)。当指针向下时,它以按下状态的形式呈现视觉反馈。指向指针释放序列的指针被解释为点击;并且这种行为是可配置的。在确定用户是否按下按钮时,始终使用Click事件而不是PointerPressed。单击是特定于按钮的高级......
  • 怎么对前端的一些按钮做一个权限校验
    在一般情况下,我们需要对一些按钮做一个权限校验,来保证只有有权限的用户才能看到1.创建一个js文件,来写我们的全局方法我的方法是这样的importVuefrom'vue';Vue.mixin({methods:{hasAuth(perm){varauthority=this.$store.state.menu.......
  • 开始搭建每一步图片处理的按钮
    1.读取图片按钮(1)创建主窗体以及读取图片按钮(按钮2)和执行算法流程按钮(按钮1)(2)创建读取图片窗体(窗体1)和选择文件夹按钮(按钮3)(3)进行构造函数RunPro(4)对按钮1进行点击事件其中,调用构造函数RunPro,来获取图片所在文件夹并对文件夹内的图片进行遍历(5)按钮2点击事件,跳转到窗体1......
  • 重启大连市第二十四中学模拟飞行社(草案)
    DigitalFlyingSimulatorClubAerospacePilotingClub尊敬的大连市第二十四中学校团委:我是2023级X班YYY,本人与AAA,BBB...等人,向校团委提交这份申请,真心希望校团委能够重启大连市第二十四中学模拟飞行社团。我们虽然来自不同的班级,但都有着相似或者相同的爱好——憧憬蓝天,要么......
  • 点击按钮实现文件导入/文件上传
    <el-uploadref="upload":accept="上传什么类型的文件"action="faker":limit="1":show-file-list="false":on-change="handleCha......
  • html+css 实现hover 故障效果按钮
    前言:哈喽,大家好,今天给大家分享html+css实现hover故障效果按钮!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏+关注哦......
  • VisionPro连接相机
    相机硬件接口介绍PWR状态灯 常规工业相机电源线介绍搜索CognexGigEVisionConfigura...修改子网掩码为255.255.255.0配置驱动程序更新驱动(如果能够选择9014Bytes,跳过此步骤)更新更改相机ip配置打开visionPro选择照相机查看实时画面运行......
  • 通过相机来获取图片
    文章目录1.概念介绍2.方法与细节2.1实现方法2.2具体细节3.示例代码4.内容总结我们在上一章回中介绍了"如何混合选择多个图片和视频文件"相关的内容,本章回中将介绍如何通过相机获取图片文件.闲话休提,让我们一起TalkFlutter吧。1.概念介绍我们在前面章回......
  • MFC自定义按钮实现
    MFC中要实现自定义按钮,首先要创建一个类并继承自CButton。我这里创建的类名为CMainButtonclassCMainButton:publicCButton{ DECLARE_DYNAMIC(CMainButton)public: CMainButton(UINTnID,CRectrcWnd,CWnd*pParent=nullptr);//nID为按钮ID,rcWnd为按钮位置 virtual~CM......
  • 【Qt笔记】键盘控制Qt按钮
    目录一、前言二、初始化三、键盘移动后需要选中哪个按钮四、键盘按键处理函数五、实现效果一、前言Qt框架支持通过键盘输入来间接控制界面元素,如按钮,实现无需鼠标操作的交互方式。这通常涉及到键盘事件的监听与处理,比如监听特定的按键事件(如空格键、回车键等),并在这些......