NullPointers - 技术教程
type: channel
link: http://a07ib.xo8.jd.sxuan.top/index.php/category/code/
description: 分享编程技术和其他技术教程
items: ThreeJS开发：从零到项目实战
items: 【笔记】Redis介绍和Java的整合
items: 关于Null Pointers Blog.

ThreeJS开发：从零到项目实战
type: item
date: 2025-05-23T09:09:00+08:00
description: 前言：ThreeJS——开启3D Web世界的钥匙 欢迎来到ThreeJS的奇妙世界！无论你是前端开发者、图形学爱好者，还是希望将3D技术融入Web应用的工程师，这本书都将带你从零开始，逐步掌握ThreeJS的核心概念，并最终实现大型数字孪生项目。让我们一起踏上这段充满挑战与乐趣的旅程吧！ 第一部分：ThreeJS基础入门 第一章：ThreeJS概述与基础概念 1.1 ThreeJS是什么？ 介绍ThreeJS的历史、用途及优势。 浏览器中的3D图形：WebGL与ThreeJS的关系。 1.2 搭建开发环境 引入ThreeJS库：CDN、本地引入。 简单的HTML模板：Canvas与JavaScript基础。 1.3 第一个ThreeJS场景 创建场景（Scene）、相机（Camera）和渲染器（Renderer）。 添加一个简单的几何体（如立方体）并渲染。 1.4 ThreeJS的基本组件 场景（Scene）：一切的开始。 相机（Camera）：透视相机与正交相机。 渲染器（Renderer）：WebGL渲染器的配置。 序言 —— 开启Three.js的3D奇幻之旅 数字世界的画笔与画布​​ 在Web技术日新月异的今天，Three.js如同一支神奇的画笔，让开发者能在浏览器的方寸之间绘制出无限延展的三维宇宙。这个由Ricardo Cabello（Mr.doob）于2010年创立的开源库，最初只是为简化WebGL的复杂性而生，如今已成长为支撑元宇宙、数字孪生、WebXR等前沿技术的核心引擎。它的魅力在于：​​用JavaScript的优雅语法，实现专业级3D图形编程​​——从旋转的立方体到浩瀚的星空，从交互式产品展示到沉浸式虚拟现实，Three.js让想象力的边界不断拓展。 为什么选择Three.js？​​ 与传统WebGL开发相比，Three.js提供了三重革命性突破： ​​开发效率的飞跃​​：原生WebGL绘制一个立方体需200+行代码，而Three.js仅需20行。这种"语法糖"式的封装，让开发者无需深究矩阵运算或着色器编译，即可快速构建场景。 ​​跨平台的兼容性​​：自动适配WebGL、Canvas和SVG渲染器，兼容从IE11到最新Chrome的浏览器生态。 ​​工业级的功能栈​​：内置物理引擎、后期处理、动画系统等50+模块，支持PBR材质、实时光影等高级特性。 正如开发者社区所言："Three.js如同3D世界的jQuery，将底层复杂性转化为直观的创造力工具"。 ​​核心哲学：抽象与自由的平衡​​ Three.js的架构设计蕴含深刻的工程智慧： ​​场景图(Scene Graph)​​：树状结构管理对象层级，父子节点自动继承变换属性，如同DOM操作般直观。 ​​模块化材质系统​​：从基础的MeshBasicMaterial到支持物理渲染的MeshStandardMaterial，开发者可像搭积木一样组合效果。 ​​声明式动画​​：通过requestAnimationFrame实现60FPS流畅动画，同时保留直接操作WebGL底层的通道。 这种"开箱即用却不失灵活"的理念，使其既能满足初学者快速上手的诉求，又能支撑《堡垒之夜》网页版等大型项目开发。 学习路径：从立方体到宇宙​​ 本书第一章将带你建立Three.js的​​核心认知框架​​： ​​场景(Scene)​​：三维世界的容器，定义坐标系与全局环境。 ​​相机(Camera)​​：透视与正交相机的选择，如同摄影师切换镜头。 ​​渲染器(Renderer)​​：WebGL的硬件加速与画布优化技巧。 正如Three.js核心贡献者AlteredQualia所说："理解这三要素，就掌握了打开3D大门的钥匙"。后续章节中，我们将逐步添加几何体、光源、控制器等模块，最终实现交互式3D应用的全流程开发。 ​​致开发者：一场始于代码的冒险​​ Three.js的社区文化充满极客精神——从GitHub上活跃的10万+开发者，到NASA将火星探测数据可视化时采用的Three.js方案。无论你是： ​​前端工程师​​：希望为产品增加3D展示维度 ​​游戏开发者​​：探索WebGL的轻量化解决方案 ​​数据科学家​​：构建动态三维可视化系统 都能在这个生态中找到属于自己的位置。现在，让我们从下一节的"Hello Cube"开始，亲手点燃这份立体创造力！ 1.1 Three.js是什么？ ——浏览器中的3D革命引擎 ​​1.1.1 历史溯源：从实验室到全球生态的进化之路​​ Three.js的诞生源于一场关于"简化"的技术革命。2010年，西班牙开发者Ricardo Cabello（网名Mr.doob）在探索WebGL时发现，尽管WebGL能实现浏览器端硬件级3D渲染，但其底层API…

【笔记】Redis介绍和Java的整合
type: item
date: 2025-03-28T15:28:00+08:00
description: redis模板的调用实例代码 package com.sky.test; import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.data.redis.connection.DataType; import org.springframework.data.redis.core.*; import javax.annotation.Resource; import java.util.List; import java.util.Set; import java.util.concurrent.TimeUnit; /** * Redis测试类 * @author 上玄 * @since 2025-03-21 */ @SpringBootTest public class SpringDataRedisTest { @Resource private RedisTemplate redisTemplate; @Test public void testRedisTemplate(){ System.out.println(redisTemplate); // 获取RedisTemplate的子类对象 ValueOperations ops = redisTemplate.opsForValue(); HashOperations hashOps = redisTemplate.opsForHash(); ListOperations listOps = redisTemplate.opsForList(); SetOperations setOps = redisTemplate.opsForSet(); ZSetOperations zSetOps = redisTemplate.opsForZSet(); } /** * 操作字符串 */ @Test public void testString(){ // set get redisTemplate.opsForValue().set("name","张三"); String name = (String) redisTemplate.opsForValue().get("name"); System.out.println(name); // setex: 设置键值对并指定过期时间 redisTemplate.opsForValue().set("city","北京",3, TimeUnit.MINUTES); // setnx: 设置键值对，如果键不存在则成功，否则失败 // 相当于：if not exists name then set name value Boolean aBoolean = redisTemplate.opsForValue().setIfAbsent("name", "李四"); System.out.println(aBoolean); } /** * 操作哈希类型 */ @Test public void testHash(){ // hset hget : 设置和获取哈希表中的字段值 HashOperations hashOperations = redisTemplate.opsForHash(); hashOperations.put("user1", "name", "张三"); hashOperations.put("user1", "age", "25"); String name = (String) hashOperations.get("user1", "name"); System.out.println(name); // hasKey: 检查哈希表中是否存在指定的字段 Boolean b = hashOperations.hasKey("user1", "age"); System.out.println(b); // hkeys命令：获取哈希表中所有的字段名 Set user1 = hashOperations.keys("user1"); System.out.println(user1); // hvals命令：获取哈希表中所有的字段值 List user11 = hashOperations.values("user1"); System.out.println(user11); // hdel : 删除哈希表中的一个或多个字段 Long delete = hashOperations.delete("user1", "a…

关于Null Pointers Blog.
type: item
date: 2025-03-28T13:58:00+08:00
description: NullPointers意为Java中的空指针