【前端知识】Three 学习日志(九)—— 阵列立方体和相机适配体验

Three 学习日志(九)------ 阵列立方体和相机适配体验

一、双层for循环创建阵列模型
javascript 复制代码
//创建一个长方体几何对象Geometry
const geometry = new THREE.BoxGeometry(100, 100, 100);
//材质对象Material
const material = new THREE.MeshLambertMaterial({
    color: 0x00ffff, //设置材质颜色
    transparent: true,//开启透明
    opacity: 0.5,//设置透明度
});
for (let i = 0; i < 10; i++) {
    for (let j = 0; j < 10; j++) {
        const mesh = new THREE.Mesh(geometry, material); //网格模型对象Mesh
        // 在XOZ平面上分布
        mesh.position.set(i * 200, 0, j * 200);
        scene.add(mesh); //网格模型添加到场景中  
    }
}
二、调整相机位置,改变观察范围
javascript 复制代码
const camera = new THREE.PerspectiveCamera(30, width / height, 1, 3000);
//在原来相机位置基础上拉远,可以观察到更大的范围
 camera.position.set(800, 800, 800);
 camera.lookAt(0, 0, 0);
三、超出视锥体远裁界面的范围的会被剪裁掉,不渲染,可以调整far参数适配
javascript 复制代码
const camera = new THREE.PerspectiveCamera(30, width / height, 1, 8000);
camera.position.set(2000, 2000, 2000);
camera.lookAt(0, 0, 0);
四、改变相机观测点
javascript 复制代码
// 改变相机观察目标点
camera.lookAt(1000, 0, 1000);
// 设置相机控件轨道控制器OrbitControls
const controls = new OrbitControls(camera, renderer.domElement);
// 相机控件.target属性在OrbitControls.js内部表示相机目标观察点,默认0,0,0
// console.log('controls.target', controls.target);
controls.target.set(1000, 0, 1000);
controls.update();//update()函数内会执行camera.lookAt(controls.targe)
五、完整代码
html 复制代码
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Learn Three</title>
    <!-- 引入three,下载地址参考:http://www.webgl3d.cn/pages/aac9ab/#%E7%89%B9%E5%AE%9A%E7%89%88%E6%9C%ACthree-js%E6%96%87%E4%BB%B6%E5%8C%85%E4%B8%8B%E8%BD%BD -->
    <script src="../build/three.js"></script>
    <!-- 引入相机控件 -->
    <script type="importmap">
        {
            "imports": {
                "three": "../build/three.module.js",
                "three/addons/": "../examples/jsm/"
            }
        }
    </script>
</head>

<body>
    <script type="module">
        // 引入轨道控制器扩展库OrbitControls.js
        import { OrbitControls } from 'three/addons/controls/OrbitControls.js';
        // 创建3D场景对象Scene
        const scene = new THREE.Scene();
        const axesHelper = new THREE.AxesHelper(150);
        scene.add(axesHelper);

        //创建一个长方体几何对象Geometry
        const geometry = new THREE.BoxGeometry(100, 100, 100);
        //材质对象Material
        const material = new THREE.MeshLambertMaterial({
            color: 0x00ffff, //设置材质颜色
            transparent: true,//开启透明
            opacity: 0.5,//设置透明度
        });
        for (let i = 0; i < 10; i++) {
            for (let j = 0; j < 10; j++) {
                const mesh = new THREE.Mesh(geometry, material); //网格模型对象Mesh
                // 在XOZ平面上分布
                mesh.position.set(i * 200, 0, j * 200);
                scene.add(mesh); //网格模型添加到场景中  
            }
        }

        // //环境光强度调整为0.8
        const ambient = new THREE.AmbientLight(0xffffff, 0.4);
        scene.add(ambient);

        const width = window.innerWidth; // 窗口宽度
        const height = window.innerHeight; // 窗口高度
        // const camera = new THREE.PerspectiveCamera();
        // camera.position.set(200, 200, 200);
        // camera.lookAt(0, 0, 0);
        // const camera = new THREE.PerspectiveCamera(30, width / height, 1, 3000);
        // //在原来相机位置基础上拉远,可以观察到更大的范围
        // camera.position.set(800, 800, 800);
        // camera.lookAt(0, 0, 0);

        // const camera = new THREE.PerspectiveCamera(30, width / height, 1, 3000);
        const camera = new THREE.PerspectiveCamera(30, width / height, 1, 8000);
        // camera.position.set(292, 223, 185);
        // 超出视锥体远裁界面的范围的会被剪裁掉,不渲染,可以调整far参数适配
        camera.position.set(2000, 2000, 2000);
        camera.lookAt(0, 0, 0);

        // // 改变相机观察目标点
        camera.lookAt(1000, 0, 1000);

        const renderer = new THREE.WebGLRenderer();
        renderer.setSize(width, height);
        renderer.render(scene, camera); //执行渲染操作
        document.body.appendChild(renderer.domElement);

        // 设置相机控件轨道控制器OrbitControls
        const controls = new OrbitControls(camera, renderer.domElement);
        // 相机控件.target属性在OrbitControls.js内部表示相机目标观察点,默认0,0,0
        // console.log('controls.target', controls.target);
        controls.target.set(1000, 0, 1000);
        controls.update();//update()函数内会执行camera.lookAt(controls.targe)
    </script>
</body>
<style>
    body {
        overflow: hidden;
        margin: 0px;
    }
</style>
</html>
相关推荐
崔庆才丨静觅4 小时前
hCaptcha 验证码图像识别 API 对接教程
前端
passerby60615 小时前
完成前端时间处理的另一块版图
前端·github·web components
掘了5 小时前
「2025 年终总结」在所有失去的人中,我最怀念我自己
前端·后端·年终总结
崔庆才丨静觅5 小时前
实用免费的 Short URL 短链接 API 对接说明
前端
崔庆才丨静觅6 小时前
5分钟快速搭建 AI 平台并用它赚钱!
前端
崔庆才丨静觅6 小时前
比官方便宜一半以上!Midjourney API 申请及使用
前端
Moment6 小时前
富文本编辑器在 AI 时代为什么这么受欢迎
前端·javascript·后端
崔庆才丨静觅6 小时前
刷屏全网的“nano-banana”API接入指南!0.1元/张量产高清创意图,开发者必藏
前端
剪刀石头布啊6 小时前
jwt介绍
前端
爱敲代码的小鱼7 小时前
AJAX(异步交互的技术来实现从服务端中获取数据):
前端·javascript·ajax