c++ - 电子游戏编程中的数学

标签 c++ math video-game-consoles

我刚刚完成了大学二年级的游戏类(class),这一直困扰着我数学和游戏编程之间的关系。到目前为止,我一直在使用 Vectors , Matrices , 和 Quaternions在游戏中,我可以理解这些如何融入游戏。

这是一个 General Question关于实时图形的数学和编程之间的关系,我很好奇数学是多么动态。是不是所有的公式和导数都是预定义(半定义)的情况?

实时计算导数/积分是否可行?

例如,这些是我不明白它们如何适合编程/数学的一些东西。

  1. MacLaurin/Talor Series我可以看出这很有用,但您是否必须传递函数及其导数,或者是否可以将其传递给单个函数并让它为您计算导数?

    MacLaurin(sin(X)); or MacLaurin(sin(x), cos(x), -sin(x));
    
  2. Derivatives /Integrals这与第一点有关。计算 y'是在运行时动态完成的函数,还是静态完成的函数,可能是在集合函数中使用变量。

    f = derive(x); or f = derivedX;
    
  3. Bilnear Patches我们了解到这是一种可能生成可以“缝合”在一起的小块景观的方法,这在游戏中会发生吗?我从来没有听说过这个(假设我的知识非常有限)与程序方法或其他方法一起使用。到目前为止,我所做的涉及处理顶点信息的数组。

很抱歉,如果这不是主题,但这里的社区似乎对这件事很在行。

谢谢。

最佳答案

从字面上看,Skizz 的回答是正确的,但只需要很小的改动就可以计算 C++ 函数的导数。我们修改skizz的函数f

template<class Float> f (Float x)
{
  return x * x + Float(4.0f) * x + Float(6.0f); // f(x) = x^2 + 4x + 6
}

现在可以编写一个 C++ 函数来计算 f 关于 x 的导数。这是一个完整的独立程序来计算 f 的导数。它是精确的(机器精度),因为它没有使用有限差分之类的不准确方法。我在 paper 中解释它是如何工作的我写。它推广到高阶导数。请注意,大部分工作是由编译器静态完成的。如果你打开优化,并且你的编译器内联得当,它应该和你为简单函数手写的任何东西一样快。 (有时更快!特别是,它非常擅长分摊同时计算 f 和 f' 的成本,因为与为 f 和 f' 编写单独的函数相比,它使编译器更容易发现公共(public)子表达式消除。)

using namespace std;

template<class Float>
Float f(Float x)
{
  return x * x + Float(4.0f) * x + Float(6.0f);
}

struct D
{
  D(float x0, float dx0 = 0) : x(x0), dx(dx0) { }
  float x, dx;
};

D operator+(const D &a, const D &b)
{
  // The rule for the sum of two functions.
  return D(a.x+b.x, a.dx+b.dx);
}

D operator*(const D &a, const D &b)
{
  // The usual Leibniz product rule.
  return D(a.x*b.x, a.x*b.dx+a.dx*b.x);
}

// Here's the function skizz said you couldn't write.
float d(D (*f)(D), float x) {
  return f(D(x, 1.0f)).dx;
}

int main()
{
  cout << f(0) << endl;
  // We can't just take the address of f. We need to say which instance of the
  // template we need. In this case, f<D>.
  cout << d(&f<D>, 0.0f) << endl;
}

如您所料,它会打印结果 64。尝试其他函数 f。一个很好的练习是尝试制定允许减法、除法、三角函数等的规则。

关于c++ - 电子游戏编程中的数学,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5817491/

相关文章:

确定绕圆移动的两个点是否接近或分离的算法

compiler-construction - 如何对旧游戏机进行编程?

当一个常量取另一个常量值时,C++ 常量初始化

c++ - 来自产生垃圾的文件的输入

c++ - C++ 上的函数重新声明

java - 递归和排列

c++ - 在对对象的 vector 进行排序时使用 stable_sort

math - 如何向量化方程?

c++ - 可以运行 Qt GUI 应用程序的最小 linux

batch-file - 检测击键的批处理文件。如何?