我刚刚完成了大学二年级的游戏类(class),这一直困扰着我数学和游戏编程之间的关系。到目前为止,我一直在使用 Vectors
, Matrices
, 和 Quaternions
在游戏中,我可以理解这些如何融入游戏。
这是一个 General Question
关于实时图形的数学和编程之间的关系,我很好奇数学是多么动态。是不是所有的公式和导数都是预定义(半定义)的情况?
实时计算导数/积分是否可行?
例如,这些是我不明白它们如何适合编程/数学的一些东西。
MacLaurin/Talor Series
我可以看出这很有用,但您是否必须传递函数及其导数,或者是否可以将其传递给单个函数并让它为您计算导数?MacLaurin(sin(X)); or MacLaurin(sin(x), cos(x), -sin(x));
Derivatives /Integrals
这与第一点有关。计算y'
是在运行时动态完成的函数,还是静态完成的函数,可能是在集合函数中使用变量。f = derive(x); or f = derivedX;
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;
}
如您所料,它会打印结果 6
和 4
。尝试其他函数 f
。一个很好的练习是尝试制定允许减法、除法、三角函数等的规则。
关于c++ - 电子游戏编程中的数学,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5817491/