WebXR教学 03 项目1 旋转彩色方块

news/2025/2/25 7:32:16
webkit-tap-highlight-color: rgba(0, 0, 0, 0);">

在这里插入图片描述

一、项目结构

webgl-cube/
├── index.html
├── main.js
├── package.json
└── vite.config.js

二、详细实现步骤

  1. 初始化项目
npm init -y
npm install three vite --save-dev
  1. index.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>旋转彩色立方体</title>
    <style>
        body { margin: 0; overflow: hidden; }
        canvas { display: block; }
    </style>
</head>
<body>
    <script type="module" src="./main.js"></script>
</body>
</html>
  1. main.js
js">// 导入Three.js核心库
import * as THREE from 'three';

// ---------- 场景初始化 ----------
// 创建三维场景容器
const scene = new THREE.Scene();

// ---------- 相机配置 ----------
// 创建透视相机(模拟人眼视角)
const camera = new THREE.PerspectiveCamera(
    75, // 视野角度(FOV)
    window.innerWidth / window.innerHeight, // 宽高比
    0.1, // 近裁剪面(最近可见距离)
    1000  // 远裁剪面(最远可见距离)
);

// ---------- 渲染器配置 ----------
// 创建WebGL渲染器(启用抗锯齿)
const renderer = new THREE.WebGLRenderer({
    antialias: true,  // 开启抗锯齿
    alpha: true       // 开启透明背景(可选)
});
// 设置渲染器尺寸
renderer.setSize(window.innerWidth, window.innerHeight);
// 设置像素比(适配高清屏)
renderer.setPixelRatio(window.devicePixelRatio);
// 将画布添加到页面
document.body.appendChild(renderer.domElement);

// ---------- 立方体创建 ----------
// 创建立方体几何体(单位立方体)
const geometry = new THREE.BoxGeometry(1, 1, 1);

// 创建六面材质(颜色配置)
const materials = [
    new THREE.MeshBasicMaterial({ color: 0xff0000 }), // 右(+X)
    new THREE.MeshBasicMaterial({ color: 0x00ff00 }), // 左(-X)
    new THREE.MeshBasicMaterial({ color: 0x0000ff }), // 上(+Y)
    new THREE.MeshBasicMaterial({ color: 0xffff00 }), // 下(-Y)
    new THREE.MeshBasicMaterial({ color: 0xff00ff }), // 前(+Z)
    new THREE.MeshBasicMaterial({ color: 0x00ffff })  // 后(-Z)
];

// 组合几何体与材质生成网格对象
const cube = new THREE.Mesh(geometry, materials);
scene.add(cube);

// 设置相机初始位置(沿Z轴后移)
camera.position.z = 5;

// ---------- 动画循环 ----------
function animate() {
    requestAnimationFrame(animate);
    
    // 旋转动画(每秒约60帧)
    cube.rotation.x += 0.01;  // X轴旋转
    cube.rotation.y += 0.01;  // Y轴旋转
    
    // 渲染场景
    renderer.render(scene, camera);
}

// 启动动画
animate();

// ---------- 窗口响应式处理 ----------
window.addEventListener('resize', () => {
    // 更新相机参数
    camera.aspect = window.innerWidth / window.innerHeight;
    camera.updateProjectionMatrix();
    
    // 更新渲染器尺寸
    renderer.setSize(window.innerWidth, window.innerHeight);
});
  1. vite.config.js
import { defineConfig } from 'vite'

export default defineConfig({
    base: './',
    server: {
        port: 3000,
        open: true
    }
})

三、核心概念解析

js_131">Three.js三大核心要素:

Scene(场景):所有3D对象的容器

Camera(相机):观察场景的视角

Renderer(渲染器):负责将3D场景渲染到2D画布

坐标系系统:

X轴:水平方向(右正左负)

Y轴:垂直方向(上正下负)

Z轴:深度方向(屏幕外正,屏幕内负)

材质类型:

MeshBasicMaterial:基础材质(不受光照影响)

MeshPhongMaterial:光泽材质(受光照影响)

MeshStandardMaterial:PBR材质(物理渲染)

四、运行项目

npx vite

五、常见问题解决

页面空白问题:

检查控制台报错(F12打开开发者工具)

确保相机位置正确(camera.position.z = 5)

验证材质颜色值是否合法(0x开头十六进制)

性能优化建议:

// 在初始化渲染器时添加
renderer.shadowMap.enabled = true;  // 启用阴影
renderer.outputEncoding = THREE.sRGBEncoding;  // 颜色空间优化

进阶功能扩展:

// 添加轨道控制器(需额外安装)
import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls';
const controls = new OrbitControls(camera, renderer.domElement);

// 添加环境光
const ambientLight = new THREE.AmbientLight(0xffffff, 0.5);
scene.add(ambientLight);

http://www.niftyadmin.cn/n/5865176.html

相关文章

Debain12.9安装大模型微调基础环境

Debain12.9安装大模型微调基础环境 硬件信息安装基础组件安装CUDA安装NVCC 硬件信息 操作系统&#xff1a;Debain 12.9/Ubuntu 24.04 CPU&#xff1a;i7-10750H 内存&#xff1a;32G 显卡&#xff1a;GTX 1650&#xff08;4G&#xff09; 硬盘&#xff1a;SSD&#xff08;1T&a…

基于同轴聚类点云去重的铆钉高度测量

基于同轴聚类点云去重的铆钉高度测量 一、引言二、解决方案三、实验效果四、实验部分代码 一、引言 本实验起源于工业检测领域一个普遍存在的需求——精确测量铆钉相对于料盘&#xff08;即基准平面&#xff09;的高度。 需求&#xff1a;如何准确测定铆钉至料盘表面的高度&am…

C++对象模型之C++额外成本

1.介绍 C与C最大的区别&#xff0c;无疑在于面向对象&#xff0c;面向对象编程给C带来了强大的特性和灵活性。但同时也带来了一定的运行时和编译时的开销。下面介绍C对象模型的额外成本及其来源。 2.C的额外成本 &#xff08;1&#xff09;虚函数和动态多态的成本 虚函数表&am…

硬件加速与技术创新双轮驱动:DeepSeek和ChatGPT性能进阶的未来蓝图

&#x1f381;个人主页&#xff1a;我们的五年 &#x1f50d;系列专栏&#xff1a;Linux网络编程 &#x1f337;追光的人&#xff0c;终会万丈光芒 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 ​ Linux网络编程笔记&#xff1a; https://blog.cs…

UE地编材质世界对齐纹理旋转

帖子地址 https://forums.unrealengine.com/t/how-to-rotate-a-world-aligned-texture/32532/4世界对齐纹理本身不能改 自己创建了个函数 把世界对齐纹理的内容赋值粘贴 在纹理偏移里给值 不要局限0-1 给值给大一点

deepseek本地部署,ragflow,docker

先下载ollama 1.官网下载 deepseek-r1:14bhttps://ollama.com/library/deepseek-r1:14b 2.GitHub下载GitHub - ollama/ollama: Get up and running with Llama 3.3, DeepSeek-R1, Phi-4, Gemma 2, and other large language models. 两种方式 安装完后&#xff0c;cmd-&g…

服务器广播需要广播的服务器数量

服务器广播需要广播的服务器数量 真题目录: 点击去查看 E 卷 100分题型 题目描述 服务器连接方式包括直接相连,间接连接。 A和B直接连接,B和C直接连接,则A和C间接连接。 直接连接和间接连接都可以发送广播。 给出一个N*N数组,代表N个服务器, matrix[i][j] == 1, 则…

3D Web轻量化引擎HOOPS Communicator如何赋能航空航天制造?

在当今航空航天制造领域&#xff0c;精确度、效率和协作是推动行业发展的关键要素。随着数字化技术的飞速发展&#xff0c;3D Web可视化开发包HOOPS Communicator 为航空航天制造带来了革命性的变化。它凭借强大的功能和灵活的应用&#xff0c;助力企业在设计、生产、培训等各个…