☰
GAMES101作业0环境搭建与避坑指南:虚拟机、Eigen与CMake实战
2026/9/27 3:28:26 网站建设 项目流程

简介:这份PDF是GAMES101(计算机图形学与混合现实研讨会)2020年春季课程作业0的官方指导文档,由闫令琪教授主讲,面向刚接触图形学、需要搭建统一开发环境的学生与自学者。文档围绕虚拟机使用展开,涵盖VirtualBox安装、虚拟硬盘下载与配置、Guest Additions增强功能安装、作业框架传输与编辑等关键环节,并附有作业框架说明、C++语法注意事项及Eigen库使用提示,帮助读者在统一环境中顺利完成编译与运行。资源包仅含1个PDF文件,大小约874KB,轻量便携,适合随时查阅。目前已有433人学习下载,可作为图形学入门阶段环境配置与作业提交的实用参考,尤其适合需要快速定位虚拟机操作细节、排查环境问题的读者。

1. 从一份 2020 年的作业 0 说起:为什么图形学入门要先过虚拟机这一关

很多人第一次打开 GAMES101 的作业 0,心里是有点不屑的——不就是一个点绕原点转 45 度再平移吗,初中几何水平。但真正卡住新手的从来不是那道题,而是它背后那套环境:VirtualBox 装不上、虚拟硬盘挂载报错、Guest Additions 装完还是不能拖文件、Ubuntu 密码输错三次进不去桌面。这份作业 0 的 PDF 本质上不是一道数学题,而是一份环境交付文档,它把「计算机图形学与混合现实研讨会」课程后续所有作业要用的 Ubuntu 18.04.2 环境、Eigen 线性代数库、CMake 构建流程、VSCode 编辑习惯,全部压缩进一个 .vdi 虚拟硬盘里。你拿到的是一个已经配好的黑匣子,省去了自己编译 Eigen、配 OpenCV、折腾 GCC 版本的麻烦。适合谁?适合刚接触 C++ 和图形学、不想在环境上耗掉三天的新手,也适合想快速验证课程代码的老手。这一章先把这份资源是什么、能解决什么讲清楚,后面再动手。

2. 虚拟机环境搭建:从 VirtualBox 安装到 .vdi 挂载的完整链路

2.1 为什么课程选 VirtualBox 而不是裸机或 WSL

课程正文明确写了使用 Oracle VM VirtualBox,版本指向 6.1.4。这个选择不是随便定的。图形学作业涉及 OpenGL、Eigen、CMake,Windows 上直接配 Eigen 经常遇到路径和编译器版本问题,WSL 早期对图形界面支持又不好。VirtualBox 的好处是跨平台一致:Windows、macOS、Linux 都能跑同一个 .vdi 文件,助教只需要维护一份环境。虚拟硬盘文件是GAMES101_Ubuntu 18.04.2(64bit).vdi,解压前是一个 rar 包,下载地址和密码在正文里给了,密码是games101。注意这个密码是下载压缩包用的,不是 Ubuntu 登录密码,两者别搞混。

VirtualBox 6.1.4 这个版本号值得留意。正文给的 Windows 下载链接是VirtualBox-6.1.4-136177-Win.exe,macOS 是.dmg,Linux 走官网的 Linux_Downloads 页面。如果你现在去官网下最新版,大概率也能用,但 6.1.x 系列对 Ubuntu 18.04 的兼容性经过课程验证,遇到玄学问题时退回 6.1.4 是成本最低的排查手段。安装过程一路下一步即可,Windows 上可能会提示安装网络驱动,允许就行。

2.2 新建虚拟机与挂载虚拟硬盘的关键参数

装完 VirtualBox 后,新建虚拟机的参数在正文里写得很具体:类型 Linux,版本 Ubuntu (64-bit),内存建议 2GB。这里有个坑:如果你主机内存只有 8GB,给 2GB 是合理的;如果主机 16GB 以上,可以给到 4GB,编译会快一些,但不要超过主机内存的一半。最关键的一步是「使用已有的虚拟硬盘文件」,选中解压出来的.vdi,而不是新建硬盘。这一步选错,后面进系统会发现是个空 Ubuntu,什么工具都没有。

配置完成后启动虚拟机,Ubuntu 的登录密码是Ilovegraphics,注意大小写。进去之后你会看到一个已经装好 VSCode、Sublime、Eigen、CMake 的桌面环境。如果启动时黑屏或者卡在登录界面,常见原因是主机开启了 Hyper-V 或 WSL2,和 VirtualBox 抢虚拟化权限。解决办法是在 Windows 功能里临时关闭 Hyper-V,或者用bcdedit /set hypervisorlaunchtype off后重启。这个坑在「虚拟机安装 linux 蓝屏」这类搜索里出现频率极高,本质就是虚拟化层冲突。

2.3 Guest Additions 安装:图形界面失败后的命令行兜底

Guest Additions 决定了你能不能全屏、能不能在主机和虚拟机之间拖放文件、共享剪贴板。正文给的第一种方式是菜单栏「设备」→「安装增强功能」,然后重启。但实际操作用户反馈这一步经常失败,尤其是 macOS 主机或者 VirtualBox 版本不匹配时。失败后正文给了命令行方案,我把它整理成可直接抄的步骤:

# 在 Ubuntu 虚拟机内打开终端,Ctrl+Alt+T sudo mkdir -p /media/cdrom sudo mount -t auto /dev/cdrom /media/cdrom/ cd /media/cdrom/ sudo sh VBoxLinuxAdditions.run

这几条命令的逻辑是:先建挂载点,把 VirtualBox 增强功能的光盘镜像挂到/media/cdrom,进去后执行安装脚本。-p参数保证目录不存在时自动创建,-t auto让系统自动识别光盘文件系统。执行完VBoxLinuxAdditions.run后必须重启,否则拖放功能不生效。如果提示mount: /dev/cdrom: can't read superblock,说明增强功能镜像没挂上,回到菜单栏重新点一次「安装增强功能」再执行命令。安装成功后,在「设备」→「拖放」里设为「双向」,「共享剪贴板」也设为「双向」,这样主机下载的作业框架直接拖进虚拟机桌面就行。

3. 作业框架导入与 C++/Eigen 代码结构:main.cpp 里到底有什么

3.1 用 VSCode 打开框架并跑通 CMake 编译流程

作业框架通过拖放进入虚拟机后,推荐用 VSCode 打开。正文写的是 File → Open Folder,选中框架目录。打开后你会看到main.cpp和CMakeLists.txt。课程要求用 CMake 编译,而不是直接 g++,这是为了后续作业的工程化做准备。编译步骤正文列得很清楚,我按顺序写成可复制的命令:

# 在 main.cpp 所在目录下打开终端 mkdir build # 创建构建目录,把编译产物和源码分离 cd build # 进入构建目录 cmake .. # .. 表示上一级目录,即 CMakeLists.txt 所在位置 make # 根据生成的 Makefile 编译 ./Transformation # 运行可执行文件,名字由 CMakeLists.txt 决定

mkdir build && cd build是 CMake 的标准外源构建习惯,好处是编译产生的中间文件不会污染源码目录,删掉 build 文件夹就等于清理干净。cmake ..里的两个点很多人第一次会写成一个点,一个点表示当前目录,但当前目录下没有 CMakeLists.txt,会直接报错。make阶段如果报undefined reference to xxx,正文的 C++ 常见错误指南里明确说了,去检查CMakeLists.txt是否漏了需要链接的模块。./Transformation这个可执行文件名不是固定的,打开 CMakeLists.txt 看add_executable那一行的第一个参数是什么,就运行什么。

3.2 Eigen 向量与矩阵:从 Vector3f 到齐次坐标变换

作业 0 的题目是:给定点 P=(2,1),绕原点逆时针旋转 45°,再平移 (1,2),用齐次坐标计算变换后坐标。正文的 Eigen 示例给了 Vector3f 和 Matrix3f 的用法,但作业需要的是 3x3 矩阵和 3x1 向量。齐次坐标下,二维点 (2,1) 写成 (2,1,1),旋转矩阵和平移矩阵都是 3x3。Eigen 里定义和相乘的写法如下:

#include <eigen3/Eigen/Core> #include <cmath> #include <iostream> int main() { // 定义齐次坐标下的点 P = (2, 1, 1) Eigen::Vector3f p(2.0f, 1.0f, 1.0f); // 逆时针旋转 45 度,角度转弧度 float theta = 45.0f / 180.0f * std::acos(-1); Eigen::Matrix3f rotation; rotation << std::cos(theta), -std::sin(theta), 0.0f, std::sin(theta), std::cos(theta), 0.0f, 0.0f, 0.0f, 1.0f; // 平移 (1, 2),平移量放在第三列 Eigen::Matrix3f translation; translation << 1.0f, 0.0f, 1.0f, 0.0f, 1.0f, 2.0f, 0.0f, 0.0f, 1.0f; // 先旋转再平移,注意顺序:translation * rotation * p Eigen::Vector3f result = translation * rotation * p; std::cout << result << std::endl; return 0; }

这段代码的关键点有三个。第一,Eigen 的<<运算符是按行填充矩阵,写的时候换行只是给人看的,编译器不关心。第二,旋转矩阵的构造里std::cos和std::sin接收的是弧度,所以45.0f / 180.0f * std::acos(-1)这一步不能省,std::acos(-1)就是 π。第三,变换顺序必须是translation * rotation * p,因为矩阵乘法从右往左作用在向量上,先旋转后平移。如果写成rotation * translation * p,就变成了先平移后旋转,结果完全不同。正文提示里专门说了「C++ 三角函数运算使用弧度制」,这就是血泪经验,每年都有人在这里翻车。

3.3 C++ 常见错误对照:从编译报错到段错误

正文列了五类常见错误,我按实际排查顺序补上对应的检查动作。Compile Error 编译错误,先看报错的第一行,通常第一个错误才是根因,后面的都是连锁反应。undefined reference to xxx是链接错误,检查 CMakeLists.txt 里的target_link_libraries是否包含了对应库。Segmentation Fault 段错误,最常见的是数组越界和空指针,Eigen 里如果矩阵维度写错也可能触发。Bus Error 总线错误,成因和段错误类似,有时是内存对齐问题。Math Error 数学错误,除数为零是典型,检查分母。这五类里,新手最容易遇到的是前两类,而undefined reference几乎都跟 CMake 配置有关,跟代码本身无关。

4. 避坑与排查:虚拟机、拖放、编译三个环节的高频翻车点

4.1 虚拟机启动黑屏或提示虚拟化不可用

现象:VirtualBox 启动虚拟机后黑屏,或者直接弹窗提示「不能为虚拟机电脑打开一个新任务」。原因:Windows 主机开启了 Hyper-V、WSL2 或内核隔离,这些功能占用了 CPU 虚拟化指令集,VirtualBox 拿不到控制权。解决:在「启用或关闭 Windows 功能」里取消勾选 Hyper-V 和「虚拟机平台」,或者以管理员身份运行bcdedit /set hypervisorlaunchtype off后重启主机。如果用的是 Windows 家庭版,Hyper-V 选项可能隐藏,直接走 bcdedit 命令更稳。

4.2 Guest Additions 装完拖放仍然失效

现象:命令行安装 VBoxLinuxAdditions.run 显示成功,重启后拖放文件还是没反应。原因:VirtualBox 菜单里的拖放模式没设成双向,或者增强功能版本和 VirtualBox 主程序版本不匹配。解决:先确认「设备」→「拖放」和「共享剪贴板」都是「双向」;如果还不行,在虚拟机内执行sudo apt-get install virtualbox-guest-dkms装 Ubuntu 源里的版本,再重启。注意,拖放功能对文件大小和类型有限制,大文件建议用共享文件夹而不是拖放。

4.3 cmake .. 报错找不到 CMakeLists.txt

现象:在 build 目录下执行cmake ..,提示CMake Error: The source directory ... does not appear to contain CMakeLists.txt。原因:要么当前目录不是 build,要么..指向的上一级目录里确实没有 CMakeLists.txt。解决:用pwd确认当前路径,用ls ..看上一级目录内容。如果框架解压后多套了一层文件夹,比如GAMES101/main.cpp,那 build 要建在GAMES101里面,cmake ..才找得到。这个坑的本质是目录层级和预期不一致,跟 CMake 本身无关。

4.4 Eigen 头文件找不到 eigen3/Eigen/Core

现象:编译时报fatal error: eigen3/Eigen/Core: No such file or directory。原因:Eigen 没装,或者 include 路径不对。解决:课程提供的虚拟机里 Eigen 已经装好,如果报这个错,先确认你是在虚拟机内编译而不是在主机上。如果确实在虚拟机内,执行sudo apt-get install libeigen3-dev补装。另一种情况是 CMakeLists.txt 里没写include_directories,但课程框架通常已经配好,改代码时不要动 CMakeLists 的 include 部分。

4.5 运行可执行文件提示 Permission denied

现象:./Transformation报bash: ./Transformation: Permission denied。原因:可执行文件没有执行权限,常见于从主机拖进虚拟机的文件,或者解压时权限丢失。解决:执行chmod +x Transformation加上执行权限。如果整个框架目录权限都不对,用chmod -R +x递归处理,但注意不要给所有文件都加执行权限,只给可执行文件加就行。

5. 从作业 0 到后续作业:把环境验证变成肌肉记忆

作业 0 不评分,但它决定了你后面十几次作业能不能顺利跑起来。我自己的习惯是,每次开始新作业前,先跑一遍作业 0 的流程:启动虚拟机、确认拖放可用、用 CMake 编译一个最小 main.cpp、运行看输出。这套动作花不了五分钟,但能提前暴露环境问题,避免在 deadline 前夜发现虚拟机进不去。正文里提到的 SmartChair 提交平台,作业 0 也要求走一遍提交流程,目的就是让你熟悉打包和上传。打包时把整个框架目录压缩成 zip,不要只传 main.cpp,因为 CMakeLists.txt 和后续可能新增的文件都要一起提交。

一个具体的技巧是,在虚拟机里给 build 目录做个软链接或者别名,比如在.bashrc里加alias gbuild='mkdir -p build && cd build && cmake .. && make',这样每次编译只需要敲一个gbuild。但注意,这个别名只在当前终端会话生效,写进.bashrc后要source ~/.bashrc或者重开终端。另外,VSCode 在虚拟机里打开文件夹后,终端默认路径可能不是框架目录,用cd切过去再执行编译命令,别在错误目录下瞎试。

从那以后我每次拿到新的课程框架,都强制先跑一遍作业 0 的编译链路,确认 Eigen 能 include、CMake 能生成、可执行文件能运行,再开始写业务代码。这个习惯帮我省掉了至少三次「代码没问题但环境炸了」的深夜排查。希望帮到你。

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

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

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

立即咨询