GAMES101作业0环境搭建与避坑指南:虚拟机、Eigen与CMake实战
简介这份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、CMakeWindows 上直接配 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.exemacOS 是.dmgLinux 走官网的 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 虚拟机内打开终端CtrlAltT 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: cant 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 gbuildmkdir -p build cd build cmake .. make这样每次编译只需要敲一个gbuild。但注意这个别名只在当前终端会话生效写进.bashrc后要source ~/.bashrc或者重开终端。另外VSCode 在虚拟机里打开文件夹后终端默认路径可能不是框架目录用cd切过去再执行编译命令别在错误目录下瞎试。从那以后我每次拿到新的课程框架都强制先跑一遍作业 0 的编译链路确认 Eigen 能 include、CMake 能生成、可执行文件能运行再开始写业务代码。这个习惯帮我省掉了至少三次「代码没问题但环境炸了」的深夜排查。希望帮到你。本文还有配套的精品资源点击获取
上一篇/下一篇内容由系统自动关联
返回资讯列表 →