<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>3d on Feynman 的博客</title><link>/tags/3d/</link><description>Recent content in 3d on Feynman 的博客</description><generator>Hugo</generator><language>zh-CN</language><lastBuildDate>Tue, 07 Jul 2026 10:00:00 +0800</lastBuildDate><atom:link href="/tags/3d/index.xml" rel="self" type="application/rss+xml"/><item><title>Three.js 入门：从零搭建 3D 项目架构</title><link>/posts/threejs-project-architecture/</link><pubDate>Tue, 07 Jul 2026 10:00:00 +0800</pubDate><guid>/posts/threejs-project-architecture/</guid><description>&lt;blockquote class="blockquote-regular"&gt;
 &lt;p&gt;Three.js 的一切始于三个对象：Scene（舞台）、Camera（镜头）、Renderer（投影仪）。掌握这三件套，就掌握了 3D 世界的入场券。&lt;/p&gt;

&lt;/blockquote&gt;
&lt;h2 id="01-学习目标"&gt;01 学习目标&lt;/h2&gt;
&lt;p&gt;本节课从零搭建一个完整的 Three.js 项目，目标是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;搭建 Vite + TypeScript + Three.js 项目脚手架&lt;/li&gt;
&lt;li&gt;理解 Scene / Camera / Renderer 三件套的职责&lt;/li&gt;
&lt;li&gt;掌握 requestAnimationFrame + delta time 动画循环&lt;/li&gt;
&lt;li&gt;学会窗口自适应和像素比设置&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="02-threejs-三件套"&gt;02 Three.js 三件套&lt;/h2&gt;
&lt;p&gt;Three.js 的一切始于三个对象：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;对象&lt;/th&gt;
					&lt;th&gt;类比&lt;/th&gt;
					&lt;th&gt;职责&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Scene&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;舞台&lt;/td&gt;
					&lt;td&gt;放置所有物体、灯光、相机的容器&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Camera&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;摄像机&lt;/td&gt;
					&lt;td&gt;决定观众看到什么（位置、角度、范围）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Renderer&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;投影仪&lt;/td&gt;
					&lt;td&gt;把 3D 场景计算成 2D 像素画到 canvas 上&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-typescript" data-lang="typescript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;scene&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;THREE&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Scene&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;camera&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;THREE&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;PerspectiveCamera&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;75&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;width&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;height&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;renderer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;THREE&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;WebGLRenderer&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;canvas&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="03-动画循环--delta-time"&gt;03 动画循环 + Delta Time&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;为什么需要 delta time？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;不同设备帧率不同（60fps vs 144fps）。如果直接写 &lt;code&gt;rotation += 0.01&lt;/code&gt;，144fps 的设备转速是 60fps 的 2.4 倍。&lt;/p&gt;</description></item></channel></rss>