web三维

news/2025/9/24 16:47:18/文章来源:https://www.cnblogs.com/xiongwei/p/19109509
import * as THREE from 'three';
// 修复:引入轨道控制器和字体加载器(关键新增)
import { OrbitControls } from 'three/addons/controls/OrbitControls.js';
import { FontLoader } from 'three/addons/loaders/FontLoader.js';// 创建场景
const scene = new THREE.Scene();
scene.background = new THREE.Color(0x87CEEB); // 天空蓝色// 创建相机
const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 2000);
camera.position.set(0, 50, 150);// 创建渲染器
const renderer = new THREE.WebGLRenderer({ antialias: true });
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);// 修复:使用导入的 OrbitControls 构造函数(移除 THREE 前缀)
const controls = new OrbitControls(camera, renderer.domElement);
controls.enableDamping = true;// 添加光源
const ambientLight = new THREE.AmbientLight(0xffffff, 0.5);
scene.add(ambientLight);const directionalLight = new THREE.DirectionalLight(0xffffff, 0.8);
directionalLight.position.set(100, 100, 50);
scene.add(directionalLight);// 创建大坝主体
function createDam() {// 大坝基础const damGeometry = new THREE.BoxGeometry(100, 20, 40);const damMaterial = new THREE.MeshStandardMaterial({color: 0x888888,roughness: 0.8,metalness: 0.2});const dam = new THREE.Mesh(damGeometry, damMaterial);dam.position.set(0, 10, 0);scene.add(dam);// 大坝正面倾斜部分const slopeGeometry = new THREE.BoxGeometry(100, 30, 20);const slope = new THREE.Mesh(slopeGeometry, damMaterial);slope.position.set(0, 25, -10);slope.rotation.x = -0.3;scene.add(slope);// 坝顶结构const topStructureGeometry = new THREE.BoxGeometry(100, 5, 10);const topStructure = new THREE.Mesh(topStructureGeometry, damMaterial);topStructure.position.set(0, 30, 20);scene.add(topStructure);// 水闸塔const towerGeometry = new THREE.BoxGeometry(6, 20, 10);const towerMaterial = new THREE.MeshStandardMaterial({ color: 0xcccccc });// 左侧水闸塔const leftTower1 = new THREE.Mesh(towerGeometry, towerMaterial);leftTower1.position.set(-30, 40, 20);scene.add(leftTower1);const leftTower2 = new THREE.Mesh(towerGeometry, towerMaterial);leftTower2.position.set(-15, 40, 20);scene.add(leftTower2);// 中间水闸塔const centerTower1 = new THREE.Mesh(towerGeometry, towerMaterial);centerTower1.position.set(-5, 45, 20);scene.add(centerTower1);const centerTower2 = new THREE.Mesh(towerGeometry, towerMaterial);centerTower2.position.set(5, 45, 20);scene.add(centerTower2);// 右侧水闸塔const rightTower1 = new THREE.Mesh(towerGeometry, towerMaterial);rightTower1.position.set(15, 40, 20);scene.add(rightTower1);const rightTower2 = new THREE.Mesh(towerGeometry, towerMaterial);rightTower2.position.set(30, 40, 20);scene.add(rightTower2);// 右侧建筑const rightBuildingGeometry = new THREE.BoxGeometry(15, 15, 10);const rightBuilding = new THREE.Mesh(rightBuildingGeometry, towerMaterial);rightBuilding.position.set(55, 35, 20);scene.add(rightBuilding);// 添加""文字// 修复:使用导入的 FontLoader 构造函数(移除 THREE 前缀)const fontLoader = new FontLoader();fontLoader.load('https://cdn.jsdelivr.net/npm/three@0.150.1/examples/fonts/helvetiker_regular.typeface.json', function (font) {const textGeometry1 = new THREE.TextGeometry('字体', {font: font,size: 8,height: 1,curveSegments: 12,bevelEnabled: false});textGeometry1.center();const textGeometry2 = new THREE.TextGeometry('字', {font: font,size: 8,height: 1,curveSegments: 12,bevelEnabled: false});textGeometry2.center();const textMaterial = new THREE.MeshStandardMaterial({ color: 0xffffff });const text1 = new THREE.Mesh(textGeometry1, textMaterial);text1.position.set(-20, 20, -9);text1.rotation.x = -0.3;scene.add(text1);const text2 = new THREE.Mesh(textGeometry2, textMaterial);text2.position.set(20, 20, -9);text2.rotation.x = -0.3;scene.add(text2);});
}// 创建山体
function createMountains() {// 左侧山体const leftMountainGeometry = new THREE.ConeGeometry(100, 80, 4);const mountainMaterial = new THREE.MeshStandardMaterial({ color: 0x228B22 });const leftMountain = new THREE.Mesh(leftMountainGeometry, mountainMaterial);leftMountain.position.set(-150, 20, -50);leftMountain.rotation.y = Math.PI / 4;scene.add(leftMountain);// 右侧山体const rightMountainGeometry = new THREE.ConeGeometry(100, 70, 4);const rightMountain = new THREE.Mesh(rightMountainGeometry, mountainMaterial);rightMountain.position.set(150, 15, -50);rightMountain.rotation.y = -Math.PI / 4;scene.add(rightMountain);// 远处山体const farMountainGeometry = new THREE.CylinderGeometry(120, 150, 50, 4);const farMountainMaterial = new THREE.MeshStandardMaterial({ color: 0x226622 });const farMountain = new THREE.Mesh(farMountainGeometry, farMountainMaterial);farMountain.position.set(0, 0, -200);scene.add(farMountain);
}// 创建水体
function createWater() {const waterGeometry = new THREE.PlaneGeometry(300, 200);const waterMaterial = new THREE.MeshStandardMaterial({color: 0x4682B4,transparent: true,opacity: 0.8,roughness: 0.3,metalness: 0.2});const water = new THREE.Mesh(waterGeometry, waterMaterial);water.rotation.x = -Math.PI / 2;water.position.set(0, 5, -100);scene.add(water);
}// 创建地面
function createGround() {const groundGeometry = new THREE.PlaneGeometry(500, 500);const groundMaterial = new THREE.MeshStandardMaterial({ color: 0x8B4513 });const ground = new THREE.Mesh(groundGeometry, groundMaterial);ground.rotation.x = -Math.PI / 2;ground.position.y = 0;scene.add(ground);
}// 初始化场景元素
createGround();
createMountains();
createDam();
createWater();// 窗口大小调整
window.addEventListener('resize', () => {camera.aspect = window.innerWidth / window.innerHeight;camera.updateProjectionMatrix();renderer.setSize(window.innerWidth, window.innerHeight);
});// 动画循环
function animate() {requestAnimationFrame(animate);controls.update();renderer.render(scene, camera);
}animate();

  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/915970.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HarmonyOS 多线程编程:Worker 使用与性能优化指南

本文将深入探讨 HarmonyOS 5.0+ 中 Worker 多线程机制的使用方法、性能优化策略和最佳实践,帮助你构建高效、流畅的应用体验。1. Worker 基础概念与核心优势 Worker 是 HarmonyOS 提供的多线程解决方案,允许在独立线…

贝叶斯定理简单解释

贝叶斯定理简单解释举例: 如下图1所示,已知小明到家时带着一只娃娃,请问他更有可能乘坐了公交还是地铁?图1 图2 …

B端界面设计的核心逻辑:效率优先还是体验优先?

B端界面设计的核心逻辑:效率优先还是体验优先?在C端应用中,用户体验往往与“好看、好用”直接挂钩。但在B端界面设计中,情况更为复杂:它需要承载海量数据、复杂业务流程和多角色协作。于是问题出现了:B端界面设计…

搭建网站有哪些表白网站怎样做有创意

p20 首先我们现在有一个多人游戏的系统类MultiplayerSessionsSubsystem 在这个系统内提供了很多会话系统的接口SessionInterface 当现在我们有一些SessionInterfaceDelegates的委托,这个委托的来源是SessionInterface,所以我们使用的委托可以接收到来自SessionInterface的消息(…

质数(埃氏筛、欧拉筛)

小赛码/数论 竞赛/数论 质数 一、质数:数字的原子原子是构成物质的基本单位质数是构建整数的基本单元示例: 60 = 2 2 3 5(仅由质数构成) 所有大于1的自然数都可分解为质数的乘积 类比说明:质数如同数学界的乐高…

HarmonyOS数据持久化:Preferences轻量级存储实战

本文将详细介绍HarmonyOS 5(API 12)中的用户首选项(Preferences)数据持久化方案,通过实际代码示例讲解如何实现轻量级键值对数据的存储、读取和管理。1. Preferences核心概念与优势 Preferences是HarmonyOS提供的…

HarmonyOS服务卡片开发:动态卡片与数据绑定实战指南

✨ 一、服务卡片概述与优势 服务卡片是HarmonyOS提供的一种轻量级UI组件,具有以下核心特性:信息前置:将应用关键信息直接展示在桌面、锁屏等位置,用户无需打开应用即可获取重要信息。 交互便捷:支持按钮点击等基础…

【CV】GAN代码解析:base_model.py

【CV】GAN代码解析:base_model.pyPosted on 2025-09-24 16:39 SaTsuki26681534 阅读(0) 评论(0) 收藏 举报import os # 标准库:操作系统相关(本文件中未直接使用) import torch # PyTorch 主库 from pathli…

有理数类的问题回答

1. 与C语言有理数代码相比,该Java类更面向对象的原因 (1)封装性:Java类将有理数的分子numerator和分母denominator设为private,仅通过public方法对外暴露功能,隐藏了内部实现细节;而C语言通常通过结构体直接暴露…

企业网站设计与实现论文移动网站系统

听说这是目录哦 FinalShell连接VMware🌤️解决重连失效FinalShell的使用 免密登录⛈️能量站😚 FinalShell连接VMware🌤️ 保持虚拟机的开机状态,打开FinalShell,如果虚拟机关机或者挂起,连接就会断开。 …

做网站时图片要切片有什么作用可以做砍价链接的网站

车牌识别系统 YOLOv5和LPRNet的车牌识别系统结合了深度学习技术的先进车牌识别解决方案。该系统整合了YOLOv5目标检测框架和LPRNet文本识别模型 1. YOLOv5目标检测框架 YOLO是一种先进的目标检测算法,以其实时性能和高精度闻名。YOLOv5是在前几代基础上进行优化的…

南昌网站建设规划方案传媒公司网站源码php

引人入胜的开篇:想要搞清楚LSTM中的每个公式的每个细节为什么是这样子设计吗?想知道simple RNN是如何一步步的走向了LSTM吗?觉得LSTM的工作机制看不透?恭喜你打开了正确的文章! 前方核弹级高能预警!本文信息…

微信版网站开发用安卓做网站

幸福树,一种寓意美好的观赏型植物,它生长非常迅速,稍不注意就长的非常茂盛。而要想保证幸福树的美貌,跟人的头发一样,我们要给它适当的修剪,那幸福树怎么修剪呢?为了大家能养出美丽的幸福树来&a…

HarmonyOS后台任务调度:JobScheduler与WorkManager实战指南

本文将深入探讨HarmonyOS 5(API 12)中的后台任务调度机制,重点讲解JobScheduler和WorkManager的使用方法、适用场景及最佳实践,帮助开发者实现高效、智能的后台任务管理。1. 后台任务调度概述 HarmonyOS提供了两种…

总线传输的四个阶段

1.申请分配阶段 由需要使用总线的主模块或主设备提出申请,经过总线仲裁机构决定下一个传输周期的总线使用权。也可将此阶段细分为传输请求和总线仲裁两个阶段 2.寻址阶段 获得使用权的主模块,通过总线发出本次要访问…

学校站群框架如何开发插件实现Word图片的批量上传与编辑?

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

化妆品公司网站源码wordpress ip锁定插件

在React的类组件中,从组件创建到组件被挂载到页面中,这个过程react存在一系列的生命周期函数,最主要的生命周期函数是componentDidMount、componentDidUpdate、componentWillUnmount 生命周期图例如下 1. componentDidMount组件挂载 如果你…

怎样改网站英文域名保定定兴网站建设

来源:新战略机器人为什么需要协作机器人?协作机器人的兴起意味着传统机器人必然有某种程度的不足,或者无法适应新的市场需求。总结一下,主要有几点:传统机器人部署成本高其实相对来讲,工业机器人本身的价格…

广西工程造价信息网佛山seo优化排名推广

1、先登录服务器创建新目录aaa 2、云盘都快照备份下。后续操作完核实无误了,您根据您需求删除快照就行, 然后登录服务器内执行: fdisk -l sblk blkid ll /aaa 3、执行:(以下命令是进行数据盘做ext4文件系统并挂载…

HarmonyOS事件订阅与通知:后台事件处理

本文将深入探讨HarmonyOS 5(API 12)中的事件订阅与通知机制,重点讲解如何在后台处理事件,实现应用的实时响应和跨设备协同。内容涵盖核心API、实现步骤、实战示例及性能优化建议。1. 事件订阅与通知机制概述 Harmo…