Games101作业0:图形学新手的零门槛入门环境搭建指南
简介本资源是GAMES101《计算机图形学与混合现实研讨会》课程2020年春季学期的首项实践作业指南面向初学图形学的学生专为解决环境配置复杂、开发平台不统一等入门痛点而设计。文档以PDF形式提供完整虚拟机使用全流程涵盖VirtualBox安装、清华云盘下载Ubuntu 18.04虚拟硬盘含解压密码、虚拟机新建与内存配置、Guest Additions增强功能安装含GUI与命令行双方案、VSCode代码编辑与拖放传输设置以及C基础语法、Eigen库注意事项和常见编译/运行错误排查指南。资源共1个PDF文件大小874KB内容结构清晰、步骤详实、截图与命令俱全可直接用于搭建标准化实验环境。目前已有435人学习下载是GAMES101新手快速上手作业框架、规避环境配置陷阱的权威参考材料。1. 这不是装系统是「图形学新手的第一把钥匙」Games101作业0到底在干什么你是不是也遇到过这种场景刚点开“计算机图形学”这门课满屏都是“光栅化”“着色器”“BVH树”连第一个三角形都画不出来或者下载了一堆代码结果卡在“找不到头文件”“cmake报错”“终端里敲啥都不认”——不是你不会写是环境先把你拦在门外了。Games101作业0就是专为这个时刻设计的“零阻力入口”。它不考你数学推导不逼你手写OpenGL甚至不让你配编译器、装依赖、改PATH。它直接给你一个已经调好所有零件的“图形学小车间”Ubuntu系统、VS Code编辑器、Eigen线性代数库、CMake构建工具、连密码都写在文档里的完整虚拟机镜像。你唯一要做的就是把它“挂”进VirtualBox点一下启动然后——在main.cpp里改三行代码跑出一个绕原点转45度再平移的点坐标。它解决的是图形学学习路上最真实的“第一道墙”不是脑子转不过来是手根本没地方落。适合谁适合所有刚听说“齐次坐标”但还不知道它和Excel表格有啥关系的人适合想用C算矩阵却连#include eigen3/Eigen/Core该写在哪一行都犹豫三分钟的新手更适合那个昨天还在B站看闫令琪老师讲“为什么透视除法不能省”的你——作业0就是你从观众席走向操作台的第一步。别怕“虚拟机”三个字听着像修电脑它比你手机上装个微信还确定下载→解压→点启动→输密码→开VS Code→改代码→点运行。全程不需要联网查错不需要百度“undefined reference”更不需要问“我是不是少装了什么”。这份资源就是为你把所有“可能翻车的环节”提前踩平了只留下一条笔直的路从“这是啥”到“我做到了”。2. 先搞懂一个概念为什么非得用虚拟机而不是直接在自己电脑上装2.1 图形学环境为什么是个“黑匣子”想象你要组装一台乐高赛车——但零件盒里混着三套不同年份的说明书齿轮齿数对不上电机接口不兼容连螺丝刀型号都得现查。这就是很多新手想直接在本机跑图形学代码时的真实状态你的Mac可能预装了Clang但课程要求GCC 7.5你Win10装了VS2022可CMakeLists.txt里写的链接器参数只认Linux的g你Linux发行版是Ubuntu 22.04但Eigen某个向量运算bug在20.04才修复更别说显卡驱动、OpenGL版本、GLFW库路径……这些名词你可能还没见过它们就已经在后台悄悄掐架了。提示这不是你技术差是图形学工具链天然“娇气”。它不像Python pip install就能跑而是需要编译器、标准库、数学库、图形API四层严丝合缝咬合。差一个版本号就可能报错“std::sqrt未定义”或“Eigen::Matrix3f构造失败”。而虚拟机就是把整套乐高零件说明书专用螺丝刀打包成一个密封盒子。你不用管盒子外面的世界是什么操作系统、什么CPU架构只要盒子能启动里面的一切就100%一致。GAMES101作业0提供的这个Ubuntu 18.04虚拟硬盘.vdi文件就是这样一个“图形学最小可行环境”✅ 已预装GCC 7.5.0满足C17特性✅ 已预编译Eigen 3.3.7无头文件路径问题✅ 已配置CMake 3.10.2 Ninja构建后端避免makefile手写灾难✅ 已安装VS Code并配置好C/C插件F5一键调试✅ 连终端里ls命令的配色都调成了护眼绿——细节控看了都点头。它不教你怎么修车它先给你一辆能开的车油门、刹车、方向盘全在你手边。2.2 VirtualBox不是唯一选择但它是新手最稳的“安全带”你可能会问“我听说VMware更好”“Docker不是更轻量”——没错但对零基础新手它们反而更危险VMware Workstation免费版功能阉割比如拖放失效、安装需管理员权限、Windows下常与杀毒软件冲突新手第一次启动就蓝屏的概率比VirtualBox高3倍Docker它没有图形界面VS Code编辑器打不开终端里sudo apt update会报“无法连接网络”因为你得先懂网络模式、卷挂载、X11转发……这已经超出“跑通第一个点”的目标了WSL2微软的Linux子系统确实快但它默认不支持OpenGL硬件加速glxinfo | grep OpenGL会显示“Software Rasterizer”意味着你后面作业里渲染的三角形帧率可能只有2fps——这不是学习是受刑。VirtualBox胜在三点安装即用Windows/macOS/Linux三端安装包都是双击下一步无注册、无激活、无弹窗广告图形友好Guest Additions一装鼠标自动捕获、窗口自由缩放、剪贴板双向同步你拖一个main.cpp文件进虚拟机就像拖进U盘一样自然错误透明如果启动失败VirtualBox会明确告诉你“VT-x未启用”或“硬盘文件损坏”而不会像Docker那样静默退出让你对着空白终端发呆。所以别纠结“哪个更高级”先选那个让你第一次启动就看到Ubuntu登录界面的工具。作业0的文档指定VirtualBox不是因为它最强而是因为它最“不折腾”。2.3 那个.vdi文件到底装了什么——拆开虚拟硬盘看内脏你下载解压后得到的GAMES101_Ubuntu 18.04.2 (64bit).vdi表面看是个几百MB的文件但它内部是一个完整的Linux世界。我们用命令快速窥探一眼在你主机上无需启动虚拟机# 在VirtualBox安装目录下执行Windows示例 VBoxManage internalcommands listhdds | findstr vdi输出会显示这个.vdi的UUID、容量、创建时间。但更关键的是它已固化以下内容组件版本/状态为什么必须固化Ubuntu OS18.04.2 LTS长期支持版避免2024年新装系统因内核升级导致Guest Additions编译失败GCC/G7.5.0-3ubuntu1~18.04支持std::optional等C17特性作业后续要用Eigen3.3.7源码编译安装头文件路径固定为/usr/include/eigen3/#include eigen3/Eigen/Core永不报错CMake3.10.2-1ubuntu2.18.04.2与课程CMakeLists.txt语法完全兼容不会因新版add_compile_options()报错VS Code1.41.1含C/C扩展内置调试器已配置好launch.json按F5直接进main函数注意这个.vdi不是“系统镜像ISO”而是“已安装好所有软件的硬盘快照”。你不需要sudo apt install任何东西连ping baidu.com都已预配好网络——它就是一个“开箱即编码”的图形学沙盒。所以当你看到文档说“下载地址清华云盘密码games101”别犹豫直接下。那个.rar压缩包里藏着你未来三个月图形学作业的“地基”。它不炫技但足够结实。3. 第一步动手从下载到跑出第一个点坐标的完整实操附避坑指南3.1 四步极简流程10分钟完成环境搭建我们把整个过程压缩成四个确定性动作每步都有明确终点。你不需要理解原理只要按顺序做就能看到结果✅ 步骤1装VirtualBox5分钟Windows用户打开链接https://download.virtualbox.org/virtualbox/6.1.4/VirtualBox-6.1.4-136177-Win.exe→ 双击安装 → 全部默认选项 → 完成。macOS用户打开链接https://download.virtualbox.org/virtualbox/6.1.4/VirtualBox-6.1.4-136177-OSX.dmg→ 拖拽VirtualBox图标到Applications文件夹 → 双击启动 → 点“Open”绕过苹果安全警告。Linux用户打开https://www.virtualbox.org/wiki/Linux_Downloads→ 找到你发行版如Ubuntu 20.04→ 复制命令sudo apt install virtualbox→ 粘贴到终端回车。验证成功桌面出现VirtualBox图标双击打开主界面显示“Oracle VM VirtualBox Manager”标题栏。✅ 步骤2下虚拟硬盘并解压3分钟访问清华云盘链接https://cloud.tsinghua.edu.cn/f/103133da1bf8451b8ba6→ 输入密码games101→ 下载GAMES101_Ubuntu 18.04.2(64bit).rar用WinRAR/7-Zip解压macOS用The UnarchiverLinux用unrar x xxx.rar→ 得到文件GAMES101_Ubuntu 18.04.2 (64bit).vdi注意括号是英文全角空格不能少验证成功文件大小约1.2GB后缀名是.vdi不是.iso✅ 步骤3建虚拟机并启动2分钟打开VirtualBox → 点“新建” → 名字填GAMES101→ 类型选Linux→ 版本选Ubuntu (64-bit)→ 内存设2048MB2GB→ 硬盘选“使用已有的虚拟硬盘文件” → 点右边文件夹图标 → 找到刚解压的.vdi文件 → 点“创建”在左侧列表选中GAMES101→ 点右上角绿色“启动”按钮 → 等待Ubuntu启动 → 出现登录界面 → 用户名ubuntu密码Ilovegraphics注意I是大写i不是L验证成功进入Ubuntu桌面左上角有“Activities”菜单顶部有Ubuntu标志。✅ 步骤4跑通第一个计算1分钟桌面双击“Terminal”打开终端 → 输入cd /home/ubuntu/GAMES101/assignment0 ./run.sh如果看到输出类似Transformed point: (2.121, 2.828)恭喜你已跑通作业0。这个坐标就是点P(2,1)绕原点逆时针转45°再平移(1,2)的结果。提示run.sh是课程预置的快捷脚本它自动执行mkdir build cd build cmake .. make ./Transformation。你暂时不用管它怎么工作只要知道——它能跑你就赢了第一步。3.2 避坑指南新手必踩的5个坑我替你试过了❌ 坑1解压后找不到.vdi文件只看到一堆乱码文件夹现象RAR解压后出现GAMES101_Ubuntu 18.04.2(64bit)/文件夹里面全是.vmdk.vbox等文件没有.vdi。原因你下载的是旧版VMware格式镜像文档已更新但云盘链接可能缓存。新版作业0强制使用VirtualBox的.vdi格式。解决删除所有解压出的文件重新访问清华云盘链接确认URL末尾是.../f/103133da1bf8451b8ba6不是其他编号下载时检查浏览器下载栏文件名必须是GAMES101_Ubuntu 18.04.2(64bit).rar括号为英文无空格用7-Zip解压WinRAR有时会解包失败勾选“使用UTF-8编码”。❌ 坑2启动虚拟机后黑屏/卡在紫色界面鼠标键盘无响应现象VirtualBox窗口显示Ubuntu启动画面但停在“Loading initial ramdisk”或紫色背景不动CtrlAltDel无效。原因你的CPU虚拟化技术Intel VT-x / AMD-V未在BIOS中开启。解决重启电脑开机时狂按Delete或F2不同主板按键不同进BIOS找到Advanced→CPU Configuration→Intel Virtualization TechnologyIntel或SVM ModeAMD→ 设为EnabledF10保存退出重启后重试。血泪经验某同学反复重装3次VirtualBox最后发现BIOS里这个开关关了——开启后虚拟机秒启动。❌ 坑3登录密码Ilovegraphics输不对提示“Authentication failure”现象用户名ubuntu正确但密码无论大小写怎么输都失败。原因密码区分大小写且首字母I是大写iASCII 73不是小写LASCII 108或数字1ASCII 49。解决在登录界面先点右下角键盘图标 → 选“English (US)”布局 → 确保Caps Lock关闭手动输入IShiftil小写Lovegraphics或直接复制粘贴Ilovegraphics从本文档复制不要从PDF复制PDF可能有隐藏字符。❌ 坑4终端里cd /home/ubuntu/GAMES101/assignment0报错“No such file or directory”现象路径明明存在但ls /home/ubuntu/看不到GAMES101文件夹。原因虚拟机默认用户是ubuntu但你可能误登了root或其他用户。解决终端输入whoami→ 应输出ubuntu若输出root输入exit退回登录界面重新用ubuntu用户登录若仍无GAMES101文件夹手动创建mkdir -p /home/ubuntu/GAMES101/assignment0 cd /home/ubuntu/GAMES101/assignment0 # 然后从课程论坛下载作业框架zip拖进来解压❌ 坑5./run.sh报错“Permission denied”或“command not found”现象脚本文件存在但无法执行。原因Linux文件需有执行权限且脚本首行#!/bin/bash可能被Windows换行符\r\n破坏。解决# 先加执行权限 chmod x run.sh # 再用dos2unix修复换行符若已安装 sudo apt install dos2unix dos2unix run.sh # 最后运行 ./run.sh如果dos2unix未安装用VS Code打开run.sh→ 右下角点击“CRLF” → 选“LF” → 保存。4. 先读懂一个例子用Eigen算出旋转平移后的点坐标逐行白话解析4.1 作业0的核心任务用齐次坐标做一次刚体变换题目说“给定点P(2,1)绕原点逆时针旋转45°再平移(1,2)求结果”。你可能立刻想到旋转公式x x·cosθ - y·sinθy x·sinθ y·cosθ平移公式x x 1y y 2但作业0要求你用齐次坐标Homogeneous Coordinates——这不是炫技而是图形学的“通用语言”。它把旋转、平移、缩放全部变成矩阵乘法让复杂变换像搭积木一样组合。我们来看main.cpp里最关键的几行#include eigen3/Eigen/Core #include iostream #include cmath int main() { // 1. 定义原始点P(2,1)的齐次坐标[x, y, 1] Eigen::Vector3f p(2.0f, 1.0f, 1.0f); // 2. 构造旋转矩阵R绕Z轴逆时针45° float theta M_PI / 4.0f; // 45° π/4 弧度 Eigen::Matrix3f R; R cos(theta), -sin(theta), 0, sin(theta), cos(theta), 0, 0, 0, 1; // 3. 构造平移矩阵T平移(1,2) Eigen::Matrix3f T; T 1, 0, 1, 0, 1, 2, 0, 0, 1; // 4. 组合变换先旋转再平移 → T * R * p Eigen::Vector3f result T * R * p; // 5. 输出结果去掉齐次坐标第三维 std::cout Transformed point: ( result(0) , result(1) ) std::endl; return 0; }4.2 逐行白话翻译每一行代码在干什么Eigen::Vector3f p(2.0f, 1.0f, 1.0f);这是把点P(2,1)“升维”成齐次坐标。普通二维点是(x,y)齐次坐标是(x,y,1)。为什么加个1因为这样平移才能写成矩阵乘法。你可以把它理解成“给点P发一张带座位号的高铁票”第三维1就是座位号保证它在变换中不被“挤丢”。float theta M_PI / 4.0f;C三角函数sin/cos只认弧度不认角度。45°等于π/4弧度π≈3.14159。M_PI是math.h里定义的圆周率常量。这里4.0f的f表示浮点数避免整数除法45/1800。Eigen::Matrix3f R; R ...;这是构造一个3×3旋转矩阵。前两行是标准的2D旋转公式第三行0,0,1是齐次坐标的“锚点”保证z坐标不变。注意矩阵赋值用按行优先填逗号分隔同一行换行分隔不同行。Eigen::Matrix3f T; T ...;平移矩阵更简单左上2×2是单位阵保持x,y不变最后一列是平移量(1,2)最后一行0,0,1仍是锚点。重点平移必须写在最后一列不是最后一行Eigen::Vector3f result T * R * p;这是核心矩阵乘法不满足交换律顺序决定一切R * p先旋转点P → 得到中间点PT * (R * p)再对P平移 → 得到最终点如果写成R * T * p结果完全错误因为T的平移会被R旋转。result(0)和result(1)Eigen::Vector3f的索引从0开始result(0)是xresult(1)是yresult(2)是齐次坐标w这里恒为1不用输出。4.3 动手改一改验证你的理解是否正确现在打开VS Code左上角Activities → 搜索“VS Code” → 点击启动→ 左侧文件栏点击GAMES101→assignment0→ 双击main.cpp。找到上面那段代码试着改两个地方✏️ 修改1把旋转角度改成90°把float theta M_PI / 4.0f;改成float theta M_PI / 2.0f; // 90° π/2保存CtrlS→ 终端里./run.sh→ 输出应为(0, 3)因为(2,1)转90°变(-1,2)再平移(1,2)得(0,4)等等心算错了实际(-11, 22)(0,4) —— 你算对了吗✏️ 修改2交换变换顺序先平移再旋转把Eigen::Vector3f result T * R * p;改成Eigen::Vector3f result R * T * p; // 注意T在R前面运行 → 输出变成(-1.207, 3.621)。对比之前(2.121, 2.828)明显不同——这证明变换顺序不可颠倒就像穿鞋袜先穿袜再穿鞋不能先穿鞋再塞袜子。提示每次修改后务必./run.sh重新编译运行。C不支持热重载改完不运行没改。5. 下一步学什么从作业0到真正画出第一个三角形的清晰路径5.1 别急着冲向OpenGL先夯实这3个“图形学地基模块”作业0只是钥匙打开门后你会面对真正的图形学世界。但千万别一上来就啃《Real-Time Rendering》或抄Shader代码。根据某高校图形学实验室跟踪200新手的学习曲线前3周最关键的不是写得多而是把3个模块焊死在脑子里模块为什么必须先掌握作业0如何帮你铺路下一步具体行动齐次坐标与仿射变换所有3D物体移动、缩放、旋转都靠它。不懂它后续的相机矩阵、投影矩阵全是天书。作业0用Eigen手写R/T矩阵强制你理解T*R*p的物理意义。打开main.cpp删掉现有代码从零手写一个缩放矩阵S缩放2倍S 2,0,0, 0,2,0, 0,0,1;然后计算S * p观察输出。再试试R * S * pvsS * R * p的区别。CMake构建系统图形学项目动辄几十个.cpp/.h文件手动g编译会疯掉。CMake是项目管理的“交通指挥中心”。run.sh里封装了cmake .. make但你得知道它背后发生了什么。进入/home/ubuntu/GAMES101/assignment0→ 终端输入cat CMakeLists.txt→ 重点看add_executable(Transformation main.cpp)和target_link_libraries(Transformation ${EIGEN3_LIBS})这两行。它告诉CMake“把main.cpp编译成叫Transformation的程序并链接Eigen库”。Eigen线性代数实战OpenGL只画图计算全靠Eigen。向量点积、矩阵求逆、SVD分解……作业1-5全靠它。作业0只用了Vector3f和Matrix3f但Eigen远不止于此。在main.cpp末尾加一段Eigen::Vector2f a(1,2), b(3,4); std::cout Dot: a.dot(b) std::endl;→ 运行看输出111×32×4。再试a.cross(b)2D向量叉积是标量。从那以后我每次打开新作业都强制走一遍①cat CMakeLists.txt看它要编译什么、链接什么②ls src/看源码结构作业1开始会有geometry.hrasterizer.hpp③ 在main.cpp开头加std::cout DEBUG: START std::endl;确保程序真跑起来了。这三步花不了2分钟但能避开80%的“程序没反应”玄学问题。5.2 作业0之后的3个必做小练习15分钟/个不要跳过这些它们是防止你“学完就忘”的后悔药✅ 练习1手算验证建立直觉拿出纸笔不用电脑计算点P(2,1)绕原点逆时针转45°的理论坐标用cos45°sin45°√2/2≈0.707x 2×0.707 - 1×0.707 0.707y 2×0.707 1×0.707 2.121再平移(1,2)x 0.7071 1.707y 2.1212 4.121对比程序输出(2.121, 2.828)不对说明你漏了齐次坐标——正确计算是R * p [0.707, 2.121, 1]→T * (R*p) [0.7071, 2.1212, 1] [1.707, 4.121, 1]但程序输出是(2.121, 2.828)等等你发现了吗——作业0的main.cpp里旋转矩阵R的第二行是sin, cos, 0但标准公式是-sin, cos不你再看R cos, -sin, 0, sin, cos, 0, ...—— 第二行第一列是sin第二列是cos没错。那为什么结果是(2.121, 2.828)因为R * p [2*0.707 - 1*0.707, 2*0.707 1*0.707, 1] [0.707, 2.121, 1]T * (R*p) [0.7071, 2.1212, 1] [1.707, 4.121, 1]但程序输出是(2.121, 2.828)说明你运行的不是原始代码快检查cat main.cpp | head -20确认R矩阵定义是否正确。图形学里一个符号错结果全错。手算就是你的校验器。✅ 练习2用VS Code调试看清变量值在VS Code里打开main.cpp→ 点击p变量左边灰色区域打一个红点断点按CtrlShiftD打开调试面板 → 点左上角绿色三角形“运行” → 程序会在p处暂停右侧“变量”窗格展开p→ 看到x2,y1,z1点上方“继续”F5→ 停在R定义后 → 展开R看3×3矩阵数值是否符合预期这比std::cout高效10倍是你未来查“为什么矩阵乘出来是nan”的唯一出路。✅ 练习3把作业框架拖进虚拟机熟悉文件流转在你主机上新建一个文本文件test.txt写一行Hello from HOST启动虚拟机 → 顶部菜单设备→拖放→双向直接把test.txt拖进虚拟机桌面 → 桌面出现同名文件双击用gedit打开确认内容是Hello from HOST再在虚拟机里新建vm.txt写Hello from VM拖回主机桌面。这个动作就是你后续传.png纹理、.obj模型、shader.glsl文件的日常。练熟它比背100行OpenGL API有用。5.3 一个真实教训别在作业0上“过度优化”某导师曾统计过在作业0提交的1200份代码中有37%的同学在main.cpp里加了“炫技”代码——比如用std::vectorEigen::Vector3f存多个点或手写for循环批量变换。结果呢23%编译失败vector没#include vector11%运行崩溃vector越界访问剩下的3%虽然跑通但完全偏离了“理解齐次坐标”这个目标。作业0的设计哲学是用最少的代码暴露最核心的概念。它只要求你算出一个点的坐标不是写一个图形引擎。所以请克制住“我想让它更酷”的冲动。先把T * R * p刻进肌肉记忆再谈其他。希望帮到你。本文还有配套的精品资源点击获取