2

假设我有一个 3D(但不是立体的)DirectX 游戏或程序。有没有办法让第二个程序(或驱动程序)改变游戏中的相机位置?

我正在尝试构建一个可用于我的 DirectX 游戏/程序的头部跟踪插件或驱动程序。惯性运动传感器会给我头部的位置,但我的问题是使用该位置数据来改变相机位置,而不是头部跟踪的硬件/数学问题。

到目前为止,我还没有找到任何关于如何做到这一点的信息,但是 iZ3D 能够在原始相机附近创建两个相机并将其用于立体效果,所以我知道 DirectX 中存在一些挂钩/链接/连接使通过第二个程序操作相机成为可能。

如果我能够让它工作,我会发布代码。

-谢恩

4

1 回答 1

1

挂钩 Direct3D 调用本质上就是挂钩 DLL 调用。即它对 D3D 来说不是什么特别的东西,而只是一种通用技术。尝试在谷歌上搜索“hook dll”或从这里开始:[C++] Direct3D hooking sample。由于它总是发生在钩子上,因此有很多警告,你必须制作一个非常大的样板来满足钩子应用程序的所有需求。

但是,在游戏中使用相机进行操作通常不会产生好的结果。现代 PC 游戏至少有两个关键特性会严重限制你的想法:

  1. 预剪裁。几乎所有游戏引擎都会过滤掉观察平面后面的对象。因此,当您将相机旋转到一侧时,您将看不到您希望在现实世界中看到的对象——它们只是没有发送到 D3D,因为游戏不知道观察平面已经改变。
  2. 多遍渲染。许多流行的后期处理效果都是在额外的通道中完成的(通过整个场景或只是其中的一部分)。镜子和“屏幕”是最广为人知的此类效果。在不知道您正在使用什么相机的情况下,您很可能会破坏场景。

顺便说一句,#2 是立体模式不是 100% 兼容所有游戏的原因。例如,在 Source 引擎中,HDR 场景分三遍渲染,如果您不知道如何区分它们,您只会破坏游戏。看看 nVidia 是如何实现他们的立体模式的:他们为每个流行的游戏制作了一个单独的钩子,即使使用这种方法,也并不总是可以获得预期的结果。

于 2013-02-13T19:03:25.127 回答