☰
图形学新手必用:Games101虚拟机环境一键配置指南
2026/11/4 2:46:53 网站建设 项目流程

简介:本资源是GAMES101《计算机图形学与混合现实研讨会》课程2020年春季学期的首项实践任务——作业0「虚拟机的使用」配套指南PDF,面向刚接触图形学开发的初学者,解决环境配置复杂、开发平台不统一等入门痛点。文档系统讲解了基于Ubuntu 18.04的VirtualBox虚拟机全流程搭建:从Windows/macOS/Linux多平台VirtualBox安装、清华云盘虚拟硬盘(.vdi)下载解压、虚拟机新建与内存配置,到Guest Additions增强功能安装(含GUI与终端双路径)、VS Code代码编辑环境启用及拖放功能开启,还包含C++基础语法速查、Eigen线性代数库提示与常见编译/运行错误(如Segmentation Fault、undefined reference)排错指南。资源为单个874KB PDF文件,内容结构清晰,含操作截图指引与命令行实录,已获437人学习下载,是快速构建标准化图形学实验环境的权威入门手册。

1. 这不是装系统,是“图形学新手的保险箱”:用虚拟机一键获得全班统一、开箱即用的编程环境

你有没有试过:下载一个教程,说“只要三步就能跑通”,结果卡在第一步——“请先安装 C++ 编译器、Eigen 库、CMake、OpenGL 开发包……”?点开一个链接,跳转到另一个页面,再下一个页面提示“你的 GCC 版本太低”,查半天发现要升级系统自带的工具链,一不小心把电脑里其他项目搞崩了……这种“配置地狱”,是图形学新手最常翻车的第一道坎。
Games101-作业0pdf 干了一件特别实在的事:它不让你从零搭环境,而是直接给你一个“封印好的魔法盒子”——一个预装好所有工具的 Ubuntu 虚拟机。你不需要懂 Linux 命令、不用怕装错版本、不会污染本机系统。打开它,密码一输,VS Code 已就位,Eigen 库已激活,CMake 已就绪,连三角函数用弧度还是角度都帮你标好了注释。它解决的不是“怎么画出炫酷光影”,而是“怎么让第一行cout << "Hello Graphics!"不报错”。适合谁?适合所有刚听说“图形学要学线性代数”就头皮发紧、看到#include <eigen3/Eigen/Core>就想关网页的同学。这不是作业,是入场券——一张让你跳过玄学配置、直奔代码逻辑的通行证。

2. 先别急着写代码:为什么必须用这个虚拟机,而不是你本机的 VS Code?

2.1 图形学新手的“环境一致性”到底有多重要?

想象一下:全班 200 人写同一份作业,有人用 macOS 的 Clang,有人用 Windows 的 MSVC,有人用 Ubuntu 自带的 GCC 7.5,还有人手贱升级到了 GCC 12。结果呢?同一段Eigen::Matrix4f m; m << 1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1;在 A 同学电脑上编译通过,在 B 同学电脑上报错invalid initialization of non-const reference。这不是代码错了,是编译器对模板推导的宽容度不同。更别说 Eigen 库路径、CMake 版本、甚至终端默认编码这些“看不见的墙”。Games101-作业0pdf 的虚拟机,本质是一个“时间胶囊”:它固化了 Ubuntu 18.04.2 + GCC 7.5 + Eigen 3.3.7 + CMake 3.10.2 的黄金组合。所有人面对的是同一套规则,老师批改时看的不是“你能不能配出来”,而是“你能不能想明白”。这省下的不是几个小时,是避免你在第 3 天就因环境问题怀疑自己不适合学图形学的全部心力。

2.2 为什么选 VirtualBox,而不是 Docker 或 WSL?

你可能听过 Docker——轻量、快;也用过 WSL——和 Windows 融合好。但对零基础新手,它们恰恰是“温柔的陷阱”。Docker 需要你写 Dockerfile、理解镜像分层、挂载目录权限,一个Permission denied就能卡住半天;WSL 虽然原生,但图形界面(比如后续作业要跑的 OpenGL 窗口)支持不稳定,且 Eigen 的某些 SIMD 指令在 WSL 上可能触发未定义行为。VirtualBox 是“笨办法里的聪明选择”:它模拟出一台完整电脑,Ubuntu 系统、桌面环境、显卡驱动(通过 Guest Additions)全都有。你拖一个.cpp文件进去,双击就能用 VS Code 打开;你敲./Transformation,窗口就弹出来。没有“理论上应该可以”,只有“点一下就成”。这不是技术最优解,而是新手体验最优解——它把“能不能运行”这个不确定性,降到了零。

2.3 虚拟硬盘(.vdi)文件:你拿到的不是代码,是一台“已调校好的工作站”

很多人第一次看到GAMES101_Ubuntu 18.04.2 (64bit).vdi这个文件名会懵:这不就是个压缩包解压出来的文件吗?它和普通.zip有啥区别?关键就在这儿:.vdi是 VirtualBox 专用的“虚拟硬盘镜像”。你可以把它理解成一块 U 盘的“数字克隆”——里面不仅存着 Ubuntu 系统文件,还刻着所有软件的安装记录、环境变量设置、甚至 VS Code 的插件配置。你不需要apt install g++ cmake eigen3-dev,因为这些命令早在镜像制作时就被执行过上千次,确保每个依赖的版本、路径、权限都严丝合缝。下载它,等于把某导师在实验室里调试了三天、确认无误的整台开发机,完整打包送到了你面前。密码Ilovegraphics不是随便起的,它暗示着一件事:这个环境,从诞生起就只为图形学而生。

2.4 Guest Additions:那个让你“感觉不到在虚拟机里”的隐形 glue

装完虚拟机,你可能会觉得:“咦?鼠标进不去虚拟机,或者进去了出不来?”“拖文件到桌面没反应?”——这就是 Guest Additions 还没装。它不是可有可无的“美化插件”,而是 VirtualBox 和 Ubuntu 之间的“翻译官”。没有它,虚拟机就像一个被玻璃罩住的鱼缸:你能看见里面的世界,但无法自然交互。装了它,三件事立刻变丝滑:

  • 无缝模式:Ubuntu 窗口能像普通程序一样缩放、贴边,和你本机的 Chrome、微信并排显示;
  • 共享剪贴板:主机 Ctrl+C,虚拟机里 Ctrl+V 就能粘贴;
  • 拖放功能:这才是作业0的核心便利——你本机下载好的main.cpp,直接拖进虚拟机桌面,松手就完成传输,比微信传文件还快。
    它为什么重要?因为后续所有作业,你都要在主机写文档、查资料、下载资源,再把代码“喂”给虚拟机。Guest Additions 把这个过程从“搬运工”变成了“快递员”,省下的每一秒,都在降低放弃的阈值。

提示:Guest Additions 安装失败是新手最高频问题。如果菜单栏“设备 → 安装增强功能”没反应,别硬等,立刻切到终端(Ctrl+Alt+T),按文档里那四行命令手动装。这是血泪经验——我第一次学的时候,就在这个环节卡了两小时,反复重启,最后发现只是忘了sudo。

3. 手把手:从下载到跑出第一个Hello Graphics!,五步闭环实操

3.1 第一步:下载并安装 VirtualBox(5 分钟,只做这一件事)

别跳过!哪怕你电脑里有旧版 VirtualBox,也请卸载重装。原因:作业0指定的是 6.1.4 版本,新旧版本的.vdi兼容性可能出问题。

  • Windows 用户:点击这个链接 → https://download.virtualbox.org/virtualbox/6.1.4/VirtualBox-6.1.4-136177-Win.exe ,下载后双击,一路“下一步”,勾选“添加快捷方式”和“注册为 USB 设备控制器”(后面要用)。
  • macOS 用户:点击这个链接 → https://download.virtualbox.org/virtualbox/6.1.4/VirtualBox-6.1.4-136177-OSX.dmg ,下载后打开.dmg,把 VirtualBox 图标拖到“应用程序”文件夹。
  • Linux 用户:打开终端,输入sudo apt update && sudo apt install virtualbox-6.1(Ubuntu/Debian)或sudo dnf install VirtualBox-6.1(Fedora),然后输入virtualbox命令验证是否启动成功。

注意:安装过程不要关闭杀毒软件弹窗,但装完后记得把它加白名单,否则可能拦截 Guest Additions 安装。

3.2 第二步:下载并解压虚拟硬盘(.vdi)文件(3 分钟,重点核对密码)

  • 打开这个地址 → https://cloud.tsinghua.edu.cn/f/103133da1bf8451b8ba6
  • 页面会提示输入提取码,务必输入games101(全小写,无空格)。输错一次,链接可能失效,得重新找。
  • 下载完成后,得到一个GAMES101_Ubuntu 18.04.2(64bit).rar文件。用 WinRAR / 7-Zip(Windows)或 The Unarchiver(Mac)解压。解压后,你会看到一个同名的.vdi文件,大小约 3.2GB。把它放在一个好找的文件夹里,比如D:\Games101\vm\或~/Downloads/Games101/。

提示:.rar是老式压缩格式,如果你的系统默认打不开,请去官网下载 7-Zip(免费开源),别用那些带广告的“解压神器”。

3.3 第三步:在 VirtualBox 中创建并启动虚拟机(7 分钟,内存别设太高)

  • 双击打开 VirtualBox,点击左上角“新建”。
  • “名称”填GAMES101,“类型”选Linux,“版本”选Ubuntu (64-bit),点“下一步”。
  • 内存大小:建议 2048MB(2GB)。别贪多!你本机有 16GB 内存,设 4GB 给虚拟机,宿主机就只剩 12GB,Chrome 一开 10 个标签页,虚拟机就卡成 PPT。2GB 是 Ubuntu 桌面+VS Code+编译器的黄金平衡点。
  • “硬盘”选“现在创建虚拟硬盘”,点“创建”。
  • “文件类型”保持VDI,“存储在物理硬盘上”选“动态分配”,点“下一步”。
  • “文件位置和大小”:位置选你刚才放.vdi的文件夹,关键来了——取消勾选“固定大小”!然后点“创建”。
  • 创建完成后,回到 VirtualBox 主界面,右键你新建的GAMES101虚拟机 → 设置 → 存储 → 控制器: SATA → 点右侧“添加硬盘”图标 → 选择“现有硬盘” → 找到你解压出来的.vdi文件 → 点“选择”。这一步是核心:你不是在创建新硬盘,而是在“挂载”已有的、预装好的硬盘。
  • 点“确定”,选中GAMES101,点上方绿色“启动”按钮。
  • 等待几秒,出现 Ubuntu 登录界面,用户名是ubuntu,密码是Ilovegraphics(注意 I 是大写,g 是小写,无空格)。输完回车,进桌面。

3.4 第四步:安装 Guest Additions(5 分钟,失败就切终端)

  • 启动后,顶部菜单栏点“设备 → 安装增强功能…”。如果弹出“无法挂载光盘镜像”,别慌,这是正常现象。
  • 按Ctrl+Alt+T打开终端,逐行输入以下命令(复制粘贴,别手敲):
sudo mkdir -p /media/cdrom sudo mount -t auto /dev/sr0 /media/cdrom cd /media/cdrom sudo sh VBoxLinuxAdditions.run
  • 每行回车后,看最后一行是否出现Installing the Window System drivers ... succeeded。如果出现,说明成功。
  • 重启虚拟机:点击右上角齿轮图标 → “Power Off”,再点“启动”按钮。
  • 重启后,测试效果:把鼠标移到虚拟机窗口边缘,看是否自动捕获;尝试在主机复制一段文字,到虚拟机里Ctrl+V粘贴;最后,拖一个文本文件到虚拟机桌面,看是否能松手即落。三者全通,Guest Additions 成功。

3.5 第五步:导入作业框架,编译并运行第一个程序(8 分钟,从零到输出)

  • 在你本机(不是虚拟机!)新建一个文件夹,比如D:\Games101\hw0\,在里面新建一个纯文本文件,命名为main.cpp。用记事本或 VS Code 打开它,粘贴以下代码:
#include <iostream> #include <eigen3/Eigen/Core> int main() { std::cout << "Hello Graphics!" << std::endl; // 创建一个 2x2 矩阵 Eigen::Matrix2f m; m << 1.0, 2.0, 3.0, 4.0; std::cout << "Matrix m:\n" << m << std::endl; // 创建一个 2D 向量 Eigen::Vector2f v(1.0, 2.0); std::cout << "Vector v: " << v.transpose() << std::endl; // 矩阵乘向量 Eigen::Vector2f result = m * v; std::cout << "m * v = " << result.transpose() << std::endl; return 0; }
  • 保存文件。
  • 回到虚拟机桌面,右键 → “Open Terminal Here”(如果没有,就按Ctrl+Alt+T打开终端,再输入cd ~/Desktop回车)。
  • 开启拖放:点击虚拟机顶部菜单“设备 → 拖放 → 双向”。
  • 把本机的main.cpp文件,直接拖到虚拟机桌面。松手,文件就出现在桌面上。
  • 在终端里输入:
cd ~/Desktop mkdir build && cd build cmake .. && make ./main
  • 如果一切顺利,终端会输出:
Hello Graphics! Matrix m: 1 2 3 4 Vector v: 1 2 m * v = 5 11

恭喜!你刚刚完成了图形学世界的“阿姆斯特朗登月”——不是画出了什么,而是证明了你的环境、你的工具、你的理解,全部在线。这行Hello Graphics!,比任何炫酷渲染图都珍贵。

4. 避坑指南:新手必踩的 5 个“看似简单,实则致命”的坑

4.1 现象:VirtualBox 启动后黑屏,或卡在紫色 Ubuntu Logo

原因:显卡驱动未加载,或 VirtualBox 版本与.vdi不兼容。常见于 Windows 10 更新后或 macOS M1/M2 芯片用户(VirtualBox 6.1.4 不支持 Apple Silicon)。
解决:

  • Windows:右键“此电脑”→“管理”→“设备管理器”→展开“显示适配器”,右键你的独显(如 NVIDIA)→“更新驱动程序”→“自动搜索”。
  • macOS:如果你是 M1/M2 Mac,立刻停止!VirtualBox 6.1.4 无法运行。请换用 Parallels Desktop 或 VMware Fusion(需付费),或改用课程官方推荐的替代方案(如有)。
  • 通用:在 VirtualBox 中选中虚拟机 → “设置” → “显示” → “视频内存”调到 128MB,“启用 3D 加速”打钩。

4.2 现象:拖放文件到虚拟机桌面,文件消失或变成乱码

原因:Guest Additions 未安装成功,或拖放功能未开启。
解决:

  • 先确认 Guest Additions 是否装好(见 3.4 节终端命令输出)。
  • 再检查:虚拟机运行时 → 顶部菜单“设备” → “拖放” → 必须是“双向”(不是“仅主机到客户机”)。
  • 如果仍不行,换用“共享文件夹”:VirtualBox 设置 → “共享文件夹” → 添加一个本机文件夹(如D:\Games101\shared)→ 在虚拟机终端输入sudo mount -t vboxsf shared /mnt/shared→ 把main.cpp放进本机shared文件夹,再到虚拟机/mnt/shared/下操作。

4.3 现象:cmake ..报错Could not find a package configuration file provided by "Eigen3"

原因:CMake 找不到 Eigen 库的配置文件。虽然虚拟机预装了 Eigen,但它的路径可能没被 CMake 默认扫描。
解决:

  • 在build文件夹下,用终端输入:
cmake -DEigen3_DIR=/usr/share/eigen3/cmake .. && make
  • 这条命令显式告诉 CMake:“Eigen3 的配置文件在/usr/share/eigen3/cmake这里,请去那儿找”。这是最稳妥的绕过方式,比修改系统环境变量安全得多。

4.4 现象:./main运行时报错Segmentation fault (core dumped)

原因:代码里访问了未初始化的内存,或数组越界。新手常犯:Eigen::Vector3f v; std::cout << v << std::endl;——v没赋值,内容是随机垃圾值,打印时崩溃。
解决:

  • 永远初始化向量/矩阵:写Eigen::Vector3f v(0,0,0);或Eigen::Vector3f v = Eigen::Vector3f::Zero();
  • 用std::cout打印前,先确认对象已构造:if (v.size() > 0) std::cout << v << std::endl;
  • 编译时加调试信息:cmake -DCMAKE_BUILD_TYPE=Debug .. && make,错误提示会更具体。

4.5 现象:VS Code 里写代码,#include <eigen3/Eigen/Core>下有红色波浪线,提示“找不到头文件”

原因:VS Code 的 C++ 插件不知道 Eigen 的路径,但不影响编译运行(因为g++能找到)。这是编辑器“假报错”。
解决:

  • 在 VS Code 中,按Ctrl+Shift+P→ 输入C/C++: Edit Configurations (UI)→ 在“Include path”里添加/usr/include/eigen3→ 保存。
  • 更简单的方法:忽略它。只要cmake && make能过,红色波浪线就是 VS Code 的“过度关心”,不是你的代码问题。

5. 从“跑通 Hello”到“真正动手”:下一步该学什么?一份不烧脑的渐进路线图

5.1 别急着啃《实时渲染》:先吃透这三个“图形学最小知识单元”

你已经拥有了完美的环境,现在要做的,不是马上挑战光线追踪,而是把作业0里埋着的三个“种子”浇灌长大。它们是后续所有作业的基石,理解透了,后面全是重复劳动,而不是重新发明轮子。

5.1.1 齐次坐标:为什么一个 2D 点要写成 (2,1,1)?

作业3.1要求“用齐次坐标计算旋转+平移”,很多同学抄完公式就交,却不知为何。真相很简单:普通 2D 坐标(x,y)只能做旋转、缩放(线性变换),但不能做平移(非线性);而齐次坐标(x,y,1)把平移“伪装”成了矩阵乘法。

  • 试试这个:在main.cpp里加一段:
// 2D 点 P = (2,1) Eigen::Vector3f P(2.0f, 1.0f, 1.0f); // 绕原点逆时针旋转45度的齐次矩阵(cos45=sin45=0.707) Eigen::Matrix3f R; R << 0.707, -0.707, 0.0, 0.707, 0.707, 0.0, 0.0, 0.0, 1.0; // 平移 (1,2) 的齐次矩阵 Eigen::Matrix3f T; T << 1.0, 0.0, 1.0, 0.0, 1.0, 2.0, 0.0, 0.0, 1.0; // 先旋转,再平移:T * R * P Eigen::Vector3f result = T * R * P; std::cout << "Transformed point: (" << result(0) << ", " << result(1) << ")" << std::endl;
  • 运行它,你会得到(2.121, 3.536)。这就是答案。关键不是记住数字,而是理解:R和T都是 3x3 矩阵,P是 3x1 向量,所有操作都是matrix * vector,平移不再是x += 1这种特殊语法,而是和其他变换完全一致的数学语言。这就是齐次坐标的魔力——它让图形学的所有变换,都服从同一个规则。
5.1.2 Eigen 库的“懒求值”机制:为什么a + b + c不立刻算?

你可能注意到,Eigen::Matrix3f i, j; i << 1,2,3,4,5,6,7,8,9;这种写法很怪。这是因为 Eigen 为了极致性能,采用了“表达式模板”(Expression Templates)。它不立即计算i + j,而是生成一个“待计算的表达式对象”,直到你把它赋值给一个实际矩阵(如Eigen::Matrix3f k = i + j;)才真算。

  • 好处:k = i + j + i * j这种复杂式子,Eigen 会优化成一次内存遍历,而不是先算i+j存中间变量,再算i*j存中间变量,最后加。
  • 新手注意点:永远把表达式结果赋给一个明确的 Eigen 对象。别写std::cout << i + j << std::endl;(虽然能编译,但效率低),而要写:
Eigen::Matrix3f sum = i + j; std::cout << sum << std::endl;
  • 这不是教条,是让你的代码从第一天起,就带着“生产级思维”——不是“能跑就行”,而是“跑得明白、跑得高效”。
5.1.3 CMakeLists.txt:那个藏在角落、却决定你能否毕业的“编译说明书”

作业0没让你改CMakeLists.txt,但它才是整个项目的“宪法”。打开虚拟机里任意一个作业框架的根目录,你会看到这个文件。它干三件事:

  1. cmake_minimum_required(VERSION 3.10):声明最低 CMake 版本;
  2. project(Transformation):定义项目名;
  3. add_executable(Transformation main.cpp):告诉 CMake,“把main.cpp编译成叫Transformation的可执行文件”。
  • 后续作业会加更多行,比如find_package(Eigen3 REQUIRED)(找 Eigen 库)、target_link_libraries(Transformation Eigen3::Eigen)(链接 Eigen)。
  • 你现在要做的,就是养成习惯:每次新建一个.cpp文件,就打开CMakeLists.txt,在add_executable那行后面,加上你的文件名。比如你写了render.cpp,就改成add_executable(Transformation main.cpp render.cpp)。这是图形学工程师的肌肉记忆。

5.2 一份“防弃坑”的每日 30 分钟学习清单(第一周)

别想着一天学完。把下面这张表,当成你的“通关存档点”,每天只做一项,做完打钩:

天数任务关键动作验证标准
Day 1熟悉虚拟机桌面打开 VS Code,新建test.cpp,写cout<<"Day1";,cmake&&make&&./test终端输出Day1
Day 2玩转 Eigen 向量在main.cpp里定义Vector2f,Vector3f,Vector4f,用<<初始化,用transpose()打印看懂输出的行列方向
Day 3玩转 Eigen 矩阵定义Matrix2f,Matrix3f,Matrix4f,用<<填充,做+,-,*运算m * v输出正确,不崩溃
Day 4理解齐次坐标手动计算R * P和T * R * P,和代码输出对比两个结果数字一致
Day 5修改 CMakeLists.txt新建hello2.cpp,在CMakeLists.txt里加入它,make后运行./Transformation两个.cpp的输出都出现

从那以后我每次新建一个.cpp文件,都强制走一遍“改 CMakeLists.txt →cd build && cmake .. && make→./xxx”的全流程,哪怕只是写一行cout。这看起来是笨功夫,但它消灭了 90% 的“为什么我的新文件不编译”的深夜焦虑。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询