跳转至

指纹识别要揭示的模型

创建好的透视最难的部分是为 numVertices 和 primCount 找到正确的值。为此,你可以创建一个记录两个变量每个唯一组合的工具,并允许你用键盘在列表中迭代。这个工具的工作示例代码对本章提供的示例应用没有用,但我会给你一些高层实现细节。

首先,在全局作用域中,声明一个结构,包含以下成员:

(cid:127)numVertices 和 primCount

(cid:127)这个结构的 std::set(我们叫它 seenParams)

(cid:127)这个结构的一个实例(我们叫它 currentParams)

std::set 需要这个结构的比较器,所以你还要声明一个比较函子,用 memcmp() 比较两个结构。每次调用 DrawIndexedPrimitive() 回调时,你的破解可以创建一个包含拦截值的结构实例,把它传给 seenParams.insert() 函数,该函数只在该参数对不在列表中时把它插入列表。

使用 GetAsyncKeyState() Windows API 函数,你可以检测空格键何时被按下,并执行类似下面伪代码的操作:

auto current = seenParams.find(currentParam);
if (current == seenParams.end())
    current = seenParams.begin();
else
    current++;
currentParams = *current;

这会在空格键按下时把 currentParams 设为 seenParams 中的下一对。有了这段代码,你可以使用类似于透视的代码,更改匹配 currentParams.numVertices 和 currentParams.primCount 的模型纹理。该工具还可以在屏幕上绘制这些值,让你能看到并记下来。

有了这样的工具,找到正确的模型就像在角色不会死的模式下启动游戏(和朋友对战、自定义模式等等)、运行机器人、按空格键直到每个需要的模型被高亮一样简单。一旦你有了目标模型的值,你就会修改透视中的 numVertices 和 primCount 检查,让它知道要高亮哪些模型。

 角色模型通常由单个身体部位的较小模型组成,游戏还经常在不同距离显示角色的不同模型。这意味着一种角色可能有 20 个或更多模型。即使在这种情况下,只选择一个模型(比如敌人的躯干)在透视中显示可能就足够了。