首页 > 其他分享 >threejs 浏览器窗口resize变化 自适应 html 全屏

threejs 浏览器窗口resize变化 自适应 html 全屏

时间:2024-04-27 16:44:36浏览次数:14  
标签:threejs const html controls THREE camera 全屏 new btn

全屏:画布全屏和body页面全屏;

// 导入 threejs 
import * as THREE from "three";
import { OrbitControls } from "three/examples/jsm/controls/OrbitControls.js";
// 创建场景 scene
const scene = new THREE.Scene();
// console.log(scene,'scene');
// 创建相机 -- 观看物体的不同视角
const camera = new THREE.PerspectiveCamera(
    45, // 视角
    window.innerWidth / window.innerHeight,  // 宽高比
    0.1,  // 近平面
    1000 // 远平面
);
// const camera1 = new THREE.OrthographicCamera();
// console.log('透视投影相机',camera); // 和人的眼睛看的东西一样 近大远小
// console.log('正投影相机',camera1);

// 创建渲染器
const renderer = new THREE.WebGLRenderer();
// console.log('渲染器',renderer);
// 置canvas画设布的尺寸  -- 设置threejs渲染区域的尺寸 像素 px
renderer.setSize(window.innerWidth,window.innerHeight); 
// domElement 就是一个 canvas 标签  结果 -- 把 canvas 渲染到了页面上
document.body.appendChild(renderer.domElement);

// 添加坐标轴
const axesHelper = new THREE.AxesHelper(5); // 参数为轴的长度
scene.add(axesHelper);

// 创建一个集合体 -- 正方体
const gemetry = new THREE.BoxGeometry(1,1,1);
// 创建材质 material  --- 网格基础材质
const material = new THREE.MeshBasicMaterial({
    color: 0x9ac833,  // # 使用 0x 替代  十六进制
});
const material1 = new THREE.MeshBasicMaterial({
    color: 0xee502d,  // # 使用 0x 替代  十六进制
});

// 创建网格模型 -- 就是 3D 物体了 -- 由几何体 gemetry 和 材质 material 构成
const mesh = new THREE.Mesh(gemetry,material); 
const meshParent = new THREE.Mesh(gemetry,material1); 
// console.log('网格',mesh);

// 缩放 scale 设置立方体的放大效果  父元素放大子元素也会随着放大
// 子元素放大是按照父元素的位置放大的
// meshParent.scale.set(2,2,2);  
mesh.scale.set(2,2,2);
// 创建了父元素  把子元素放到 父元素中  ps:position 位置是相对与父元素的位置来说的 即相对位置
meshParent.position.set(-3,0,0);
mesh.position.set(1,0,0);  // 设置物体的位置 x y z  y 轴就是垂直的  (-3,0,0) 才是原点

// 旋转 按照某个坐标轴旋转o3d  -- 欧拉角  -- 指定了顺序和坐标轴
// 绕着x轴旋转  父元素的旋转会使子元素跟随旋转
console.log(Math.PI);
mesh.rotation.x = Math.PI / 4;   // 180 / 4 = 45 度

// 把物体放到场景中间
// scene.add(mesh);
meshParent.add(mesh);
scene.add(meshParent);

// 设置相机的位置 position 
camera.position.set(10,10,10);  // 远距离和近距离
// camera.position.y = 50;  // 远距离和近距离
camera.lookAt(0,0,0);
// camera.lookAt(mesh.position);// 指向mesh对应的位置

// 引入相机控件  -- 轨道控制器
// console.log('OrbitControls',OrbitControls);
const controls = new OrbitControls(camera,renderer.domElement);
// controls.addEventListener('change', function () {
//     renderer.render(scene, camera); //执行渲染操作
// });//监听鼠标、键盘事件

// 浏览器大小调整事件监听  -- 监听窗口的变化
window.addEventListener("resize", () => {
    // console.log('test');
    renderer.setSize(window.innerWidth,innerHeight);  // 根据缩放的窗口重新设置画布的大小
    // 垂直相机宽高比
    camera.aspect = window.innerWidth / window.innerHeight;
    // 更新相机投影矩阵
    camera.updateProjectionMatrix();
});

// 全屏
var btn = document.createElement("button");
btn.innerHTML =  "全屏";
btn.style.position = "absolute";
btn.style.top = "10px";
btn.style.left = "10px";
btn.style.zIndex = 9919;
btn.onclick = function() {
    // renderer.domElement.requestFullscreen();  // 画布全屏
    // body 全屏
    document.body.requestFullscreen();
};
document.body.appendChild(btn);

// 退出全屏
var btn = document.createElement("button");
btn.innerHTML =  "退出全屏";
btn.style.position = "absolute";
btn.style.top = "10px";
btn.style.left = "100px";
btn.style.zIndex = 9919;
btn.onclick = function() {
    document.exitFullscreen();
};
document.body.appendChild(btn);



// 添加带阻尼的惯性
controls.enableDamping = true;   //  设置后会有滑动的效果
controls.dampingFactor = 0.2011;   // 时间越小 滑动的时间越小

controls.autoRotate = false;  // 自动旋转
// console.log(controls);
// controls.addEventListener('change', function () {
//     // 浏览器控制台查看相机位置变化
//     console.log('camera.position',camera.position);
// });
// renderer.render(scene,camera);
// controls.autoRotate = true;  // 自动旋转
// controls.autoRotateSpeed = 10030; // 设置的转速
// controls.dampingFactor = true;
// 动态的渲染函数
function animate() {
    controls.update(); // 如果使用了 autoRotate 属性等 需要在动画中执行 update 方法
    requestAnimationFrame(animate);  // 逐帧渲染
    // 旋转
    // mesh.rotation.x += 0.01;
    // mesh.rotation.y += 0.01;
    renderer.render(scene,camera);
}
animate()

 

标签:threejs,const,html,controls,THREE,camera,全屏,new,btn
From: https://www.cnblogs.com/zhulongxu/p/18162219

相关文章

  • Linux 配置 wkhtmltopdf
    官网地址wkhtmltopdf:https://wkhtmltopdf.org/作用:可以把html页面转换成pdf格式Linux下安装wkhtmltopdf检查linux服务器版本在官网根据版本下载安装#liunx下载版本:centos8wkhtmltox-0.12.6-1版本wgethttps://github.com/wkhtmltopdf/packaging/releases/download/......
  • html+css布局小技巧
      <!DOCTYPEhtml><htmllang="zh-CN"><head><metacharset="UTF-8"><metahttp-equiv="X-UA-Compatible"content="IE=edge"><metaname="viewport"content="......
  • 获取html中的节点对象以及设置标签的属性
    1.设置了三种方法来根据不同的场合获取不同的节点对象:vartest=function(){//获取id的值vard1=document.getElementById("d1");alert(d1.innerHTML)}vartest1=function(){//获取标签的值vardivs=document.getElementsByTagName("div");for(vari=0;i<......
  • [笔记]html+css基础知识
    1.html标签单标签<br/>:换行用<meta/>:存字符编码,作者,版权,关键字,网页说明等信息,不显示在浏览器中a.比如:<metahttp-equiv="Content-Type"content="text/html;charset=gb2312"/><hr/>:插入一条水平线,两个标签表示插入两条<img/>:插入图片a.src是图像存储url或名......
  • 【vue3入门】-【4】插入html
    原始html双大括号,将会将数据插值为纯文本,而不是html,若想要插入html,则需要使用v-html指令<template><h3>模版语法</h3><p>{{tthtml}}</p><!--会直接将html文本展示出来-->><pv-html="tthtml"></p><!--会在进行渲染后展示出来-->></templa......
  • threejs 父元素 相对位置 position 网格对象
    设置position都是相对于父元素的位置设置的//导入threejsimport*asTHREEfrom"three";import{OrbitControls}from"three/examples/jsm/controls/OrbitControls.js";//创建场景sceneconstscene=newTHREE.Scene();//console.log(scene,'scene'......
  • 网页退出全屏和全屏显示
    <div@click="fullScreen">全屏显示</div><div@click="exitFullScreen">退出全屏</div>fullScreen(){varde=document.documentElement;if(de.requestFullscreen){de.requestFull......
  • 前端面试题 - 在HTML5中DOCTYPE的作用是什么?标准与兼容模式(混杂模式)各有什么区别?
    #前端面试题-在HTML5中DOCTYPE的作用是什么?标准与兼容模式(混杂模式)各有什么区别?DOCTYPE(文档类型声明)是一种在HTML文档中使用的标记,用于告诉浏览器使用哪个HTML版本解析文档。它的作用是确保浏览器正确地渲染和显示网页内容。标准模式(严格模式)和兼容模式(混杂模式)是浏览器根......
  • 学习 Avalonia 框架笔记 如何创建一个全屏置顶的 X11 应用窗口
    本文记录我从Avalonia框架里面学到如何创建一个全屏置顶的X11应用窗口的方法开始之前,先从Avalonia或CPF里面拷贝足够的代码,这部分代码可以从本文末尾找到下载方法设置全屏的核心代码是以下三行ChangeWMAtoms(false,XLib.XInternAtom(display,"_NET_WM_STATE_HIDDEN",......
  • 挑战前端基础120题--HTML5基础合集一
    1. 常见HTML5标签?常用的是哪几个?标签有:h1~h6,head,meta,title,link,script,body,header,section,aside,nav,article,dialog,footer,video,audio,canvas,source,div,p,span,ul,li,dt,dl等。(背景色部分为H5新增)日常新标签使用:header,footerdialog,video,audio,canvas等......