当前位置: 首页 > article >正文

Three.js搭建小米SU7三维汽车实战(4)场景搭建

场地搭建

```javascript // 导入threejs import * as THREE from "three"; // 导入轨道控制器 import { OrbitControls } from "three/addons/controls/OrbitControls.js";

// 1. 创建场景
const scene = new THREE.Scene();
// 2. 创建相机
const camera = new THREE.PerspectiveCamera(
45,
window.innerWidth / window.innerHeight,
1,
1000
);

camera.position.z = 50;

// 5. 创建立方体(几何+材质)
const cubeGeometry = new THREE.BoxGeometry(1, 1, 1);
const cubeMaterial = new THREE.MeshNormalMaterial();
const cube = new THREE.Mesh(cubeGeometry, cubeMaterial);
// 添加到场景
scene.add(cube);

// 6. 显示坐标轴(x轴: 红色; y轴: 绿色; z轴: 蓝色 rgb)
// x轴水平方向(右正); y轴垂直方向(上正); z轴垂直xy平面即屏幕(外正)
const axesHelper = new THREE.AxesHelper(10);
scene.add(axesHelper);

// 3. 创建渲染器
const renderer = new THREE.WebGLRenderer({ antialias: true });
renderer.setPixelRatio(window.devicePixelRatio);
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);

// 7. 创建轨道控制器
const controls = new OrbitControls(camera, renderer.domElement);

// 4. 动态渲染
function animation() {
controls.update();
renderer.render(scene, camera);

requestAnimationFrame(animation);
}
animation();
// 监听window的resize事件, 在回调中重绘canvas
window.addEventListener(“resize”, () => {
// 设置相机宽高比
camera.aspect = window.innerWidth / window.innerHeight;
camera.updateProjectionMatrix();

// 设置渲染器
renderer.setSize(window.innerWidth, window.innerHeight);
});


![](https://cdn.nlark.com/yuque/0/2025/png/8435413/1746754347219-0af5675d-ed2e-4896-85f1-f9dbe2683e48.png?x-oss-process=image%2Fformat%2Cwebp)<h1 id="Tnwb7"><font style="color:rgb(38, 38, 38);">汽车模型获取</font></h1>
[SU7 - Download Free 3D model by s1657270997](https://sketchfab.com/3d-models/su7-7296a91633d74c6eb113010e2ed75eda)<h1 id="B3RKC"><font style="color:rgb(38, 38, 38);">设置展厅</font></h1>
<h2 id="uzbYV"><font style="color:rgb(38, 38, 38);">添加地板</font></h2>
<font style="color:rgb(38, 38, 38);">我们可以将立方体删掉,换成一个圆形的面,这个面就是我们的展厅地板</font>```javascript
const geom = new THREE.CircleGeometry(20, 29);
const material = new THREE.MeshBasicMaterial({color:new THREE.Color(0xffffff)
});
const mesh = new THREE.Mesh(geom, material);
scene.add(mesh)

现在我们发现这个面是立着的,我们需要给它旋转一下

mesh.rotation.x -= (90 * Math.PI) / 180;

修改一下材质为双面渲染

const material = new THREE.MeshBasicMaterial({color:new THREE.Color(0xffffff),side:THREE.DoubleSide
});

设置背景

我们将当前的背景修改一下,懂车帝使用的是一个渐变图作为背景,我们将其拿过来用一下
<?xml version="1.0" encoding="UTF-8"?>
<svg width="1920px" height="500px" viewBox="0 0 1418 344" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><title>bg新</title><defs><radialGradient cx="50%" cy="0%" fx="50%" fy="0%" r="100%" gradientTransform="translate(0.500000,0.000000),scale(0.224457,1.000000),rotate(90.000000),scale(1.000000,3.681004),translate(-0.500000,-0.000000)" id="radialGradient-1"><stop stop-color="#B4B9C5" offset="0%"></stop><stop stop-color="#F7F8FC" offset="100%"></stop></radialGradient><rect id="path-2" x="0" y="0" width="1388" height="311.545631"></rect><linearGradient x1="44.08867%" y1="43.6422414%" x2="100%" y2="43.6422414%" id="linearGradient-4"><stop stop-color="#F7F8FC" offset="0%"></stop><stop stop-color="#F2F4FA" stop-opacity="0" offset="100%"></stop></linearGradient><rect id="path-5" x="0" y="0" width="1388" height="311.545631"></rect><linearGradient x1="44.08867%" y1="43.6422414%" x2="100%" y2="43.6422414%" id="linearGradient-7"><stop stop-color="#F2F4FA" stop-opacity="0" offset="0%"></stop><stop stop-color="#F7F8FC" offset="100%"></stop></linearGradient><radialGradient cx="50%" cy="0%" fx="50%" fy="0%" r="100%" gradientTransform="translate(0.500000,0.000000),scale(0.024115,1.000000),rotate(90.000000),scale(1.000000,27.956600),translate(-0.500000,-0.000000)" id="radialGradient-8"><stop stop-color="#B8BDC9" offset="0%"></stop><stop stop-color="#F7F8FC" offset="100%"></stop></radialGradient><filter x="-1.1%" y="-44.8%" width="102.2%" height="189.6%" filterUnits="objectBoundingBox" id="filter-9"><feGaussianBlur stdDeviation="5" in="SourceGraphic"></feGaussianBlur></filter></defs><g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"><g id="bg新" transform="translate(15.000000, 0.000000)"><g id="椭圆形-+-椭圆形-蒙版"><g id="蒙版" transform="translate(694.000000, 155.772816) scale(-1, 1) rotate(-180.000000) translate(-694.000000, -155.772816) translate(0.000000, 0.000001)" fill="url(#radialGradient-1)" fill-rule="nonzero"><rect id="path-2" x="0" y="0" width="1388" height="311.545631"></rect></g><g id="椭圆形-Clipped"><mask id="mask-3" fill="white"><use xlink:href="#path-2"></use></mask><g id="path-2"></g><ellipse id="椭圆形" fill="url(#linearGradient-4)" fill-rule="nonzero" mask="url(#mask-3)" cx="-7.73019802" cy="241.168932" rx="234.482673" ry="234.302913"></ellipse></g><g id="椭圆形-Clipped"><mask id="mask-6" fill="white"><use xlink:href="#path-5"></use></mask><g id="path-2"></g><ellipse id="椭圆形" fill="url(#linearGradient-7)" fill-rule="nonzero" mask="url(#mask-6)" cx="1177.56683" cy="241.168932" rx="234.482673" ry="234.302913"></ellipse></g></g><path d="M694,328.71068 C1077.28562,328.71068 1388,321.217752 1388,311.974757 C1388,302.731763 1077.28562,295.238835 694,295.238835 C310.714384,295.238835 0,302.731763 0,311.974757 C0,321.217752 310.714384,328.71068 694,328.71068 Z" id="椭圆形" fill="url(#radialGradient-8)" fill-rule="nonzero" opacity="0.960278888" filter="url(#filter-9)"></path></g></g>
</svg>

threejs中加载材质使用的是TextureLoader,加载之后还可以设置一下背景的平铺方式,避免背景重复平铺或者拉伸

const backgoundTexture = new THREE.TextureLoader().load("/src/assets/images/background.svg"
);
backgoundTexture.wrapS = backgoundTexture.wrapT = THREE.RepeatWrapping;
backgoundTexture.repeat.set(1, 1);

得到材质数据之后,将其赋予场景的背景

这样场景就搭建好了

相关文章:

Three.js搭建小米SU7三维汽车实战(4)场景搭建

场地搭建 javascript // 导入threejs import * as THREE from "three"; // 导入轨道控制器 import { OrbitControls } from "three/addons/controls/OrbitControls.js"; // 1. 创建场景 const scene new THREE.Scene(); // 2. 创建相机 const camera ne…...

redis五种数据结构底层实现

参考文档&#xff1a; redis5种数据结构底层实现...

Excel 统计某个字符串在指定区域出现的次数

【本文概要】 Excel 统计某个字符串在指定区域出现的次数&#xff1a; 1、Excel 统计一个单元格内的某字符串的出现次数 2、Excel 统计某一列所有单元格内的某字符串的出现次数 3、Excel 统计某一区域所有单元格内的某字符串的出现次数 1、Excel 统计一个单元格内的某字符串的出…...

【Kubernetes】ubuntu20.04通过kubeadm + Docker安装k8s

Kubernetes v1.24集群安装配置步骤总结 一、环境准备 &#xff08;一&#xff09;系统要求 运行兼容deb/rpm的Linux操作系统&#xff08;如Ubuntu或CentOS&#xff09;的计算机&#xff0c;1台或多台。每台机器内存2GB以上&#xff0c;内存不足会限制应用运行。控制平面节点…...

前端开源JavaScrip库

以下内容仍在持续完善中&#xff0c;如有遗漏或需要补充之处&#xff0c;欢迎在评论区指出。感谢支持&#xff0c;如果觉得有帮助&#xff0c;欢迎点赞鼓励。感谢支持 JavaScript 框架Vue.jsVue.js - 渐进式 JavaScript 框架 | Vue.jsReactReactAngularHome • AngularjQueryj…...

【Linux我做主】进度条小程序深度解析

Linux下C语言进度条程序深度解析 进度条小程序GitHub地址 前言前置知识回车换行&#xff08;CR/LF&#xff09;的深度解析历史渊源与技术规范在进度条/倒计时中的应用 缓冲区机制的全面剖析缓冲区引入缓冲类型对比进度条开发中的关键控制 进度条实现以小见大——倒计时倒计时最…...

MySQL 使用全局锁会导致的问题?

MySQL 使用全局锁会导致以下核心问题&#xff1a; ‌业务停摆与主从延迟‌ ‌主库备份‌&#xff1a;备份期间所有更新操作被阻塞&#xff0c;业务系统陷入等待状态‌从库备份‌&#xff1a;无法执行主库同步的 binlog&#xff0c;导致主从复制延迟加剧 ‌并发性能急剧下降‌ …...

从Homebrew找到openssl.cnf文件并拷贝到Go项目下使用

安装OpenSSL 在 macOS 上下载和安装 OpenSSL 最常见和推荐的方式是使用 Homebrew&#xff0c;这是一个 macOS 缺失的包管理器。 如果您还没有安装 Homebrew&#xff0c;请先安装它。安装 Homebrew 后&#xff0c;安装 OpenSSL 只需要一条命令。 步骤 1&#xff1a;安装 Home…...

在Java对象转JSON字符串时不显示无值参数

在Java中&#xff0c;可以通过在展示数据的逻辑中添加判断条件来实现这一需求。以下是一些常见的场景和实现方法&#xff1a; 场景一&#xff1a;在Java对象转JSON字符串时 使用Gson库 代码实现 首先引入Gson依赖&#xff0c;如果使用Maven构建项目&#xff0c;在pom.xml文件中…...

在 Ubuntu 服务器上 下载 Clash 文件使用代理

文件Clash.Verge_1.3.8_x64_portable.zip 在 Ubuntu 服务器上不能使用这个Clash 文件**&#xff0c;我们需要的是 Clash.Meta 而不是 Clash Verge GUI 客户端 也就是 Clash Verge GUI 客户端的 Windows 版本&#xff0c;是给 Windows 桌面环境用的图形界面&#xff0c;不适用…...

微信小程序一次性订阅封装

封装代码如下&#xff1a; export async function subscribeMessage(tmplIds: string[]): Promise<ISubscribeMessagePromise> {// 模板ID// 1、获取设置状态const settings (await wx.getSetting({ withSubscriptions: true })).subscriptionsSetting || {}console.log…...

Spring AI MCP的几个小问题

测试时间&#xff1a;2025/05/29 测试版本&#xff1a;Spring AI 1.0.0 问题1&#xff1a;由于启动顺序问题&#xff0c;MCP的服务器端和客户端不能在一个应用里&#xff0c;不然客户端连不上服务器会报错退出。(实际项目应该没有这样用的) 问题2&#xff1a;现在如果配置了…...

安全帽检测算法AI智能分析网关V4守护工地/矿山/工厂等多场景作业安全

一、方案概述​ 在工业生产与建筑施工场景中&#xff0c;安全帽是保障人员安全的重要装备。但传统人工巡检效率低、易疏漏&#xff0c;难以满足现代安全管理需求。AI智能分析网关V4安全帽检测方案&#xff0c;借助人工智能与计算机视觉技术&#xff0c;实现作业现场安全帽佩戴…...

Pycharm的简单介绍

目录 1. 起源与发展历史 2. 定位与核心作用 3. 主要版本 4. 应用场景 5. 核心功能与优势 6. 优缺点分析 7. 使用入门指南 8. 适用人群 9. 替代工具对比 总结 1. 起源与发展历史 公司背景&#xff1a;由捷克公司 JetBrains&#xff08;成立于2000年&#xff09;开发&a…...

重新安装解决mac vscode点击不能跳转问题

依次执行以下过程 删除vscode程序 删除vscode的缓存文件夹(xxx表示你的用户名) /Users/xxx/Library/Application Support/Code 重新安装vscode 这时候你会反向可以跳转项目内的import 文件以及自定义函数。但是import安装的包还不能点击跳转 配置python环境 如果你电脑没有安…...

Go语言中flag包的用法详解

在Go语言编程中&#xff0c;flag包是标准库中用于解析命令行参数的强大工具。它提供了一种简单且灵活的方式来定义和处理命令行标志&#xff08;flag&#xff09;&#xff0c;使得程序能够从命令行接收用户输入的参数。本文将详细介绍flag包的用法&#xff0c;包括基本概念、常…...

Python自动化之selenium语句——打开、关闭浏览器和网页

目录 一、打开谷歌浏览器 1.双击桌面的Pycharm工具 2.新建Python文件&#xff0c;输入文件名 3.新建的Python文件如下 4.安装selenium库 5.导入包 二、打开网页、关闭网页、关闭浏览器 1.导入增加一个时间包 2.使用函数打包之前写的浏览器的配置 3.调用 4.打开百度网…...

【数据结构】--二叉树--堆(上)

一、树的概念和结构 概念&#xff1a; 树是一种非线性的数据结构&#xff0c;他是由n(n>0)个有限结点组成一个具有层次关系的集合。其叫做树&#xff0c;是因为他倒过来看就和一棵树差不多&#xff0c;其实际上是根在上&#xff0c;树枝在下的。 树的特点&#xff1a; 1…...

Rust 学习笔记:使用迭代器改进 minigrep

Rust 学习笔记&#xff1a;使用迭代器改进 minigrep Rust 学习笔记&#xff1a;使用迭代器改进 minigrep不使用 clone&#xff0c;而使用迭代器使用迭代器适配器使代码更清晰在循环或迭代器之间进行选择 Rust 学习笔记&#xff1a;使用迭代器改进 minigrep 前情提要&#xff1…...

多线程(5)——单例模式,阻塞队列

目录 单例模式饿汉模式懒汉模式—单线程版懒汉模式—多线程版&#xff08;经典面试题&#xff09;懒汉模式—多线程版&#xff08;改进&#xff09; 阻塞队列阻塞队列是什么生产者消费者模型标准库中的阻塞队列-BlockingQueue阻塞队列实现 单例模式 单例模式是一种设计模式&am…...

React整合【ECharts】教程004:饼图的构建和基本设置

文章目录 6、饼图6.1 开启圆角环形6.2 设置扇区间隙6.3 开启深色模式6.4 开启南丁格尔玫瑰图6.5 修改数据重绘饼图6.6 完整代码下载6、饼图 6.1 开启圆角环形 1️⃣添加圆角环形开关: <div style={{marginTop:10px}}>圆角环形:<Switch checkedChildren="开启…...

视频监控汇聚平台EasyCVR工业与安全监控:防爆摄像机的安全应用与注意事项

石油、化工、煤矿等行业存在易燃易爆气体、粉尘&#xff0c;普通监控设备易因电火花、高温引发爆炸火灾。随着工业规模扩大&#xff0c;安全生产监控需求激增&#xff0c;防爆摄像机成为保障安全的关键。加之国家法规与行业标准对危险环境监控设备要求严格&#xff0c;规范其应…...

Android 倒计时总结

文章目录 Android 倒计时总结Handler方案CountDownTimer方案Timer方案Flow方案总结源码下载 Android 倒计时总结 Handler方案 class MyHandler(private val intervalTime: Long, // 间隔private val totalTime: Long, // 总时长onTick: (Long) -> Unit, // 每秒回调onFini…...

基于 Redis 实现分布式锁:原理及注意事项

文章目录 基于 Redis 实现分布式锁&#xff1a;原理及注意事项基于 Redis 实现分布式锁的原理Redis 分布式锁的过期时间和锁续期机制如何防止锁被其他 goroutine 删除&#xff1f;Redis 分布式锁存在的单点故障问题&#xff1a;基于 RedLock 的解决方案高并发场景中 Redis 分布…...

手机设备多?怎样设置IP保证不关联

在移动互联网时代&#xff0c;多设备运营&#xff08;如电商、游戏工作室、社交媒体矩阵&#xff09;常面临IP关联风险&#xff0c;轻则账号受限&#xff0c;重则封禁。以下提供6种高效设置独立IP的方法&#xff0c;结合技术原理与实操建议&#xff0c;助您打造稳定合规的运营环…...

Linux 中常见的安全与权限机制

Linux 中常见的安全与权限机制主要包括以下几类&#xff0c;从文件系统权限到系统级访问控制&#xff0c;构建了多层次的安全保障体系。 &#x1f510; 一、文件权限与用户管理 1. 基本权限&#xff08;rwx&#xff09; r&#xff08;read&#xff09;&#xff1a;读取文件内…...

Golang|单例模式

单例模式定义&#xff1a;在程序运行期间&#xff0c;某个结构体只创建一个实例。适用场景&#xff1a;如数据库连接池&#xff0c;在整个程序运行期间只需要一个连接池实例。 方案一&#xff1a;通过加锁的方式&#xff0c;如读写锁&#xff0c;确保在并发情况下只创建一个实…...

哈尔滨工业大学计算机系统大作业程序人生-Hello’s P2P

摘 要 文章以C语言程序设计经典案例hello.c为研究对象&#xff0c;系统解析程序在计算机系统中的完整生命周期。剖析源代码通过预处理、编译、汇编、链接四阶段演化为可执行目标程序的编译系统工作机制&#xff0c;继而从进程视角揭示程序运行时计算机体系结构的协同运作&…...

小程序定制开发:从需求到落地,打造企业专属数字化入口

在移动互联网时代&#xff0c;小程序已成为企业连接用户的核心载体。定制开发因能深度匹配企业需求&#xff0c;正成为各行业数字化转型的优选方案。以下从优势、流程、技术、案例四方面展开&#xff0c;助你快速掌握关键要点。 一、定制开发的核心优势 1. 高度个性化&#x…...

【C/C++】基于 Docker 容器运行的 Kafka + C++ 练手项目

文章目录 基于 Docker 容器运行的 Kafka C 练手项目1 项目目的2 项目框架3 代码4 编译运行5 功能与接口说明5.1 Producer 接口&#xff1a;producer.cpp关键调用流程参数说明 5.2 Consumer 接口&#xff1a;consumer.cpp关键调用流程消费流程中注意 5.3 工程技术点 基于 Docke…...