腾讯魔方一面凉经
岗位是游戏客户端,主要问项目,而且会看你的项目运行,被拷打了一个多小时
问题的答案不全是我答的,一些是我之后查资料整理出来的答案,仅供参考
1.实现一个MyVector类,实现类似vector中的push_back方法
实现完成后开始深挖,首先是多写几种构造函数,然后要求写类似MyVector arr = {1, 2, 3, 4}这种构造方法。(最后的列表初始化没写出来,面试官让我去网上查,可能是想考察我的查资料能力,但是我当时紧张忘记用ChatGPT了,结果没查出来。。。)
实现方法:
MyVector(std::initializer_list<int> list) { size_ = list.size(); data_ = new int[size_]; int* ptr = data_; for (const int& val : list) { *ptr = val; ptr++; } }
2.OpenGL渲染管线中,MVP三个矩阵的作用
Model矩阵:将局部坐标转化为世界坐标,主要是对模型进行一些变换,如缩放、旋转、平移等。
View矩阵:将世界坐标转化为观察坐标,也就是相对于摄像机的坐标。
Project矩阵:将观察空间转化为裁影空间,也就是将三维空间映射到二维空间的过程,其中有两种投影方式,透视投影:遵循远小近大的3D视觉效果,正交投影:不考虑物体的距离,直接进行投影。
3.相机会使用到的一些参数
相机位置、相机向上的方向、观察点位置
4.Unity中涉及到透视的参数
轴:相机通过那个轴计算获取观察范围。
FOV:观察到的范围,是指相机位置到观察到的画面四边形上边右顶点的连线和相机位置到观察到的四边形下边右顶点连线的夹角,越大观察到的东西越多,一般是60°。
Near和Far,在裁剪时使用,观察到的物体只会在距离相机Near-Far之间,在范围外的物体会被裁剪。
是否为物理相机:物理相机会根据物理情况计算获取到观察的画面,主要由焦距和传感器大小两个参数计算。
5.Update和FixUpdate的区别
Update会在每一帧执行,会根据电脑帧率的不同导致执行次数的不同,deltaTime指你上一帧和这一帧之间的时间间隔
FixUpdate会在固定的时间间隔执行(FixDeltaTime:0.02s),这个时间间隔可以在Unity设置中修改,一般用于更新物理计算
6.美术是你自己弄的吗?
美术资源是网上下载的,渲染管线是自己写的,然后读取模型和动画渲染是自己写的
7.OpenGL项目写了什么?
8.骨骼的根节点是哪一个?
9.骨骼的权重有什么用?怎么进行计算?
因为一个顶点可能受多个骨骼的影响,所以会对不同骨骼的变化矩阵进行加权计算后在进行顶点的变换,这个过程在shader中进行计算。
10.项目中可移动的摄像机怎么实现的?
通过获取键盘输入,改变相机位置矩阵,然后通过lookAt方法重新计算view矩阵,实现移动的摄像机。
11.Unity项目你做了什么?
12.项目难点或者亮点是什么?
13.项目是用的urp管线吗?有了解吗?
14.算法题:一个字符串只会有‘0’和‘1’,然后可以对任意位进行翻转,会将‘0’变为‘1’,‘1’变为‘0’,翻转后在那一位后面的所有字符都会进行翻转,求出将字符串所有为变为‘0’的最小翻转次数。例如“100”的最小翻转次数为2,从“100”变为“011”变为“000”。
#include <iostream> #include <string> int minFlipsToZero(std::string s) { int flips = 0; char target = '0'; // 目标字符 for (int i = 0; i < s.length(); ++i) { if (s[i] != target) { ++flips; // 翻转当前字符 target = (target == '0') ? '1' : '0'; // 切换目标字符 } } return flips; } int main() { std::string input; std::cout << "请输入一个仅包含'0'和'1'的字符串:"; std::cin >> input; int flips = minFlipsToZero(input); std::cout << "最小翻转次数为:" << flips << std::endl; return 0; }#我的实习求职记录#