• Threejs_04 gui调试开发


    threejs的快捷调试工具就是这玩意,那么如何使用呢??

    使用gui调试开发

    引入gui实例

    1. //导入lil.gui
    2. // import * as dat from "dat.gui"; // 旧
    3. import { GUI } from "three/examples/jsm/libs/lil-gui.module.min.js";
    4. //创建gui实例
    5. const gui = new GUI();

    1.全屏按钮

    1.写一个事件集

    1. //1.gui控制按钮
    2. let eventObj = {
    3. Fullscreen: function () {
    4. // 全屏 (画布)
    5. // renderer.domElement.requestFullscreen();
    6. // 全屏 (document.body) 可以看到写入的按钮
    7. document.body.requestFullscreen();
    8. },
    9. exitFullscreen: function () {
    10. // 退出全屏
    11. document.exitFullscreen();
    12. },
    13. };

     2.将事件集中的方法当作参数传入gui中 第一个参数为事件集,第二个参数为事件集中的函数名字。

    1. //添加按钮 第一个参数为对象实例 第二个参数为对象中属性名称
    2. gui.add(eventObj, "Fullscreen").name("全屏");
    3. //退出按钮
    4. gui.add(eventObj, "exitFullscreen").name("退出全屏");

     这样 一个gui控制的全屏 退出全屏就做好了

     2.控制位置按钮

    直接上强度

    1. //2.gui控制立方体的位置
    2. gui.add(cube.position, "x", -5, 5).name("立方体x轴位置");

    第一个参数为要控制的属性,第二个参数为控制的轴,第三个参数和第四个参数为幅度,这是一种直接的写法。

     

    1. //2.gui控制立方体的位置
    2. // gui.add(cube.position, "x", -5, 5).name("立方体x轴位置");
    3. let folder = gui.addFolder("立方体位置");
    4. folder
    5. .add(cube.position, "x")
    6. .min(-10)
    7. .max(10)
    8. .step(1)
    9. .name("立方体x轴位置")
    10. .onChange((val) => {
    11. console.log(val, "x轴位置");
    12. });
    13. folder
    14. .add(cube.position, "y")
    15. .min(-10)
    16. .max(10)
    17. .step(1)
    18. .name("立方体y轴位置")
    19. .onFinishChange((val) => {
    20. console.log(val, "y轴位置");
    21. });
    22. folder.add(cube.position, "z").min(-10).max(10).step(1).name("立方体z轴位置");

    使用addFloder 属性创建一个控制位置的实例也可以很轻松的解决这个问题min和max对应最大值最小值。name为做出来的按钮名字,同时可以使用回调函数来监听变化,使用step属性可以控制每次改变的步幅(一次改变多少) 这样可以很轻松的控制各种参数的变化

    3.控制物料材质

    我们也可以使用工具来控制物料的材质 

    1. //3.gui控制材质
    2. gui.add(parentMaterial, "wireframe").name("父元素线框模式");

    4.控制物料颜色

    1. //4.gui控制方块颜色
    2. let colorParams = {
    3. cubeColor: "#00ff00",
    4. };
    5. gui
    6. .addColor(colorParams, "cubeColor")
    7. .name("立方体颜色")
    8. .onChange((val) => {
    9. // console.log(val,'立方体颜色');
    10. cube.material.color.set(val);
    11. });

     

    全部代码 

    1. //导入 threejs
    2. import * as THREE from "three";
    3. //导入轨道控制器
    4. import { OrbitControls } from "three/examples/jsm/controls/OrbitControls.js";
    5. //导入lil.gui
    6. // import * as dat from "dat.gui"; // 旧
    7. import { GUI } from "three/examples/jsm/libs/lil-gui.module.min.js";
    8. // 创建场景
    9. const scene = new THREE.Scene();
    10. // 创建相机
    11. const camera = new THREE.PerspectiveCamera(
    12. 45, // 视角
    13. window.innerWidth / window.innerHeight, // 宽高比 窗口的宽高进行设置的
    14. 0.1, // 近平面 相机最近最近能看到的物体
    15. 1000 // 远平面 相机最远能看到的物体
    16. );
    17. // 创建渲染器
    18. const renderer = new THREE.WebGLRenderer();
    19. // 设置渲染器的大小 (窗口大小)
    20. renderer.setSize(window.innerWidth, window.innerHeight);
    21. // 将渲染器的dom元素添加到body中
    22. document.body.appendChild(renderer.domElement);
    23. // 创建一个集合体 (立方体)
    24. const geometry = new THREE.BoxGeometry(1, 1, 1);
    25. // 创建材质 (16进制颜色)
    26. const material = new THREE.MeshBasicMaterial({
    27. color: 0x00ff00,
    28. });
    29. const parentMaterial = new THREE.MeshBasicMaterial({
    30. color: 0xff0000,
    31. });
    32. //设置父元素材质为线框
    33. parentMaterial.wireframe = true;
    34. let parentCube = new THREE.Mesh(geometry, parentMaterial);
    35. // 调用参数 创建物体 (网格体)
    36. const cube = new THREE.Mesh(geometry, material);
    37. //父元素中添加子元素
    38. parentCube.add(cube);
    39. parentCube.position.set(-3, 0, 0);
    40. parentCube.rotation.x = Math.PI / 4;
    41. // parentCube.scale.set(2, 2, 2);
    42. // cube.position.x = 2;
    43. cube.position.set(3, 0, 0);
    44. // 设置立方体的放大 相对于父元素 父元素放大了 也会放大 同旋转 会叠加父元素的改变
    45. // cube.scale.set(2, 2, 2);
    46. // 设置立方体的旋转 绕着x旋转
    47. cube.rotation.x = Math.PI / 4;
    48. //将网格体添加到场景中
    49. scene.add(parentCube);
    50. // 设置相机的位置
    51. camera.position.z = 5;
    52. // 为了看到z轴
    53. camera.position.y = 2;
    54. // 设置x轴
    55. camera.position.x = 2;
    56. //设置相机的焦点 (相机看向哪个点)
    57. camera.lookAt(0, 0, 0);
    58. //添加世界坐标辅助器 (红色x轴,绿色y轴,蓝色z轴)一个线段 参数为 线段长度
    59. const axesHelper = new THREE.AxesHelper(5);
    60. //添加到场景之中
    61. scene.add(axesHelper);
    62. // 添加轨道控制器 (修改侦听位置) 一般监听画布的事件 不监听document.body
    63. const controls = new OrbitControls(camera, renderer.domElement);
    64. // 这里传递阻塞掉了 会导致无法点击
    65. // const controls = new OrbitControls(camera, document.body);
    66. // 设置带阻尼的旋转
    67. controls.enableDamping = true;
    68. // 设置阻尼系数
    69. controls.dampingFactor = 0.01;
    70. // 自动旋转
    71. controls.autoRotate = false;
    72. //渲染函数
    73. function animate() {
    74. controls.update();
    75. //请求动画帧
    76. requestAnimationFrame(animate);
    77. //旋转网格体
    78. // cube.rotation.x += 0.01;
    79. // cube.rotation.y += 0.01;
    80. //渲染
    81. renderer.render(scene, camera);
    82. }
    83. animate();
    84. //渲染
    85. // 监听窗口的变化 重新设置渲染器的大小 画布自适应窗口
    86. window.addEventListener("resize", () => {
    87. // 重新设置渲染器的大小
    88. renderer.setSize(window.innerWidth, window.innerHeight);
    89. // 重新设置相机的宽高比
    90. camera.aspect = window.innerWidth / window.innerHeight;
    91. // 重新计算相机的投影矩阵
    92. camera.updateProjectionMatrix();
    93. });
    94. // var btn = document.createElement("button");
    95. // btn.innerHTML = "点击全屏";
    96. // btn.style.position = "absolute";
    97. // btn.style.top = "10px";
    98. // btn.style.left = "10px";
    99. // btn.style.zIndex = "999";
    100. // btn.onclick = function () {
    101. // // 全屏 (画布)
    102. // // renderer.domElement.requestFullscreen();
    103. // // 全屏 (document.body) 可以看到写入的按钮
    104. // document.body.requestFullscreen();
    105. // };
    106. // // 将按钮追加
    107. // document.body.appendChild(btn);
    108. // //退出全屏按钮
    109. // var exitBtn = document.createElement("button");
    110. // exitBtn.innerHTML = "点击退出全屏";
    111. // exitBtn.style.position = "absolute";
    112. // exitBtn.style.top = "10px";
    113. // exitBtn.style.left = "100px";
    114. // exitBtn.style.zIndex = "999";
    115. // exitBtn.onclick = function () {
    116. // // 退出全屏
    117. // document.exitFullscreen();
    118. // };
    119. // // 将按钮追加
    120. // document.body.appendChild(exitBtn);
    121. //使用gui控制器
    122. //1.gui控制按钮
    123. let eventObj = {
    124. Fullscreen: function () {
    125. // 全屏 (画布)
    126. // renderer.domElement.requestFullscreen();
    127. // 全屏 (document.body) 可以看到写入的按钮
    128. document.body.requestFullscreen();
    129. },
    130. exitFullscreen: function () {
    131. // 退出全屏
    132. document.exitFullscreen();
    133. },
    134. };
    135. //创建gui实例
    136. const gui = new GUI();
    137. //添加按钮 第一个参数为对象实例 第二个参数为对象中属性名称
    138. gui.add(eventObj, "Fullscreen").name("全屏");
    139. //退出按钮
    140. gui.add(eventObj, "exitFullscreen").name("退出全屏");
    141. //2.gui控制立方体的位置
    142. // gui.add(cube.position, "x", -5, 5).name("立方体x轴位置");
    143. let folder = gui.addFolder("立方体位置");
    144. folder
    145. .add(cube.position, "x")
    146. .min(-10)
    147. .max(10)
    148. .step(1)
    149. .name("立方体x轴位置")
    150. .onChange((val) => {
    151. console.log(val, "x轴位置");
    152. });
    153. folder
    154. .add(cube.position, "y")
    155. .min(-10)
    156. .max(10)
    157. .step(1)
    158. .name("立方体y轴位置")
    159. .onFinishChange((val) => {
    160. console.log(val, "y轴位置");
    161. });
    162. folder.add(cube.position, "z").min(-10).max(10).step(1).name("立方体z轴位置");
    163. //3.gui控制材质
    164. gui.add(parentMaterial, "wireframe").name("父元素线框模式");
    165. //4.gui控制方块颜色
    166. let colorParams = {
    167. cubeColor: "#00ff00",
    168. };
    169. gui
    170. .addColor(colorParams, "cubeColor")
    171. .name("立方体颜色")
    172. .onChange((val) => {
    173. // console.log(val,'立方体颜色');
    174. cube.material.color.set(val);
    175. });

  • 相关阅读:
    分布式架构与分布式理论
    CSDN编程竞赛-第六期(上)
    【初识GNN】Graphical Neural Networks
    英镑兑美元汇率跌至1985年以来的最低水平 英镑危机临近
    STM32单片机入门学习(一)
    CSDN博客炫丽图标调整字体大小和颜色
    深度学习之卷积模型应用
    基于android的物流管理系统APP(ssm+uinapp+Mysql)
    PHP房贷计算器算法
    基于AT89C51单片机的直流数字电压表设计
  • 原文地址:https://blog.csdn.net/a_strong_pig/article/details/134502276