首页 > 其他分享 >threejs - js库 gui 的使用 调试开发3D效果

threejs - js库 gui 的使用 调试开发3D效果

时间:2024-05-01 09:22:05浏览次数:27  
标签:threejs const -- gui THREE js add mesh new

// 导入 threejs 
import * as THREE from "three";
import { OrbitControls } from "three/examples/jsm/controls/OrbitControls.js";
// 引入dat.gui.js的一个类GUI
import { GUI } from 'three/addons/libs/lil-gui.module.min.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 替代  十六进制
});
/// 材质设置成线框模式
material.wireframe = true;
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对应的位置

// 引入相机控件  -- 轨道控制器
const controls = new OrbitControls(camera,renderer.domElement);

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

// 使用 GUI 放入全屏和退出全屏功能
const objFun = {
    requestFullscreen:function(){
        document.body.requestFullscreen();
    },
    exitFullscreen:function(){
        document.exitFullscreen(); 
    },
};
// 创建  GUI 对象
const gui = new GUI();
// 参数 : 目标对象,对象的属性 .name() 重新命名
gui.add(objFun,'requestFullscreen').name("全屏");
gui.add(objFun,'exitFullscreen').name("退出全屏");

let folder = gui.addFolder("立方体的位置");
// 网格对象的xyz轴移动
folder.add(mesh.position,"x",0,10).name("网格对象X轴");
folder.add(mesh.position,"y",0,10).name("网格对象X轴");
// folder.add(mesh.position,"z",-10,10,2).name("网格对象X轴");
folder.add(mesh.position,"z").min(0).max(10).step(2).onChange((val) => {
    console.log('事件触发',val);  // val 是 z 值
});

// 材质的修改 -- 线框模式切换
gui.add(material,"wireframe");

// 颜色修改
let colorParams = {
    cubeColor: "#ff0000"
};
gui.addColor(colorParams,"cubeColor").name('材质颜色修改').onChange((val) => {
    console.log(val);
    mesh.material.color.set(val);
});





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

controls.autoRotate = false;  // 自动旋转

// 动态的渲染函数
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,--,gui,THREE,js,add,mesh,new
From: https://www.cnblogs.com/zhulongxu/p/18169016

相关文章

  • html,js代码编译,加密,代码一键打包软件,HTML转exe程序
    个人软件注意杀毒软件会报毒,,放行便可小尘web打包程序可以将整个web工程项目打包成一个exe程序运行不是打包浏览器内核应用,是代码打包软件,打包后和原来一样放在nginx类软件里运行下载地址https://download.csdn.net/download/rllmqe/88789653链接:https://pan.baidu.com/s/1HTql......
  • 使用@lakehouse-rs/flight-sql-client nodejs api 快速访问dremio 服务
    @lakehouse-rs/flight-sql-client是基于rust开发的nodearrowflightsqlclient,dremio目前也是推荐基于arrowflightsql的访问模式参考代码package.json{"name":"node-arrow-flight-sql","version":"1.0.0","ma......
  • TextMeshPro - 和UGUI Text的简单对比
    已经有uguiText了,为什么还要再来个TextMeshPro?1)TextMeshPro使用了更先进的渲染技术,渲染效果更好。同样的36号斜体字在Scene窗口中,我们放大后,Text可以明显的看到锯齿,而TextMeshPro字体的边缘还是圆润光滑。2)TextMeshPro默认支持多种渐变效果3) 性能更好的描边(TextMes......
  • js逆向实战之数位观察响应数据解密
    url:https://www.swguancha.com/home/city-detail?code=310100分析过程抓数据包,发现回显数据是加密字符串。对于这种回显数据解密,大概率通过拦截器实现,搜索interceptors。只需关注响应拦截器,一共两处。第一处,只是对字符串的弹出和插入操作,不是。第二处,可以看到de......
  • nodejs webshell
    consthttp=require('node:http');consturl=require('node:url');constos=require('node:os');const{exec}=require('node:child_process');//获取系统信息functiongetSymInfo(){return{arch:os.arch(),......
  • decimal.js 处理浮点数计算
    decimal.js处理浮点数计算:https://blog.csdn.net/Wustfish/article/details/132835178?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-4-132835178-blog-134384490.235^v43^pc_blog_bottom_relevance_base8&spm=1001.2101.300......
  • 关于JSON转字符串后前端与python得到的结果不一致的问题,及对象按key排序
    背景:哈希码参数校验防参数篡改。前端下发接口时对参数按约定秘钥和逻辑进行加密,后端在获取到请求后对请求参数以同样的秘钥和逻辑加密计算得出哈希值,再与请求的哈希值对比,如果不一致则证明参数被篡改。前端代码:对json对象进行了按key排序1letdataTmp=this.de......
  • Go语言常用标准库——json、文件操作、template、依赖管理及Go_module使用
    文章目录Go语言之jsonMarshal函数Unmarshal函数Go语言之文件操作打开和关闭文件读取文件file.Read()基本使用循环读取bufio读取文件ioutil读取整个文件文件写入操作Write和WriteStringbufio.NewWriterioutil.WriteFile练习copyFile实现一个cat命令template模板模板示例依......
  • permutations and combinations in js All In One
    permutationsandcombinationsinjsAllInOnejs中的排列组合概念排列组合demos/*permutations&combinations排列&组合https://leetcode.com/problems/3sum/给定一个数字数组,找出有三个元素为一组构成的所有不重复的子数字数组!*///constarr=[1,2,......
  • js逆向实战之集思录登录参数加密解析
    url:https://www.jisilu.cn/account/login/分析过程输入用户名和密码,抓包。(因为是测试,输入的账号和密码都是123456)可以看到用户名和密码都被加密了,且是被同一种加密算法加密的。搜索关键词user_name,有很多条记录。一个一个看,很快就可以确定加密的位置。打断点,重新......